Шаблоны сайта для разработчика

Содержание

Содержание

  1. Быстрый старт
  2. Обзор архитектуры
  3. Структура шаблона
  4. Layout: application.html.liquid
  5. Главная страница: home/index.liquid
  6. Каталог товаров: catalogs/show.liquid
  7. Каталог категорий: catalogs/index.liquid
  8. Глобальные переменные
  9. Кастомные Liquid-теги
  10. Кастомные Liquid-фильтры
  11. Liquid Drops (объекты данных)
  12. Переопределение шаблонов
  13. Debug-режим шаблонов
  14. Кэширование
  15. Локализация (i18n)
  16. Работа с меню
  17. Работа с баннерами
  18. Работа с изображениями и ассетами
  19. Примеры типичных задач
  20. Справочник Visual Settings
  21. Маршрутизация (URL -> шаблон)
  22. 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-ответ клиенту

Приоритет загрузки шаблонов

Система ищет файл шаблона в следующем порядке:

  1. Ваш переопределённый файл -- если вы изменили файл через админ-панель
  2. Файл из базового системного шаблона -- файл из шаблона, который вы взяли за основу
  3. Файл из 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>&copy; {{ 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 %}

Как работает: Проверяет значение в двух источниках (по порядку):

  1. current_template_options[имя_опции] -- опции текущего шаблона (из options.json). Условие истинно если значение строго равно "true"
  2. 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: Через админ-панель (рекомендуемый)

  1. Войдите в админ-панель: /admin/site_templates/
  2. Создайте новый шаблон или выберите существующий
  3. Откройте редактор страниц шаблона
  4. Измените нужные файлы (Liquid, CSS, JS)
  5. Сохраните -- система автоматически пометит файл как изменённый

Способ 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-->

Как использовать

  1. Включите debug-режим в настройках шаблона
  2. Откройте страницу в браузере
  3. Откройте Инструменты разработчика (F12)
  4. Перейдите на вкладку Elements или используйте View Source (Ctrl+U)
  5. Ищите комментарии <!--Start template ...--> и <!--End template ...-->
  6. Это покажет, из какого файла рендерится каждый блок 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), по которому оно вызывается в шаблонах.

Порядок работы:

  1. В админ-панели перейдите в Меню (/admin/menus/)
  2. Создайте новое меню, задав название и уникальный код (например topNavMenu)
  3. Установите флаг Активно
  4. Добавьте пункты меню -- каждый пункт имеет название, URL и опциональные настройки
  5. Пункты меню поддерживают вложенность (многоуровневое дерево)
  6. Используйте код меню в 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.

Начните тест-драйв платформы PARTS SOFT уже сегодня!

скриншот платформы