- Платформа PARTS SOFT /
- Возможности /
- Шаблоны сайта для разработчика
Шаблоны сайта для разработчика
Содержание
- Быстрый старт
- Обзор архитектуры
- Структура шаблона
- Layout: application.html.liquid
- Главная страница: home/index.liquid
- Каталог товаров: catalogs/show.liquid
- Каталог категорий: catalogs/index.liquid
- Глобальные переменные
- Кастомные Liquid-теги
- Кастомные Liquid-фильтры
- Liquid Drops (объекты данных)
- Переопределение шаблонов
- Debug-режим шаблонов
- Кэширование
- Локализация (i18n)
- Работа с меню
- Работа с баннерами
- Работа с изображениями и ассетами
- Примеры типичных задач
- Справочник Visual Settings
- Маршрутизация (URL -> шаблон)
- FAQ и решение проблем
0. Быстрый старт
Создание своего шаблона за 5 шагов
Шаг 1. Выберите системный шаблон за основу (рекомендуем system-template-00; актуальный список шаблонов смотрите в админ-панели в разделе Шаблоны сайта).
Шаг 2. В админ-панели перейдите в Шаблоны сайта (/admin/site_templates/) и создайте новый шаблон на основе выбранного.
Шаг 3. Включите debug-режим (debug_template = 1) в настройках нового шаблона. Откройте сайт и используйте View Source (Ctrl+U) -- каждый блок будет обёрнут в комментарии <!--Start template путь/к/файлу.liquid-->, показывающие какой файл за него отвечает.
Шаг 4. Переопределите нужные файлы через редактор в админ-панели. Вам не нужно переопределять все файлы -- система автоматически использует файлы из базового шаблона для тех, которые вы не тронули.
Шаг 5. Активируйте шаблон кнопкой "Установить как текущий". Для тестирования без активации используйте URL ?set_template_url={id} -- система установит cookie custom_template_id и выполнит редирект на главную страницу /. После этого все страницы будут отрендерены с выбранным шаблоном. Для сброса используйте ?reset_template_url=1.
Минимальный шаблон
Для создания шаблона с нуля вам нужны как минимум:
my-template/
├── views/
│ └── layouts/
│ └── application.html.liquid # Обязательно
├── assets/
│ └── stylesheets/
│ └── style.css # Ваши стили
└── config.json
Минимальный application.html.liquid:
<!doctype html>
<html lang="ru">
<head>
{{ favicon }}
{{ csrf_meta_tag }}
{{ seo_params }}
{{ system_javascripts }}
{{ system_include }}
{{ "style.css" | stylesheet_inline_tag: 'screen' }}
{{ site_config.head_script }}
</head>
<body>
{{ content_for_layout }}
{{ system_stylesheets }}
{{ system_search_vars }}
{{ system_template_elements }}
</body>
</html>
Важно: Файлы
layouts/application.html.liquidиhome/index.liquidне существуют в папкеdefaults/. Они должны быть определены в каждом конкретном шаблоне. Fallback на defaults работает только для остальных файлов (shared/, catalogs/, baskets/* и др.).
1. Обзор архитектуры
Что такое шаблонная система PS Base
PS Base использует движок Liquid от Shopify для рендеринга страниц интернет-магазина. Liquid -- это безопасный язык шаблонов, который позволяет разделить логику приложения и представление.
Как работает рендеринг
HTTP-запрос от посетителя
|
v
Система подготавливает данные (переменные)
|
v
Layout (application.html.liquid) -- общий каркас страницы
|
v
Шаблон страницы (home/index.liquid, catalogs/show.liquid, ...)
|
v
Include-файлы (shared/_header.liquid, shared/_footer.liquid, ...)
|
v
HTML-ответ клиенту
Приоритет загрузки шаблонов
Система ищет файл шаблона в следующем порядке:
- Ваш переопределённый файл -- если вы изменили файл через админ-панель
- Файл из базового системного шаблона -- файл из шаблона, который вы взяли за основу
- Файл из defaults -- общие файлы по умолчанию
Это означает, что вы можете переопределить любой файл, и система автоматически подхватит вашу версию. Для остальных файлов будет использоваться оригинал из базового шаблона.
Совет: После сохранения файла в админ-панели кеш инвалидируется автоматически. Если изменения не видны -- сохраните файл повторно.
2. Структура шаблона
Каждый шаблон представляет собой директорию со следующей структурой:
my-template/
├── config.json # Конфигурация шаблона
├── views/ # Liquid-шаблоны
│ ├── layouts/
│ │ └── application.html.liquid # Главный layout
│ ├── home/
│ │ └── index.liquid # Главная страница
│ ├── catalogs/
│ │ ├── show.liquid # Карточка товара
│ │ └── index.liquid # Каталог / категории
│ ├── shared/ # Переиспользуемые компоненты
│ │ ├── _top_nav.liquid
│ │ ├── _top_logo.liquid
│ │ ├── _search_panel.liquid
│ │ ├── _user_nav.liquid
│ │ ├── _foot_nav.liquid
│ │ ├── _header_contacts.liquid
│ │ └── ...
│ ├── baskets/ # Корзина
│ ├── customers/ # Личный кабинет
│ ├── news/ # Новости
│ ├── pages/ # Статические страницы
│ ├── orders/ # Заказы
│ └── ...
├── assets/ # Статические файлы
│ ├── javascripts/
│ │ └── script.js
│ └── stylesheets/
│ ├── bootstrap_core.css
│ ├── style.css
│ └── responsive.css
├── i18n/ # Переводы
│ └── ru.yml
├── menus/ # Экспорт/импорт меню (авто-генерация, не для ручного редактирования)
├── banners/ # Баннеры
├── pages/ # Статические страницы
├── options/ # Опции шаблона (JSON)
│ └── options.json
└── web_forms/ # Веб-формы
config.json
Файл конфигурации шаблона:
{
"is_one_column_template": "1",
"top_logo_file_name": "",
"footer_logo_file_name": "",
"favicon_file_name": ""
}
| Параметр | Описание |
|---|---|
is_one_column_template |
"1" -- одноколоночный layout, "0" -- с боковой панелью |
top_logo_file_name |
Имя файла логотипа в шапке |
footer_logo_file_name |
Имя файла логотипа в подвале |
favicon_file_name |
Имя файла favicon |
3. Layout: application.html.liquid
Layout -- это главный каркас страницы. Все остальные шаблоны рендерятся внутри него.
Базовая структура
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
{{ favicon }}
{{ csrf_meta_tag }}
{{ seo_params }}
{{ system_javascripts }}
{{ system_include }}
{{ "bootstrap_core.css" | stylesheet_inline_tag: 'screen, projection' }}
{{ "style.css" | stylesheet_inline_tag: 'screen, projection' }}
{{ "responsive.css" | stylesheet_inline_tag: 'screen, projection' }}
{{ site_config.head_script }}
</head>
<body>
<!-- Шапка сайта -->
<header>
{% include 'shared/_top_logo.liquid' %}
{% include 'shared/_top_nav.liquid' %}
{% include 'shared/_search_panel.liquid' %}
{% include 'shared/_user_nav.liquid' %}
{% include 'baskets/_mini.liquid' %}
</header>
<!-- Основной контент страницы -->
<main>
{{ content_for_layout }}
</main>
<!-- SEO текст -->
{{ seo_text }}
<!-- Подвал -->
<footer>
{% cache 'footer_block', 1 %}
{% include 'shared/_foot_nav.liquid' %}
{% endcache %}
</footer>
<!-- Системные элементы (обязательно в конце body) -->
{{ system_stylesheets }}
{{ "script.js" | javascript_link_tag }}
{{ current_region.footer_code }}
{{ system_search_vars }}
{{ system_template_elements }}
<style>
{{ site_config.custom_css }}
</style>
</body>
</html>
Обязательные переменные в layout
| Переменная | Где размещать | Описание |
|---|---|---|
{{ favicon }} |
<head> |
Подключение favicon |
{{ csrf_meta_tag }} |
<head> |
CSRF-токен для защиты форм |
{{ seo_params }} |
<head> |
SEO мета-теги (title, description, keywords, og-теги) |
{{ system_javascripts }} |
<head> |
Системные JavaScript-файлы |
{{ system_include }} |
<head> |
Базовые стили и Bootstrap |
{{ content_for_layout }} |
<body> |
Контент текущей страницы -- самая важная переменная |
{{ content_for_catalog_filter }} |
<body> (боковая колонка) |
Фильтры каталога -- блок фильтрации для страниц категорий. Размещается в боковой колонке (если layout двухколоночный) |
{{ seo_text }} |
<body> |
SEO-текст для текущей страницы |
{{ system_stylesheets }} |
конец <body>
|
Дополнительные системные CSS |
{{ system_search_vars }} |
конец <body>
|
Переменные для поисковой системы |
{{ system_template_elements }} |
конец <body>
|
Модальные окна, системные элементы |
Условные блоки в layout
Используйте {% if_option %} для условного отображения элементов:
{% if_option show_header_callback_block %}
{% include 'shared/_callback_block.liquid' %}
{% endif_option %}
{% if_option show_shedule %}
<div class="schedule">
{{ 'views.shared.schedule' | ft }}
</div>
{% endif_option %}
{% if_option show_footer_pay_list %}
{% include 'payment_systems/_payment_menu.liquid' %}
{% endif_option %}
{% if_option show_footer_soc %}
{% include 'social_links/_list_social.liquid' %}
{% endif_option %}
Стандартные include-файлы layout
| Файл | Назначение |
|---|---|
shared/_top_nav.liquid |
Главное навигационное меню |
shared/_top_logo.liquid |
Логотип в шапке |
shared/_search_panel.liquid |
Панель поиска по каталогу |
shared/_user_nav.liquid |
Меню пользователя (вход/регистрация/кабинет) |
shared/_header_contacts.liquid |
Контактные данные в шапке |
shared/_header_nav_catalog.liquid |
Навигация по каталогу в шапке |
shared/_mobile_nav.liquid |
Мобильное меню |
shared/_region_select.liquid |
Выбор региона/города |
shared/_foot_nav.liquid |
Навигация в подвале |
shared/_foot_logo.liquid |
Логотип в подвале |
shared/_foot_copy.liquid |
Копирайт |
shared/_foot_info.liquid |
Информация в подвале |
shared/_side_nav.liquid |
Боковое меню (для двухколоночных шаблонов) |
shared/_side_banner.liquid |
Боковой баннер |
baskets/_mini.liquid |
Мини-корзина |
shared/_auth_modal_window.liquid |
Модальное окно авторизации |
payment_systems/_payment_menu.liquid |
Способы оплаты |
social_links/_list_social.liquid |
Ссылки на соцсети |
4. Главная страница: home/index.liquid
Доступные переменные
На главной странице нет специальных переменных. Все данные загружаются через фильтры и глобальные переменные.
Типичная структура
{% cache 'main_page_cache', 1 %}
<!-- Баннер / слайдер -->
{% if_option show_main_page_banner %}
{% include 'shared/_main_page_banner.liquid' %}
{% endif_option %}
<!-- Каталог на главной -->
{% if_option show_catalog_block %}
{% include 'shared/_catalogs.liquid' %}
{% endif_option %}
<!-- Бренды -->
{% if_option show_catalog_brands %}
{% assign brands = 'to' | universal_catalog_brands | sort: 'name' %}
{% include 'shared/_brands.liquid', brands: brands %}
{% endif_option %}
<!-- Товары со скидкой -->
{% if_option show_sale_price_items_block %}
{% include 'products/_sale_price_items.liquid' %}
{% endif_option %}
<!-- Популярные товары -->
{% if_option show_top_product %}
{% include 'products/_sale_products.liquid' %}
{% endif_option %}
<!-- О компании -->
{% if_option show_about_company_block %}
{% assign main_page = 'main' | page_by_system_id %}
{% if main_page %}
<div class="about-section">
{{ main_page.content }}
</div>
{% endif %}
{% endif_option %}
<!-- Новости -->
{% if_option show_news_list_block %}
{% include 'shared/_news_list.liquid' %}
{% endif_option %}
<!-- Отзывы -->
{% include 'shared/_review.liquid' %}
{% endcache %}
Фильтры для загрузки данных на главной
| Фильтр | Пример | Что возвращает |
|---|---|---|
universal_catalog_brands |
'to' | universal_catalog_brands |
Массив брендов из универсального каталога |
original_catalog_brands |
blank | original_catalog_brands |
Массив брендов из оригинального каталога |
tecdoc_brands |
blank | tecdoc_brands: false |
Массив брендов TecDoc |
page_by_system_id |
'main' | page_by_system_id |
Страница по системному ID (для текущего региона) |
news_list |
5 | news_list |
Массив последних новостей (параметр -- количество) |
reviews_list |
10 | reviews_list |
Массив отзывов |
sale_products |
20 | sale_products |
Товары распродажи (параметр -- количество) |
sale_price_items |
20 | sale_price_items |
Товары со скидкой (параметр -- количество) |
Опции для home/index.liquid
Опция ({% if_option %}) |
Описание |
|---|---|
show_main_page_banner |
Баннер / карусель на главной |
show_main_page_banner_block |
Блок баннера |
show_catalog_block |
Блок каталога |
show_catalog_brands |
Бренды каталога |
show_popular |
Популярные товары |
show_sale_price_items_block |
Товары со скидкой |
show_top_product |
Топ товары |
show_about |
Блок "О компании" |
show_about_company_block |
Информация о компании |
show_news |
Блок новостей |
show_news_list_block |
Список новостей |
show_main_page_catalog |
Каталог товаров |
show_main_page_text_block |
Текстовый блок |
show_right_side_banner |
Баннер справа |
show_search_catalog_block |
Блок поиска по каталогу |
show_page_ico_menu |
Иконочное меню |
show_main_page_carousel |
Карусель |
5. Каталог товаров: catalogs/show.liquid
Это карточка товара -- страница с детальной информацией о конкретном товаре.
Доступные переменные
В шаблоне catalogs/show.liquid доступны следующие переменные:
Основные переменные
| Переменная | Тип | Описание |
|---|---|---|
catalog_view_drop |
CatalogViewDrop | Основной объект с данными товара |
breadcrumbs |
String (HTML) | Хлебные крошки навигации |
make_name |
String | Имя производителя (напр. "Bosch") |
oem |
String | Артикул / OEM номер |
manufacture |
ManufacturerDrop | Информация о производителе |
show_form_product_review |
Boolean | Показывать ли форму отзыва текущему пользователю |
delivery_rote_drops |
Array | Активные маршруты доставки (DeliveryRouteDrop) |
delivery_addresses |
Array | Адреса доставки текущего клиента |
default_delivery_route |
DeliveryRouteDrop | Маршрут доставки по умолчанию |
backend_stage_search_result |
String (JSON) | Результат предварительного поиска цен (если включён) |
Дополнительные переменные
| Переменная | Тип | Описание |
|---|---|---|
article_request_url |
String | URL для AJAX-запроса поиска цен |
request_uri |
String | Полный URI текущего запроса |
seo_price |
Float | Цена для SEO-микроразметки |
source_oem |
String | Исходный OEM-код из параметров запроса |
des_text |
String | Текстовое описание товара |
brand_labels |
String (JSON) | Метки замены брендов |
is_show_stock_information_eq_to_true |
Boolean | Показывать ли информацию о наличии |
recommend_products |
Array | Рекомендуемые товары (ProductDrop) |
recommend_products_images |
Hash | Изображения рекомендуемых товаров |
doc_files |
Array | Файлы документации / инструкций к товару |
local_manufacturer_info |
Drop | Информация о локальном производителе |
static_template_for_bot |
String (HTML) | Предварительно отрендеренная таблица цен для поисковых ботов |
oneprice_template_for_bot |
String (HTML) | Шаблон OnePrice для ботов |
url_for_static_template |
String | URL для получения статического шаблона (JSON) |
Отзывы и автомобили
Важно: Отзывы о товаре (
product_reviews) рендерятся в отдельном шаблонеcatalogs/product_reviews.liquid, а не в основномcatalogs/show.liquid. Вы можете переопределить этот шаблон отдельно.
Данные об автомобилях клиента доступны только через JavaScript-переменные:
window.catalogReviewAutos // JSON-массив автомобилей [{id, make_name, model}, ...] window.catalogReviewLastAutoId // ID последнего автомобиля из заказа или null
Объект catalog_view_drop
Это основной объект карточки товара. Его свойства:
<!-- Основные данные (доступны как отдельные переменные) -->
{{ make_name }} <!-- Производитель (напр. "Bosch") -->
{{ oem }} <!-- Артикул / OEM номер -->
{{ catalog_view_drop.des_text }} <!-- Название товара -->
<!-- Изображения -->
{% for image in catalog_view_drop.handled_art_images %}
<img src="{{ image.path }}" alt="{{ catalog_view_drop.get_product_alt_text }}">
{% endfor %}
<!-- Видео -->
{% for video_id in catalog_view_drop.product_video_ids %}
<!-- YouTube видео -->
{% endfor %}
{% for vk_video in catalog_view_drop.vk_video_ids %}
<!-- VK видео: vk_video[0] = owner_id, vk_video[1] = video_id -->
{% endfor %}
{{ catalog_view_drop.rutube_video_id }} <!-- RuTube видео ID -->
<!-- Характеристики -->
{% for prop in catalog_view_drop.product_propertes %}
<dt>{{ prop[0] }}</dt>
<dd>{{ prop[1] }}</dd>
{% endfor %}
<!-- Дополнительные свойства (показать если sow_remaining_propertes) -->
{% if catalog_view_drop.sow_remaining_propertes %}
{% for prop in catalog_view_drop.remaining_propertes %}
<dt>{{ prop[0] }}</dt>
<dd>{{ prop[1] }}</dd>
{% endfor %}
{% endif %}
<!-- Упаковки -->
{% for packing in catalog_view_drop.packings %}
{{ packing.oem }} -- {{ packing.des }}
{% endfor %}
<!-- Утилиты -->
{{ catalog_view_drop.get_missing_pic }} <!-- Изображение-заглушка -->
{{ catalog_view_drop.get_product_alt_text }} <!-- Alt-текст для SEO -->
{{ catalog_view_drop.more_info }} <!-- Дополнительная информация -->
<!-- Управление отображением -->
{{ catalog_view_drop.show_filter_in_left_column }} <!-- Фильтр в левой колонке -->
{{ catalog_view_drop.show_characteristic_info }} <!-- Показать характеристики -->
{{ catalog_view_drop.valid_one_price_data? }} <!-- Есть ли данные OncePrice -->
<!-- Видео контролы -->
{{ catalog_view_drop.youtube_video_control_value }} <!-- 0 или 1 -->
{{ catalog_view_drop.youtube_mute_value }} <!-- 1 или 0 -->
{{ catalog_view_drop.vk_video_control_value }} <!-- 1 или 0 -->
{{ catalog_view_drop.rutube_control_value }} <!-- 1 или 0 -->
Типичная структура catalogs/show.liquid
<div itemscope itemtype="http://schema.org/Product">
{{ breadcrumbs }}
<h1 itemprop="name">
{{ catalog_view_drop.make_name }} {{ catalog_view_drop.oem }}
{{ catalog_view_drop.des_text }}
</h1>
<!-- Фото / видео -->
{% include 'catalogs/_photo_block.liquid' %}
<!-- Характеристики -->
{% include 'catalogs/_characteristic_block.liquid',
show_form_product_review: show_form_product_review %}
<!-- Микроразметка schema.org -->
<meta itemprop="sku" content="{{ catalog_view_drop.oem }}">
<meta itemprop="mpn" content="{{ catalog_view_drop.oem }}">
<span itemprop="brand">{{ catalog_view_drop.make_name }}</span>
<!-- Таблица цен (подгружается асинхронно через JS) -->
<div class="price-data-content" data-price-url="{{ request_uri }}">
</div>
<!-- Дополнительная информация -->
{% include 'catalogs/_additional_goods_info.liquid' %}
<!-- Фильтры поиска -->
{% if_option v2_search_page_show_search_filters %}
{% include 'catalogs/_search_page_filters.liquid' %}
{% endif_option %}
<!-- Текстовые блоки -->
{% include 'catalogs/_text_block_over_search_table.liquid' %}
{% include 'catalogs/_text_block_under_search_table.liquid' %}
<!-- Инициализация JS -->
{% include 'catalogs/_initialize_catalog_price_search_js.liquid' %}
</div>
Опции для catalogs/show.liquid
Опция ({% if_option %}) |
Описание |
|---|---|
v2_search_page_show_goods_image |
Показать изображение товара |
v2_search_page_panel_show_reviews |
Показать панель отзывов |
v2_search_page_show_characteristic_info |
Показать характеристики |
v2_search_page_show_characteristic_show_more |
Кнопка "Показать ещё" в характеристиках |
v2_search_page_show_packing_info |
Показать информацию об упаковке |
v2_search_page_show_advantages_info |
Показать преимущества товара |
v2_search_page_show_best_price_block |
Показать блок лучшей цены |
v2_search_page_show_search_filters |
Показать фильтры поиска |
v2_search_page_show_widget_reviews |
Показать виджет отзывов |
v2_search_page_hide_cost_from_unregistred_users |
Скрыть цены для незарегистрированных |
Включаемые файлы catalogs/show.liquid
| Файл | Описание |
|---|---|
catalogs/_photo_block.liquid |
Карусель фото/видео товара |
catalogs/_characteristic_block.liquid |
Характеристики, рейтинг, свойства |
catalogs/_additional_goods_info.liquid |
Доп. информация, преимущества, баннеры |
catalogs/_search_page_filters.liquid |
Фильтры: бренд, статус, дата доставки, количество |
catalogs/_text_block_over_search_table.liquid |
Текстовый блок над таблицей |
catalogs/_text_block_under_search_table.liquid |
Текстовый блок под таблицей |
catalogs/_initialize_catalog_price_search_js.liquid |
JS для инициализации поиска цен |
6. Каталог категорий: catalogs/index.liquid
Страница списка категорий и товаров каталога.
Доступные переменные
| Переменная | Тип | Описание |
|---|---|---|
breadcrumbs |
String (HTML) | Хлебные крошки |
category |
ProductCategoryDrop | Текущая категория |
categories |
Array | Массив дочерних категорий |
products |
Array | Массив товаров в категории |
prices |
Hash | Цены по ключу 'make_name-oem'
|
catalog_settings |
Object | Настройки каталога |
available_seo_catalog_categories |
Array | Доступные SEO-категории |
current_seo_catalog_category |
Object | Текущая SEO-категория |
catalog_suggest |
String (HTML) | Подсказка каталога |
hide_detail_without_cost_option |
Boolean | Скрывать товары без цены |
Объект category (ProductCategoryDrop)
{{ category.catalog_code }} <!-- Код каталога -->
{{ category.has_schema }} <!-- Есть ли схема -->
{{ category.seo_text }} <!-- SEO текст категории -->
Типичная структура
{{ breadcrumbs }}
{% assign is_categories_blank = categories | is_blank %}
{% include 'catalogs/index_page_templates/_init_scripts.liquid' %}
<!-- Селектор автомобиля -->
{% include 'catalogs/index_page_templates/_catalog_auto_selector.liquid' %}
{% unless is_categories_blank %}
<!-- Если есть подкатегории -->
{% if catalog_settings.show_subcategory_as_tree %}
{% include 'catalogs/index_page_templates/_inner_table_with_tree.liquid' %}
{% else %}
{% include 'catalogs/index_page_templates/_inner_table.liquid' %}
{% endif %}
{% endunless %}
<!-- Если есть товары -->
{% if products %}
{% if category.has_schema %}
{% include 'catalogs/index_page_templates/_product_schema.liquid' %}
{% else %}
{% include 'catalogs/index_page_templates/_product_table.liquid',
show_category_description: true %}
{% endif %}
{% endif %}
<!-- SEO текст категории -->
{% if current_seo_catalog_category %}
{{ current_seo_catalog_category.seo_text }}
{% endif %}
Включаемые файлы
| Файл | Описание |
|---|---|
catalogs/index_page_templates/_init_scripts.liquid |
Инициализационные скрипты |
catalogs/index_page_templates/_catalog_auto_selector.liquid |
Выбор автомобиля |
catalogs/index_page_templates/_inner_table.liquid |
Таблица подкатегорий |
catalogs/index_page_templates/_inner_table_with_tree.liquid |
Дерево подкатегорий |
catalogs/index_page_templates/_product_schema.liquid |
Товары со схемой |
catalogs/index_page_templates/_product_table.liquid |
Таблица товаров |
catalogs/index_page_templates/_category_tree.liquid |
Дерево категорий |
catalogs/index_page_templates/_left_column.liquid |
Левая колонка с фильтрами |
catalogs/index_page_templates/_linked_filters_block.liquid |
Блок связанных фильтров |
7. Глобальные переменные
Эти переменные доступны во всех шаблонах -- и в layout, и на страницах.
Пользователь и авторизация
| Переменная | Тип | Описание |
|---|---|---|
current_customer |
CustomerDrop / nil | Текущий авторизованный покупатель. nil если не авторизован |
current_customer_guid |
String | GUID текущего покупателя (или сессии) |
authenticity_token |
String | CSRF-токен для форм |
auth_token_tag |
String (HTML) | Готовый <input type="hidden"> с CSRF-токеном |
Регион и доставка
| Переменная | Тип | Описание |
|---|---|---|
current_region |
Region | Текущий регион. Свойства: name, footer_code, id
|
current_delivery_point |
DeliveryPoint | Текущая точка доставки |
regions |
Array | Список всех доступных регионов |
regions_places |
Array | Информация о филиалах и городах |
region_selector |
RegionSelectorDrop | Объект для выбора региона |
show_select_region_dialog |
Boolean | Показать ли диалог выбора региона |
Конфигурация сайта
site_config (SiteConfig)
Глобальная конфигурация сайта. Настраивается в админ-панели. Доступные свойства:
Скрипты и стили (вставляются администратором через админ-панель):
{{ site_config.head_script }} <!-- Скрипт в <head> (аналитика, метрики) -->
{{ site_config.top_script }} <!-- Скрипт в начало <body> -->
{{ site_config.bottom_script }} <!-- Скрипт в конец <body> -->
<style>{{ site_config.custom_css }}</style> <!-- Кастомные CSS-стили -->
Хост и протокол:
{{ site_config.host_name }} <!-- Основной адрес сайта (напр. "myshop.ru") -->
{{ site_config.www_host }} <!-- Полный адрес с протоколом -->
{{ site_config.protocol }} <!-- "http" или "https" -->
{{ site_config.admin_host }} <!-- Адрес админ-панели -->
Настройки отображения:
| Свойство | Тип | Описание |
|---|---|---|
enable_region_select |
Boolean | Показывать выбор региона |
is_subdomain_region |
Boolean | Поддомены для регионов |
enable_delivery_point_select? |
Boolean | Выбор пункта доставки |
dont_show_cents? |
Boolean | Скрывать копейки в ценах |
default_currency |
String | Валюта по умолчанию |
show_stock_information |
String | Показывать наличие на складе |
limit_qnt_when_ordering |
Integer | Лимит количества при заказе |
enable_select_currency_in_search |
Boolean | Выбор валюты в поиске |
show_send_news_emailing_checkbox |
Boolean | Чекбокс подписки на новости |
yandex_maps_api_key |
String | API-ключ Яндекс.Карт |
Бонусы за отзывы о товарах:
| Свойство | Описание |
|---|---|
bonus_for_stars_product_review |
Бонусы за оценку (рейтинг) |
bonus_for_product_review_text |
Бонусы за текстовый отзыв |
bonus_for_product_review_text_min_length |
Минимальная длина текста для бонуса |
bonus_for_product_review_photo |
Бонусы за фото |
bonus_for_product_review_photo_min_count |
Минимальное кол-во фото |
bonus_for_product_review_auto |
Бонусы за привязку к авто |
Пример использования в layout:
<head>
{{ site_config.head_script }}
</head>
<body>
{{ site_config.top_script }}
<!-- ... контент ... -->
{{ site_config.bottom_script }}
<style>{{ site_config.custom_css }}</style>
</body>
setting (глобальные настройки)
Хеш всех записей из таблицы Setting. Каждое значение -- объект SettingDrop с полями code, value, title.
<!-- Доступ к значению настройки по коду -->
{% if setting['show-frame'].value == '1' %}
<!-- показать фрейм -->
{% endif %}
{{ setting['admin-email'].value }} <!-- Email администратора -->
Примечание: Некоторые часто используемые настройки уже доступны как отдельные переменные:
main_host,mlm_enable,enable_v3_search_engineи др.
current_template (SiteTemplate)
Текущий шаблон сайта. В Liquid экспортированы только 4 свойства -- файлы логотипов:
<!-- Логотипы шаблона -->
{% if current_template.top_logo_file_name != blank %}
<img src="{{ current_template.top_logo_file_name | asset_url }}" alt="Логотип">
{% endif %}
{% if current_template.footer_logo_file_name != blank %}
<img src="{{ current_template.footer_logo_file_name | asset_url }}" alt="Логотип">
{% endif %}
{{ current_template.favicon_file_name }} <!-- Favicon -->
{{ current_template.logo_mail_file_name }} <!-- Логотип для email -->
Внимание: Свойства
nameиcodeшаблона не доступны в Liquid. Доступны только четыре свойства выше, а также кастомные поля видаcustom_field_1,custom_field_2и т.д.
current_template_options (опции шаблона)
Хеш опций текущего шаблона. Опции определяются в файле options/options.json и редактируются в админ-панели в настройках шаблона.
Формат options.json:
[
{
"field_type": "checkbox",
"name": "show_catalog_block",
"label": "Показывать блок каталога",
"value": "true"
},
{
"field_type": "string",
"name": "footer_name_company",
"label": "Название компании в подвале",
"value": "Моя компания"
},
{
"field_type": "select_tag",
"name": "catalog_brands",
"label": "Тип каталога брендов",
"options": [
{ "name": "Оригинальные каталоги", "value": "original_catalogs" },
{ "name": "Каталог ТО", "value": "to_catalog" },
{ "name": "TecDoc", "value": "tecdoc" }
],
"value": "original_catalogs"
}
]
Типы полей:
| field_type | Описание | Значение |
|---|---|---|
checkbox |
Флажок вкл/выкл |
"true" или "false"
|
string |
Текстовое поле | Произвольная строка |
select_tag |
Выпадающий список | Одно из значений options[].value
|
Способы использования в шаблонах:
<!-- Способ 1: через тег if_option (для checkbox) -->
{% if_option show_catalog_block %}
{% include 'shared/_catalog.liquid' %}
{% else %}
<!-- альтернативный контент -->
{% endif_option %}
<!-- Способ 2: получение значения напрямую -->
{% assign catalog_type = current_template_options.catalog_brands %}
{% if catalog_type == 'original_catalogs' %}
{% assign brands = blank | original_catalog_brands | sort: 'name' %}
{% elsif catalog_type == 'to_catalog' %}
{% assign brands = 'to' | universal_catalog_brands | sort: 'name' %}
{% else %}
{% assign brands = blank | tecdoc_brands: false %}
{% endif %}
<!-- Способ 3: получение текстового значения -->
{% assign company_name = current_template_options.footer_name_company %}
<span>© {{ company_name }} {{ "now" | date: "%Y" }}</span>
Стандартные опции (из system-template-00):
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
show_header_callback_block |
checkbox | true | Блок "Перезвоним" в шапке |
show_catalog_block |
checkbox | true | Блок каталогов на главной |
show_vin_search |
checkbox | true | Поиск по VIN |
show_popular |
checkbox | true | Топ товары |
show_sale_price_item |
checkbox | false | Товары из прайсов |
show_about |
checkbox | true | Блок "О компании" |
show_news |
checkbox | true | Блок новостей |
show_reviews |
checkbox | false | Блок отзывов |
show_create_reviews |
checkbox | false | Создание отзыва |
show_footer_pay_list |
checkbox | true | Способы оплаты в подвале |
show_footer_callback_block |
checkbox | true | Блок обратного звонка в подвале |
show_copyright |
checkbox | true | Копирайт |
show_site_copyright |
checkbox | true | Копирайт сайта |
show_footer_soc |
checkbox | true | Соцсети в подвале |
catalog_brands |
select_tag | original_catalogs | Тип каталога брендов |
footer_name_company |
string | -- | Название компании в подвале |
Корзина
| Переменная | Тип | Описание |
|---|---|---|
basket |
BasketDrop | Объект корзины |
basket.basket_qnt |
Integer | Количество товаров в корзине |
basket.basket_sum |
Decimal | Сумма корзины |
basket.active_basket_sum |
Decimal | Сумма активных позиций корзины |
basket.basket_items |
Array | Элементы корзины |
Запрос и навигация
| Переменная | Тип | Описание |
|---|---|---|
params |
Hash | Параметры текущего запроса (GET/POST) |
host |
String | Хост с портом |
current_path |
String | Путь запроса (напр. /products/Bosch/1457429261) |
current_fullpath |
String | Полный путь с query string |
Примечание о cookies: Куки браузера недоступны напрямую как переменная
{{ cookies }}. Для доступа к кукам используйте фильтрcookie_by_code:{% assign theme = 'dark_mode' | cookie_by_code %}
Локализация
| Переменная | Тип | Описание |
|---|---|---|
i18n_locale |
Symbol | Текущая локаль (:ru, :en и др.) |
i18n_default_locale |
Symbol | Локаль по умолчанию |
current_locale |
Symbol | Текущая локаль (алиас) |
SEO и контент
| Переменная | Тип | Описание |
|---|---|---|
seo_text |
String (HTML) | SEO-текст для текущей страницы |
flash |
Hash | Flash-сообщения: flash.notice, flash.error
|
Валюта
| Переменная | Тип | Описание |
|---|---|---|
current_currency |
String | Код текущей валюты (напр. "RUB", "USD") |
currency_i18n_path |
String | Путь i18n для текущей валюты |
Социальные сети
| Переменная | Тип | Описание |
|---|---|---|
social_links |
SocialLinkDrop | Социальные ссылки сайта |
Системные переменные
| Переменная | Тип | Описание |
|---|---|---|
rails_env |
String | Окружение: production, development, test
|
main_host |
String | Основной хост сайта |
is_web_app |
Boolean | Работает ли как веб-приложение |
mlm_enable |
String | Включена ли MLM-система |
enable_lk_v2 |
Boolean | Личный кабинет v2 |
enable_lk_v3 |
Boolean | Личный кабинет v3 |
enable_v3_search_engine |
Boolean | Поисковый движок v3 |
Интеграции (системные JS/CSS)
| Переменная | Описание |
|---|---|
laximo_system_js |
JS для каталога Laximo |
laximo_system_css |
CSS для каталога Laximo |
tecdoc_system_js |
JS для каталога TecDoc |
tecdoc_system_css |
CSS для каталога TecDoc |
yandex_maps_api_key |
API-ключ Яндекс.Карт |
yandex_maps_js |
JS Яндекс.Карт |
jqplot_system_js |
JS для графиков jqPlot |
avail_catalog_js |
JS для каталога наличия |
ps_personal_account_system_js |
JS личного кабинета |
ps_personal_account_system_css |
CSS личного кабинета |
recaptcha_form |
HTML рекаптчи |
8. Кастомные Liquid-теги
PS Base расширяет стандартный Liquid четырьмя кастомными тегами.
{% if_option %}
Условное отображение на основе опций шаблона или Visual Settings.
{% if_option show_banner %}
<div class="banner">Баннер отображается</div>
{% else %}
<p>Баннер скрыт</p>
{% endif_option %}
Как работает: Проверяет значение в двух источниках (по порядку):
-
current_template_options[имя_опции]-- опции текущего шаблона (изoptions.json). Условие истинно если значение строго равно"true" -
visual_setting.vs_bool(имя_опции)-- глобальные визуальные настройки из БД
Важно: В
current_template_optionsпроверяется только строка"true". Значения"1","yes",true(не строка) не сработают. Убедитесь, что вoptions.jsonиспользуете именно"true".
{% unless_option %}
Показывает контент, когда опция явно установлена в "false".
{% unless_option show_extended_footer %}
<footer class="simple">Простой подвал</footer>
{% endunless_option %}
Внимание:
unless_optionне является логической противоположностьюif_option. Он проверяет толькоcurrent_template_options(не Visual Settings) и показывает контент лишь когда значение строго равно"false". Если опция не задана (nil) или имеет другое значение -- контент не отобразится. Для надёжной инверсии условия используйте{% if_option %}...{% else %}...{% endif_option %}.
{% cache %}
Кэширование блока контента.
{% cache 'имя_кеша', часы_жизни %}
<!-- Этот контент будет закеширован -->
{% include 'shared/_heavy_component.liquid' %}
{% endcache %}
Параметры:
- Первый аргумент -- уникальный ключ кеша (строка)
- Второй аргумент -- время жизни в часах (число)
Особенности:
- Кеш автоматически учитывает контекст: локаль, регион, точку доставки, текущего пользователя. Один и тот же блок
{% cache %}будет иметь разное содержимое для разных регионов/языков - Кеширование работает только если
enable_cache = '1'в настройках шаблона
Пример:
{% cache 'footer_block', 1 %}
<!-- Подвал кешируется на 1 час с учётом региона и языка -->
{% include 'shared/_foot_nav.liquid' %}
{% include 'shared/_foot_info.liquid' %}
{% endcache %}
{% cache 'main_page_cache', 1 %}
<!-- Вся главная кешируется на 1 час -->
{% endcache %}
{% long_general_cache %}
Упрощённый кеш без привязки к контексту пользователя.
{% long_general_cache 'static_content', 24 %}
<!-- Кешируется на 24 часа для всех пользователей одинаково -->
<div class="static-block">...</div>
{% endlong_general_cache %}
Отличие от {% cache %}:
- Не учитывает пользователя, регион, локаль
- Подходит для контента, одинакового для всех посетителей
9. Кастомные Liquid-фильтры
PS Base предоставляет более 40 фильтр-модулей. Ниже описаны наиболее важные.
Визуальные настройки (VisualSettings)
<!-- Получить Boolean-значение настройки -->
{% assign show_banner = 'show_main_banner' | vs_bool %}
{% if show_banner %}...{% endif %}
<!-- Получить текстовое значение -->
{% assign phone = 'header_phone_number' | vs_value %}
<span>{{ phone }}</span>
<!-- Получить URL изображения -->
<img src="{{ 'header_logo' | vs_img_url }}" alt="Logo">
<!-- Получить значение если не пустое -->
{% assign title = 'custom_title' | vs_value_not_blank %}
| Фильтр | Описание |
|---|---|
vs_bool |
Возвращает true/false для Visual Setting |
vs_value |
Возвращает строковое значение Visual Setting |
vs_img_url |
Возвращает URL изображения из Visual Setting |
vs_value_not_blank |
Возвращает значение, только если оно не пустое |
CSS и JavaScript
<!-- Подключить CSS из шаблона (inline) -->
{{ "style.css" | stylesheet_inline_tag: 'screen, projection' }}
{{ "responsive.css" | stylesheet_inline_tag: 'screen' }}
<!-- Подключить JS из шаблона -->
{{ "script.js" | javascript_link_tag }}
<!-- Получить URL ассета шаблона -->
<img src="{{ 'images/logo.png' | asset_url }}">
| Фильтр | Описание |
|---|---|
stylesheet_inline_tag |
Подключает CSS из assets шаблона |
javascript_link_tag |
Подключает JS из assets шаблона |
asset_url |
URL файла из assets шаблона |
Локализация
<!-- Перевести строку -->
{{ 'views.shared.cart' | ft }}
{{ 'system-template-21.user_nav.cabinet' | ft }}
<!-- С областью видимости -->
{{ 'cart_title' | ft: scope: 'views.baskets' }}
| Фильтр | Описание |
|---|---|
ft |
Найти перевод (find translation). Ищет в i18n файлах шаблона |
Меню
<!-- Загрузить меню по коду (меню создаётся в админ-панели /admin/menus/) -->
{% assign topMenu = 'topNavMenu' | menu_by_code %}
{% for item in topMenu %}
<a href="{{ item.url }}" target="{{ item.target_type }}" style="{{ item.css_style }}"
{{ item.html_attribute }}>
{{ item.name }}
</a>
{% if item.childrens %}
<ul>
{% for child in item.childrens %}
<li><a href="{{ child.url }}">{{ child.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
{% endfor %}
<!-- Найти элемент меню по коду -->
{% assign home_item = topMenu | menu_item_by_code: 'home' %}
<!-- Получить иконку элемента меню (SVG inline или base64) -->
{{ item.id | menu_item_icon_content }}
| Фильтр | Описание |
|---|---|
menu_by_code |
Массив элементов меню по коду. Учитывает регион, локаль и авторизацию. Кешируется на 10 мин |
menu_item_by_code |
Найти элемент меню в массиве по его коду |
menu_item_icon_content |
Содержимое иконки: SVG inline или base64 для растровых изображений |
Страницы
<!-- Загрузить страницу по системному ID -->
{% assign about_page = 'about' | page_by_system_id %}
{% if about_page %}
<h2>{{ about_page.title }}</h2>
<div>{{ about_page.content }}</div>
{% endif %}
| Фильтр | Описание |
|---|---|
page_by_system_id |
Загружает страницу (Page) по системному ID для текущего региона |
Баннеры
<!-- Загрузить баннер по коду -->
{% assign main_banner = 'main_slider' | banner_by_code %}
<!-- Баннеры на странице поиска -->
{% assign search_banners = '' | search_page_banners %}
| Фильтр | Описание |
|---|---|
banner_by_code |
Загружает баннер по коду |
search_page_banners |
Баннеры для страницы поиска |
Новости и отзывы
<!-- Загрузить новости -->
{% assign news = 5 | news_list %}
{% for item in news %}
<h3>{{ item.title }}</h3>
<p>{{ item.short_body }}</p>
{% endfor %}
<!-- Загрузить отзывы -->
{% assign reviews = 10 | reviews_list %}
<!-- Отзывы о товаре (требуют make_name и oem) -->
{% assign product_reviews = make_name | all_product_reviews: oem %}
{% assign reviews_count = oem | count_product_reviews: make_name %}
{% assign avg_rating = oem | product_review_average_rate: make_name %}
{% assign avg_rating_make = make_name | product_review_average_rate_make %}
{% assign show_review_form = current_customer | show_form_review: oem, make_name %}
<!-- Фото из отзывов -->
{% assign all_photos = make_name | all_photo_product_reviews: oem %}
{% assign review_photos = product_review.id | photo_product_reviews %}
<!-- Статистика по оценкам -->
{% assign review_counts = 'all' | count_reviews_by_rate: make_name, oem %}
{% assign total_by_make = make_name | count_make_name_reviews %}
| Фильтр | Сигнатура | Описание |
|---|---|---|
news_list |
count | news_list |
Список новостей (параметр -- количество) |
reviews_list |
count | reviews_list |
Список отзывов |
all_product_reviews |
make_name | all_product_reviews: oem, sort_by |
Все отзывы о товаре (sort_by: 'new' по умолч.) |
count_product_reviews |
oem | count_product_reviews: make_name |
Количество отзывов о товаре |
count_make_name_reviews |
make_name | count_make_name_reviews |
Количество отзывов по бренду |
count_reviews_by_rate |
rate | count_reviews_by_rate: make_name, oem |
Статистика по оценкам ('all' -- массив из 5) |
product_review_average_rate |
oem | product_review_average_rate: make_name |
Средний рейтинг товара |
product_review_average_rate_make |
make_name | product_review_average_rate_make |
Средний рейтинг бренда |
all_photo_product_reviews |
make_name | all_photo_product_reviews: oem |
Все фото из отзывов |
photo_product_reviews |
review_id | photo_product_reviews |
Фото конкретного отзыва |
show_form_review |
customer | show_form_review: oem, make_name |
Показывать ли форму отзыва |
Каталоги и товары
<!-- Бренды из разных каталогов -->
{% assign uc_brands = 'to' | universal_catalog_brands | sort: 'name' %}
{% assign oc_brands = blank | original_catalog_brands | sort: 'name' %}
{% assign td_brands = blank | tecdoc_brands: false %}
<!-- Товары -->
{% assign sale = 10 | sale_products %}
{% assign discounted = 20 | sale_price_items %}
<!-- Параметры товара -->
{% assign product_params = product | get_product_params %}
| Фильтр | Описание |
|---|---|
universal_catalog_brands |
Бренды универсального каталога |
original_catalog_brands |
Бренды оригинального каталога |
tecdoc_brands |
Бренды TecDoc |
sale_products |
Товары распродажи. Вызов: 20 | sale_products (число -- количество) |
sale_price_items |
Товары со скидкой. Вызов: 20 | sale_price_items (число -- количество) |
get_product_params |
Параметры товара |
product_photo |
URL фото товара |
Утилиты
<!-- Работа с переменными -->
{% assign val = var1 | variable: var2 %} <!-- var1 || var2 -->
{% assign eq = var1 | equal: var2 %} <!-- var1 == var2 -->
{% assign neq = var1 | not_equal: var2 %} <!-- var1 != var2 -->
{% assign result = var1 | or: var2 %} <!-- логический OR -->
{% assign is_nil = object | nil %} <!-- object == nil -->
{% assign exists = object | present %} <!-- object.present? -->
{% assign is_empty = object | empty %} <!-- object.empty? -->
{% assign has = array | include: item %} <!-- array.include?(item) -->
<!-- Работа с хешами -->
{% assign val = 'key' | hash_value: my_hash %}
<!-- Форматирование -->
{{ price | number_to_currency: 'precision:2' }}
{{ date | date_convert }} <!-- dd.mm.yyyy -->
{{ big_number | number_with_zero_precision_and_space_delimiter }}
{{ amount | money }} <!-- число с 2 знаками -->
<!-- HTML -->
{{ 'path/to/image.jpg' | image_tag: width: 200, height: 200 }}
{{ text | escape_html }}
<!-- Куки -->
{% assign theme = 'dark_mode' | cookie_by_code %}
<!-- JSON -->
{{ object | to_json }}
<!-- Регулярные выражения -->
{{ text | regex_replace: '\d+', 'NUM' }}
<!-- URL товара -->
{% assign url = '' | get_catalog_item_url: oem: product.oem, make_name: product.make_name %}
<!-- Проверка на пустоту -->
{% assign not_empty = value | is_not_blank %}
{% assign is_empty = value | is_blank %}
<!-- Markdown -->
{{ markdown_text | markdown }}
Совет: Все фильтры, описанные выше, сгруппированы по назначению: визуальные настройки, CSS/JS, локализация, меню, страницы, баннеры, новости, отзывы, каталоги, утилиты. Если вам нужен фильтр, которого нет в документации, обратитесь к нашей технической поддержке.
10. Liquid Drops (объекты данных)
Drops -- это объекты данных, доступные в Liquid-шаблонах. Система предоставляет более 70 типов таких объектов.
Основные Drops
BasketDrop (корзина)
{{ basket.basket_qnt }} <!-- Количество товаров -->
{{ basket.basket_sum }} <!-- Сумма корзины -->
{{ basket.active_basket_sum }} <!-- Сумма активных позиций -->
{{ basket.basket_items }} <!-- Элементы корзины (массив) -->
CatalogViewDrop (карточка товара)
{{ catalog_view_drop.des_text }} <!-- Название товара -->
{{ catalog_view_drop.handled_art_images }} <!-- Массив изображений -->
{{ catalog_view_drop.product_propertes }} <!-- Характеристики (массив пар) -->
{{ catalog_view_drop.remaining_propertes }} <!-- Остальные свойства -->
{{ catalog_view_drop.sow_remaining_propertes }} <!-- Показывать остальные свойства -->
{{ catalog_view_drop.packings }} <!-- Упаковки -->
{{ catalog_view_drop.more_info }} <!-- Доп. информация -->
{{ catalog_view_drop.product_video_ids }} <!-- YouTube видео (массив ID) -->
{{ catalog_view_drop.vk_video_ids }} <!-- VK видео (массив пар) -->
{{ catalog_view_drop.rutube_video_id }} <!-- RuTube видео ID -->
{{ catalog_view_drop.get_missing_pic }} <!-- URL изображения-заглушки -->
{{ catalog_view_drop.get_product_alt_text }} <!-- Alt-текст для SEO -->
{{ catalog_view_drop.show_filter_in_left_column }} <!-- Фильтр в левой колонке -->
{{ catalog_view_drop.show_characteristic_info }} <!-- Показать характеристики -->
{{ catalog_view_drop.valid_one_price_data? }} <!-- Есть данные OncePrice -->
Примечание: Свойства
oemиmake_nameдоступны как черезcatalog_view_drop.oem/catalog_view_drop.make_name, так и как отдельные переменные{{ oem }}/{{ make_name }}.
ProductCategoryDrop (категория товаров)
<!-- Основные свойства -->
{{ category.id }} <!-- ID категории -->
{{ category.name }} <!-- Название -->
{{ category.slug }} <!-- URL-совместимый slug -->
{{ category.catalog_code }} <!-- Код каталога -->
{{ category.description }} <!-- Описание -->
{{ category.short_description }} <!-- Краткое описание -->
{{ category.seo_text }} <!-- SEO текст -->
{{ category.position }} <!-- Позиция сортировки -->
{{ category.active }} <!-- Активна ли -->
<!-- Навигация -->
{{ category.path }} <!-- Полный путь -->
{{ category.friendly_id }} <!-- Человекочитаемый ID -->
{{ category.sub_url }} <!-- URL подкатегории -->
{{ category.custom_url }} <!-- Кастомный URL -->
{{ category.parent }} <!-- Родительская категория -->
{{ category.childrens }} <!-- Массив дочерних категорий -->
{{ category.has_children? }} <!-- Есть ли дочерние -->
<!-- Изображения и схемы -->
{{ category.logo }} <!-- Логотип -->
{{ category.get_logo_url }} <!-- URL логотипа -->
{{ category.is_logo_blank }} <!-- Нет логотипа? -->
{{ category.has_schema }} <!-- Есть ли схема -->
{{ category.get_scheme_url }} <!-- URL схемы -->
<!-- Дополнительные поля -->
{{ category.tecdoc_category_id }} <!-- ID категории TecDoc -->
{{ category.options_1 }} <!-- Доп. поле 1 -->
{{ category.options_2 }} <!-- Доп. поле 2 -->
{{ category.options_3 }} <!-- Доп. поле 3 -->
{{ category.options_4 }} <!-- Доп. поле 4 -->
{{ category.options_5 }} <!-- Доп. поле 5 -->
RegionSelectorDrop (выбор региона)
Используется в модуле выбора региона.
SocialLinkDrop (соцсети)
{{ social_links.vk_url }} <!-- VK -->
{{ social_links.fb_url }} <!-- Facebook -->
{{ social_links.ok_url }} <!-- Одноклассники -->
{{ social_links.instagram_url }} <!-- Instagram -->
{{ social_links.telegram_url }} <!-- Telegram -->
{{ social_links.youtube_url }} <!-- YouTube -->
{{ social_links.tw_url }} <!-- Twitter -->
{{ social_links.whatsup_url }} <!-- WhatsApp -->
{{ social_links.viber_url }} <!-- Viber -->
{{ social_links.max_url }} <!-- MAX -->
Элемент меню (возвращается из menu_by_code)
{{ item.name }} <!-- Название -->
{{ item.url }} <!-- URL -->
{{ item.code }} <!-- Код элемента -->
{{ item.description }} <!-- Описание -->
{{ item.target_type }} <!-- Тип открытия (_blank, _self) -->
{{ item.css_style }} <!-- Инлайн CSS-стили -->
{{ item.html_attribute }} <!-- Дополнительные HTML-атрибуты -->
{{ item.icon }} <!-- URL иконки -->
{{ item.childrens }} <!-- Дочерние элементы (массив) -->
{{ item.id }} <!-- ID -->
Другие объекты данных
Многие объекты системы (заказы, накладные, счета и др.) также доступны в соответствующих шаблонах. Например, в шаблонах заказов:
{{ order.order_id }}
{{ order.customer.full_name }}
{{ order.full_sum | number_to_currency }}
Набор доступных свойств зависит от конкретного объекта. Используйте debug-режим и существующие системные шаблоны как справочник.
11. Переопределение шаблонов
Как клиент может создать свой шаблон
Способ 1: Через админ-панель (рекомендуемый)
- Войдите в админ-панель:
/admin/site_templates/ - Создайте новый шаблон или выберите существующий
- Откройте редактор страниц шаблона
- Измените нужные файлы (Liquid, CSS, JS)
- Сохраните -- система автоматически пометит файл как изменённый
Способ 2: Загрузка ZIP-архива
Подготовьте архив со структурой шаблона и загрузите через админ-панель:
my-template.zip
├── views/
│ ├── layouts/
│ │ └── application.html.liquid
│ ├── home/
│ │ └── index.liquid
│ └── shared/
│ └── _header.liquid
├── assets/
│ ├── stylesheets/
│ │ └── style.scss # Импортер читает .scss файлы!
│ └── javascripts/
│ └── script.js
├── options/
│ └── options.json
└── i18n/
└── ru.yml
Важно о стилях в ZIP: При загрузке ZIP-архива система ищет файлы стилей с расширением
.scss(не.css). После импорта они будут доступны в админ-панели как.css. Поэтому в архиве используйте.scss, а в шаблонах подключайте какstyle.css.
Какие файлы можно переопределить
Вы можете переопределить любой файл шаблона. Наиболее частые случаи:
| Файл | Что меняете |
|---|---|
layouts/application.html.liquid |
Общий каркас всех страниц |
home/index.liquid |
Главная страница |
shared/_top_nav.liquid |
Навигация в шапке |
shared/_top_logo.liquid |
Логотип |
shared/_foot_nav.liquid |
Подвал |
shared/_search_panel.liquid |
Панель поиска |
catalogs/show.liquid |
Карточка товара |
Механизм _before и _after
Для каждого шаблона можно создать файлы _before и _after, которые добавляют контент до и после основного шаблона. Суффикс добавляется к имени файла перед расширением:
views/home/index_before.liquid -- добавится ПЕРЕД home/index.liquid
views/home/index_after.liquid -- добавится ПОСЛЕ home/index.liquid
Ещё примеры:
views/shared/_top_nav_before.liquid -- перед shared/_top_nav.liquid
views/shared/_top_nav_after.liquid -- после shared/_top_nav.liquid
views/catalogs/show_before.liquid -- перед catalogs/show.liquid
views/catalogs/show_after.liquid -- после catalogs/show.liquid
Формула: для файла
путь/имя.liquidфайлы будутпуть/имя_before.liquidипуть/имя_after.liquid
Это позволяет расширять шаблоны, не переопределяя их полностью.
Активация шаблона
Админ-панель → Шаблоны сайта → Выбрать шаблон → Установить как текущий
Также можно временно переключать шаблон через cookie:
- Установка:
?set_template_url={id} - Сброс:
?reset_template_url={id}
12. Debug-режим шаблонов
Включение debug-режима
В админ-панели перейдите в настройки шаблона и установите параметр debug_template в 1.
Что делает debug-режим
При включении debug-режима каждый включаемый файл оборачивается в HTML-комментарии:
<!--Start template shared/_top_nav.liquid-->
<nav class="top-nav">
...
</nav>
<!--End template shared/_top_nav.liquid-->
<!--Start template shared/_search_panel.liquid-->
<div class="search-panel">
...
</div>
<!--End template shared/_search_panel.liquid-->
Как использовать
- Включите debug-режим в настройках шаблона
- Откройте страницу в браузере
- Откройте Инструменты разработчика (F12)
- Перейдите на вкладку Elements или используйте View Source (Ctrl+U)
- Ищите комментарии
<!--Start template ...-->и<!--End template ...--> - Это покажет, из какого файла рендерится каждый блок HTML
Пример вывода в debug-режиме
<!--Start template layouts/application.html.liquid-->
<!doctype html>
<html>
<head>...</head>
<body>
<!--Start template shared/_top_logo.liquid-->
<div class="logo">...</div>
<!--End template shared/_top_logo.liquid-->
<!--Start template shared/_top_nav.liquid-->
<nav>...</nav>
<!--End template shared/_top_nav.liquid-->
<!--Start template home/index.liquid-->
<div class="main-content">...</div>
<!--End template home/index.liquid-->
<!--Start template shared/_foot_nav.liquid-->
<footer>...</footer>
<!--End template shared/_foot_nav.liquid-->
</body>
</html>
<!--End template layouts/application.html.liquid-->
Сброс кеша
После сохранения файла в админ-панели кеш сбрасывается автоматически. Если изменения не видны -- сохраните файл повторно.
13. Кэширование
Как работает кеш
Система использует многоуровневое кеширование для быстрой работы сайта. Для вас как верстальщика важно знать:
- При сохранении файла через админ-панель кеш сбрасывается автоматически
-
Блоки
{% cache %}в ваших шаблонах кешируются на указанное время (в часах) - Кеш
{% cache %}учитывает регион, язык и пользователя -- одинаковый блок может иметь разное содержимое в разных контекстах
Рекомендации по кешированию
<!-- Кешируйте тяжёлые блоки -->
{% cache 'heavy_catalog_block', 1 %}
{% assign brands = 'to' | universal_catalog_brands | sort: 'name' %}
{% for brand in brands %}
<div class="brand">{{ brand.name }}</div>
{% endfor %}
{% endcache %}
<!-- НЕ кешируйте блоки с персональными данными -->
<!-- Корзина, имя пользователя, персональные цены -->
<div class="user-panel">
{{ current_customer.full_name }} <!-- НЕ кешировать! -->
</div>
14. Локализация (i18n)
Структура файлов переводов
i18n/
└── ru.yml
Пример ru.yml:
ru:
system-template-01:
top_nav:
home: "Главная"
catalog: "Каталог"
contacts: "Контакты"
user_nav:
login: "Вход"
register: "Регистрация"
cabinet: "Личный кабинет"
logout: "Выход"
footer:
copyright: "Все права защищены"
Использование в шаблонах
<!-- Полный путь к ключу -->
{{ 'system-template-01.top_nav.home' | ft }}
<!-- С указанием scope -->
{{ 'home' | ft: scope: 'system-template-01.top_nav' }}
Рекомендации
- Всегда используйте фильтр
ftвместо жёстко закодированного текста - Группируйте ключи по компонентам
- Поддерживайте все языки, используемые клиентами
15. Работа с меню
Создание и управление меню
Меню создаётся и управляется через админ-панель (/admin/menus/). Каждое меню имеет уникальный код (только латиница и дефис, например topNavMenu, footerMenu), по которому оно вызывается в шаблонах.
Порядок работы:
- В админ-панели перейдите в Меню (
/admin/menus/) - Создайте новое меню, задав название и уникальный код (например
topNavMenu) - Установите флаг Активно
- Добавьте пункты меню -- каждый пункт имеет название, URL и опциональные настройки
- Пункты меню поддерживают вложенность (многоуровневое дерево)
- Используйте код меню в Liquid-шаблоне через фильтр
menu_by_code
Свойства меню (Menu):
| Поле | Описание |
|---|---|
name |
Название меню (для админ-панели) |
code |
Уникальный код меню (только [a-zA-Z\-]+). Этот код используется в шаблонах |
active |
Флаг активности. Неактивные меню не отображаются |
Свойства пункта меню (MenuItem):
| Поле | Описание |
|---|---|
name |
Название пункта (обязательное) |
url |
URL ссылки |
code |
Код элемента (опционально, только [a-zA-Z]+) |
position |
Порядок сортировки |
region_id |
Привязка к региону (если nil -- показывается во всех регионах) |
locale |
Привязка к языку (если пустая -- показывается для всех локалей) |
css_style |
Инлайн CSS-стили |
target_type |
Тип открытия ссылки: _self, _blank и др. |
html_attribute |
Дополнительные HTML-атрибуты (rel, data-* и т.п.) |
description |
Описание элемента |
require_auth |
Показывать только авторизованным пользователям ("1" = да) |
icon |
Загруженная иконка (PNG, JPEG, GIF, SVG) |
Фильтрация пунктов меню
Фильтр menu_by_code автоматически фильтрует элементы на основе текущего контекста:
-
По региону -- показываются элементы с
region_id = nil(для всех) или совпадающим с текущим регионом -
По локали -- показываются элементы с пустой
localeили совпадающей с текущей -
По авторизации -- элементы с
require_auth = "1"скрываются для неавторизованных посетителей
Кеширование меню
Результат menu_by_code кешируется на 10 минут. Кеш учитывает: код меню, регион, локаль и статус авторизации. Кеш сбрасывается автоматически при сохранении меню или его элементов в админ-панели.
Примечание: Папка
menus/в структуре шаблона используется только для автоматического экспорта/импорта при переносе шаблонов. Вручную эти файлы редактировать не нужно -- управляйте меню через админ-панель.
Использование в шаблонах
<!-- Загрузить меню по его коду -->
{% assign main_menu = 'topNavMenu' | menu_by_code %}
<!-- Отобразить с поддержкой вложенности -->
<nav>
<ul class="main-menu">
{% for item in main_menu %}
<li class="menu-item {% if item.childrens %}has-children{% endif %}">
<a href="{{ item.url }}"
target="{{ item.target_type }}"
style="{{ item.css_style }}"
{{ item.html_attribute }}>
{{ item.id | menu_item_icon_content }}
{{ item.name }}
</a>
{% if item.childrens %}
<ul class="submenu">
{% for child in item.childrens %}
<li>
<a href="{{ child.url }}"
target="{{ child.target_type }}"
style="{{ child.css_style }}">
{{ child.name }}
</a>
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
</nav>
Типичные коды меню в системных шаблонах:
| Код | Назначение |
|---|---|
topNavMenu |
Верхнее навигационное меню |
footerMenu |
Меню в подвале |
menuCatalogTemplateFive |
Каталожное меню (шаблон 05) |
Свойства элемента меню в Liquid
| Свойство | Описание |
|---|---|
name |
Название пункта |
url |
URL ссылки |
code |
Код элемента |
description |
Описание |
css_style |
Инлайн CSS-стили |
target_type |
Тип открытия: _self, _blank и др. |
html_attribute |
Дополнительные HTML-атрибуты |
region_id |
ID региона элемента |
icon |
URL иконки (если загружена) |
childrens |
Массив дочерних элементов (рекурсивная структура) |
Фильтры для работы с меню
| Фильтр | Пример | Описание |
|---|---|---|
menu_by_code |
'topNavMenu' | menu_by_code |
Получить массив элементов меню по коду |
menu_item_by_code |
menu | menu_item_by_code: 'home' |
Найти элемент в массиве по его коду |
menu_item_icon_content |
item.id | menu_item_icon_content |
Получить содержимое иконки (SVG inline или base64 для растра) |
16. Работа с баннерами
<!-- Загрузить баннер по коду -->
{% assign banner = 'main_page_slider' | banner_by_code %}
{% if banner %}
<div class="banner">
{{ banner }}
</div>
{% endif %}
Баннеры создаются и управляются через админ-панель.
17. Работа с изображениями и ассетами
Подключение CSS
<!-- Inline (встраивает CSS в HTML) -->
{{ "style.css" | stylesheet_inline_tag: 'screen, projection' }}
<!-- Как ссылка -->
<link rel="stylesheet" href="{{ 'style.css' | asset_url }}" media="screen">
Подключение JavaScript
{{ "script.js" | javascript_link_tag }}
<!-- Или как ссылка -->
<script src="{{ 'script.js' | asset_url }}"></script>
Изображения
<!-- Из ассетов шаблона -->
<img src="{{ 'images/logo.png' | asset_url }}" alt="Логотип">
<!-- Генерация тега -->
{{ 'images/logo.png' | image_tag: width: 200, height: 100, alt: 'Логотип' }}
<!-- Фото товара -->
{% for image in catalog_view_drop.handled_art_images %}
<img src="{{ image.path }}" alt="{{ catalog_view_drop.get_product_alt_text }}">
{% endfor %}
<!-- Заглушка для товара без фото -->
<img src="{{ catalog_view_drop.get_missing_pic }}" alt="Нет изображения">
18. Примеры типичных задач
Показать информацию о текущем пользователе
{% if current_customer %}
<div class="user-info">
<p>{{ current_customer.full_name }}</p>
<a href="/personal_area">Личный кабинет</a>
<a href="/customer_sessions/logout">Выход</a>
</div>
{% else %}
<div class="auth-links">
<a href="/customer_sessions/new">Вход</a>
<a href="/customers/new">Регистрация</a>
</div>
{% endif %}
Показать корзину
<div class="mini-basket">
<a href="/baskets">
<span class="count">{{ basket.basket_qnt }}</span>
<span class="total">{{ basket.basket_sum | number_to_currency }}</span>
</a>
</div>
Условное отображение цен
{% assign hide_prices = 'v2_search_page_hide_cost_from_unregistred_users' | vs_bool %}
{% if current_customer == blank and hide_prices %}
<p>Для просмотра цен <a href="/customer_sessions/new">войдите в аккаунт</a></p>
{% else %}
<span class="price">{{ price | number_to_currency }}</span>
{% endif %}
Мультирегиональность
<div class="region-info">
<span>Ваш город: {{ current_region.name }}</span>
<a href="#" data-toggle="region-selector">Изменить</a>
</div>
{% if show_select_region_dialog %}
{% include 'shared/_region_select.liquid' %}
{% endif %}
Flash-сообщения
{% if flash.notice %}
<div class="alert alert-success">{{ flash.notice }}</div>
{% endif %}
{% if flash.error %}
<div class="alert alert-danger">{{ flash.error }}</div>
{% endif %}
CSRF-токен в формах
<form action="/baskets/add" method="POST">
{{ auth_token_tag }}
<input type="hidden" name="product_id" value="{{ product.id }}">
<button type="submit">В корзину</button>
</form>
Социальные ссылки
<div class="social-links">
{% if social_links.vk_url %}
<a href="{{ social_links.vk_url }}" target="_blank">VK</a>
{% endif %}
{% if social_links.telegram_url %}
<a href="{{ social_links.telegram_url }}" target="_blank">Telegram</a>
{% endif %}
{% if social_links.instagram_url %}
<a href="{{ social_links.instagram_url }}" target="_blank">Instagram</a>
{% endif %}
</div>
SEO: schema.org разметка для товара
<div itemscope itemtype="http://schema.org/Product">
<h1 itemprop="name">{{ catalog_view_drop.make_name }} {{ catalog_view_drop.oem }}</h1>
<meta itemprop="sku" content="{{ catalog_view_drop.oem }}">
<meta itemprop="mpn" content="{{ catalog_view_drop.oem }}">
<span itemprop="brand">{{ catalog_view_drop.make_name }}</span>
{% if catalog_view_drop.des_text %}
<div itemprop="description">{{ catalog_view_drop.des_text }}</div>
{% endif %}
{% if seo_price %}
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<meta itemprop="price" content="{{ seo_price }}">
<meta itemprop="priceCurrency" content="RUB">
<link itemprop="availability" href="http://schema.org/InStock">
</div>
{% endif %}
</div>
19. Справочник Visual Settings
Visual Settings -- это глобальные настройки внешнего вида, доступные через админ-панель. Они управляют отображением блоков на сайте.
Обращение к Visual Settings
<!-- Boolean -->
{% assign show_banner = 'show_main_banner' | vs_bool %}
<!-- Значение -->
{% assign phone = 'company_phone' | vs_value %}
<!-- Изображение -->
<img src="{{ 'header_logo' | vs_img_url }}">
<!-- Значение если не пустое -->
{% assign text = 'promo_text' | vs_value_not_blank %}
Также через if_option
{% if_option show_main_banner %}
<!-- Блок баннера -->
{% endif_option %}
Тег {% if_option %} проверяет оба источника: current_template_options и visual_setting.
Часто используемые настройки
| Ключ | Тип | Описание |
|---|---|---|
v2_search_page_show_goods_image |
Boolean | Фото товара на странице поиска |
v2_search_page_panel_show_reviews |
Boolean | Панель отзывов |
v2_search_page_show_characteristic_info |
Boolean | Характеристики товара |
v2_search_page_show_packing_info |
Boolean | Информация об упаковке |
v2_search_page_show_advantages_info |
Boolean | Преимущества товара |
v2_search_page_show_best_price_block |
Boolean | Блок лучшей цены |
v2_search_page_show_search_filters |
Boolean | Фильтры поиска |
v2_search_page_show_widget_reviews |
Boolean | Виджет отзывов |
v2_search_page_hide_cost_from_unregistred_users |
Boolean | Скрыть цены для гостей |
v2_customer_dashboard_balance |
Boolean | Баланс в личном кабинете |
20. Маршрутизация (URL -> шаблон)
Ниже приведена таблица соответствия основных URL-путей и шаблонов, которые их обслуживают:
| URL | Шаблон | Описание |
|---|---|---|
/ |
home/index.liquid |
Главная страница |
/products/БРЕНД/АРТИКУЛ |
catalogs/show.liquid |
Карточка товара |
/catalogs |
catalogs/index.liquid |
Все категории каталога |
/catalogs/:category_id.html |
catalogs/index.liquid |
Страница конкретной категории |
/catalogs/:category_id/pav/*pav_ids.html |
catalogs/index.liquid |
Категория с фильтрами PAV |
/catalogs/search.html |
catalogs/search |
Поиск по каталогу |
/detail-fulltext.html |
price_items/fulltext |
Полнотекстовый поиск по ценам |
/baskets |
baskets/ |
Корзина |
/customers/new |
customers/ |
Регистрация |
/customer_sessions/new |
customer_sessions/ |
Вход |
/orders |
orders/ |
Список заказов |
/orders/:id |
orders/show |
Детали заказа |
/invoices |
invoices/ |
Накладные |
/bills/:id |
bills/show |
Счёт на оплату |
/news |
news/index.liquid |
Список новостей |
/news/:id |
news/show.liquid |
Конкретная новость |
/pages/:id |
pages/show.liquid |
Статическая страница |
/personal_area |
customers/ |
Личный кабинет |
/tecdoc |
tecdoc/ |
Каталог TecDoc |
/laximo |
laximo/index.liquid |
Каталог Laximo |
/original_catalogs |
original_catalogs/ |
Оригинальные каталоги |
/dialogs |
dialogs/index.liquid |
Диалоги с менеджером |
Примечание: URL карточки товара может отличаться от стандартного
/products/БРЕНД/АРТИКУЛ-- система поддерживает настройку ЧПУ-адресов (человекопонятных URL). Фактический формат URL определяется конфигурацией сайта.
Примечание: Основные страницы магазина проходят через layout
application.html.liquid. Некоторые служебные страницы могут отображаться без layout.
21. FAQ и решение проблем
Вопрос: Как понять, какой файл рендерит конкретный блок на странице?
Ответ: Включите debug-режим шаблона (параметр debug_template = 1 в настройках шаблона). После этого каждый include будет обёрнут в HTML-комментарии <!--Start template ...--> и <!--End template ...-->. Откройте исходный код страницы (Ctrl+U) и найдите нужный блок.
Вопрос: Мой шаблон не обновляется после изменений
Ответ: Система кеширует шаблоны. Сохраните шаблон заново через админ-панель -- это автоматически инвалидирует кеш. Также убедитесь, что debug_template не включён в production.
Вопрос: Как переопределить только один файл?
Ответ: Создайте в своём шаблоне (через админ-панель) только тот файл, который хотите переопределить. Система автоматически подхватит вашу версию, а для остальных файлов использует defaults.
Вопрос: Как добавить контент до/после шаблона, не переопределяя его?
Ответ: Используйте механизм _before и _after файлов. Суффикс добавляется к имени файла перед расширением:
-
views/home/index_before.liquid-- контент ПЕРЕДhome/index.liquid -
views/home/index_after.liquid-- контент ПОСЛЕhome/index.liquid
Вопрос: Как получить данные из Visual Settings?
Ответ: Используйте фильтры vs_bool, vs_value, vs_img_url:
{% assign value = 'setting_key' | vs_value %}
{% assign flag = 'setting_key' | vs_bool %}
<img src="{{ 'image_key' | vs_img_url }}">
Вопрос: Как работают опции шаблона?
Ответ: Опции определяются в файле options/options.json и доступны через {% if_option %}. Они также могут быть заданы глобально через Visual Settings.
Вопрос: Какие стандартные CSS-фреймворки доступны?
Ответ: Система подключает Bootstrap через {{ system_include }}. Вы также можете подключить свои стили через assets/stylesheets/.
Вопрос: Как использовать CSRF-токен в AJAX-запросах?
Ответ:
<meta name="csrf-token" content="{{ authenticity_token }}">
// В JavaScript:
var token = document.querySelector('meta[name="csrf-token"]').content;
fetch('/api/endpoint', {
method: 'POST',
headers: { 'X-CSRF-Token': token }
});
Вопрос: Как тестировать шаблон без активации?
Ответ: Используйте URL-параметр ?set_template_url={id} для временного переключения на ваш шаблон. Параметр ?reset_template_url={id} вернёт шаблон по умолчанию.
Приложение А: Шпаргалка по Liquid
Вывод переменных
{{ variable }}
{{ object.property }}
{{ array[0] }}
Условия
{% if condition %}
...
{% elsif other_condition %}
...
{% else %}
...
{% endif %}
{% unless condition %}
...
{% endunless %}
Циклы
{% for item in array %}
{{ forloop.index }}. {{ item.name }}
{% endfor %}
{% for item in array limit:5 offset:2 %}
{{ item }}
{% endfor %}
Переменные
{% assign my_var = 'hello' %}
{% assign count = array | size %}
{% capture my_html %}
<p>Captured content</p>
{% endcapture %}
Включение файлов
{% include 'shared/_header.liquid' %}
{% include 'shared/_item.liquid', product: current_product %}
Стандартные фильтры Liquid
{{ "hello" | upcase }} --> HELLO
{{ "HELLO" | downcase }} --> hello
{{ "hello" | capitalize }} --> Hello
{{ "hello world" | truncate: 8 }}--> hello...
{{ array | size }} --> количество элементов
{{ array | first }} --> первый элемент
{{ array | last }} --> последний элемент
{{ array | join: ", " }} --> элементы через запятую
{{ array | sort: "name" }} --> сортировка по свойству
{{ string | split: "," }} --> разбить в массив
{{ string | strip }} --> убрать пробелы
{{ string | replace: "a", "b" }}--> замена
{{ number | plus: 1 }} --> сложение
{{ number | minus: 1 }} --> вычитание
{{ number | times: 2 }} --> умножение
{{ number | divided_by: 2 }} --> деление
{{ number | modulo: 3 }} --> остаток от деления
{{ date | date: "%d.%m.%Y" }} --> форматирование даты
Приложение Б: Полная структура system-template
system-template-XX/
├── config.json
│
├── views/
│ ├── layouts/
│ │ └── application.html.liquid # Главный layout
│ │
│ ├── home/
│ │ └── index.liquid # Главная
│ │
│ ├── catalogs/
│ │ ├── show.liquid # Карточка товара (в defaults)
│ │ ├── index.liquid # Каталог (в defaults)
│ │ ├── fulltext.liquid # Полнотекстовый поиск (в defaults)
│ │ └── index_page_templates/ # Компоненты каталога
│ │
│ ├── shared/ # Общие компоненты
│ │ ├── _top_logo.liquid
│ │ ├── _top_nav.liquid
│ │ ├── _user_nav.liquid
│ │ ├── _search_panel.liquid
│ │ ├── _header_contacts.liquid
│ │ ├── _mobile_nav.liquid
│ │ ├── _side_nav.liquid
│ │ ├── _foot_nav.liquid
│ │ ├── _foot_logo.liquid
│ │ ├── _foot_copy.liquid
│ │ ├── _foot_info.liquid
│ │ ├── _news_list.liquid
│ │ ├── _review.liquid
│ │ ├── _brands.liquid
│ │ ├── _main_page_banner.liquid
│ │ ├── _features.liquid
│ │ ├── _side_banner.liquid
│ │ ├── _callback_block.liquid
│ │ └── ...
│ │
│ ├── baskets/
│ │ └── _mini.liquid # Мини-корзина
│ │
│ ├── customers/ # Личный кабинет
│ ├── orders/ # Заказы
│ ├── news/ # Новости
│ ├── pages/ # Страницы
│ ├── bills/ # Счета
│ ├── dialogs/ # Диалоги
│ ├── tecdoc/ # TecDoc каталог
│ ├── original_catalogs/ # Оригинальные каталоги
│ ├── laximo/ # Laximo каталог
│ ├── payment_systems/ # Оплата
│ ├── social_links/ # Соцсети
│ ├── alerts/ # Оповещения
│ ├── errors/ # Страницы ошибок
│ ├── pagination/ # Пагинация
│ └── seo_parts_catalogs/ # SEO каталоги
│
├── assets/
│ ├── javascripts/
│ │ └── script.js
│ └── stylesheets/
│ ├── bootstrap_core.css
│ ├── style.css
│ └── responsive.css
│
├── i18n/
│ └── ru.yml
│
├── menus/ # Экспорт/импорт меню (авто-генерация)
├── banners/ # Баннеры
├── pages/ # Статические страницы
├── options/ # Опции шаблона
│ └── options.json
└── web_forms/ # Веб-формы
Документация создана на основе анализа кодовой базы PS Base. Версия: февраль 2026.