Подмена настроек темы дизайна
Обновлено
Тема Seller 2.0 позволяет динамически подменять настройки темы в зависимости от условий: категории, витрины, страницы и других параметров. Это позволяет, например, менять отображение товаров для определенных категорий.
Система настроек
Все настройки темы описаны в файле theme.xml темы дизайна (в приложении Сайт) и организованы по разделам.
Разделы настроек
Ключи настроек начинаются с префикса раздела:
| Раздел | Префикс | Описание |
|---|---|---|
| common | common__ |
Общие настройки (дизайн, шрифты, цвета) |
| header | header__ |
Настройки шапки сайта |
| footer | footer__ |
Настройки подвала |
| home | home__ |
Блоки главной страницы (самый большой раздел) |
| catalog | catalog__ |
Настройки каталога и категорий |
| product | product__ |
Настройки карточки товара |
| personal | personal__ |
Настройки личного кабинета |
| sidebar | sidebar__ |
Сайдбар: сортировка блоков (Helpdesk, Hub) и навигация |
| pages | pages__ |
Настройки страниц |
| cart | cart__ |
Настройки корзины и оформления заказа |
| apps | apps__ |
Настройки интеграции с приложениями |
| media | media__ |
Медиа-блоки (баннеры, всплывающие окна) |
| mobile | mobile__ |
Настройки мобильной версии |
| other | other__ |
Прочие настройки |
Доступ к настройкам
В Smarty-шаблонах настройки доступны через массив $theme_settings:
{$theme_settings["common__design_font_family"]}
{$theme_settings["catalog__subcategories_display_type"]}В JavaScript настройки доступны через window.waTheme.themesettings:
window.waTheme?.themesettings?.settings?.common__design_font_family?.valueПодмена настроек через блок
Для подмены настроек создайте в приложении Сайт — Блоки блок с id theme.themesettings_return.
Пример: изменение отображения подкатегорий для конкретной категории
{* GET THEME ID *}
{$_theme_id = waRequest::getTheme()}
{* GET THEME SETTINGS *}
{$args = $wa->globals('theme.event_args')}
{$theme_settings = $args['theme_settings']}
{* SET THEME SETTINGS *}
{if !empty($category) && $category["id"] == 193}
{$theme_settings["catalog__subcategories_display_type"] = "assets/img/themesettings/blocks/categories/types/categories_01.webp"}
{/if}
{* RETURN THEME SETTINGS *}
{$args['theme_settings'] = $theme_settings}
{$wa->globals('theme.event_return', $args)}Как это работает
- Тема перед рендерингом страницы проверяет наличие блока
theme.themesettings_return - Блок получает текущие настройки через
$wa->globals('theme.event_args') - В блоке можно изменить любые настройки в массиве
$theme_settings - Измененные настройки возвращаются через
$wa->globals('theme.event_return', $args)
Примеры подмены
Изменение количества товаров в строке для категории (доступные значения — four (4 колонки) и third (3 колонки)):
{if !empty($category) && $category["id"] == 10}
{$theme_settings["catalog__categories_category_view_grid_type_buttons"] = "four"}
{/if}Изменение вида отображения товаров (значения: grid, list, table):
{if !empty($category) && in_array($category["id"], [5, 10, 15])}
{$theme_settings["catalog__categories_category_view_type_buttons"] = "list"}
{/if}Изменение настройки для конкретной витрины:
{$route = wa()->getRouting()->getRoute()}
{if $route['url'] == 'shop-two/'}
{$theme_settings["header__blocks_catalog_type"] = "assets/img/themesettings/header/catalog/types/catalog_02.webp"}
{/if}Обратите внимание: у настроек типа image select (выбор картинкой) значением является путь к изображению варианта, например assets/img/themesettings/blocks/categories/types/categories_01.webp.
Пример: подкатегории по уровню категории
Условие можно строить не только по id категории, но и по её глубине вложенности — полю depth (у категорий верхнего уровня оно равно 0). Так на страницах вложенных категорий подкатегории выводятся первым макетом, только названиями, а на страницах категорий верхнего уровня — макетом, выбранным в настройках темы:
{if !empty($category) && $category["depth"] >= 1}
{$theme_settings["catalog__subcategories_display_type"] = "assets/img/themesettings/blocks/categories/types/categories_01.webp"}
{/if}Подмена и панель управления темой
У подмены есть подвох, о котором стоит помнить. Панель управления темой на витрине показывает те настройки, которые действуют на текущей странице, — то есть уже подменённые. А при сохранении панель отправляет все поля формы разом и записывает их в общие настройки темы.
Поэтому, если открыть панель на странице, где подмена сработала, и сохранить настройки, подменённое значение станет общим и начнёт действовать на всём сайте. В примере выше: сохранили панель на странице вложенной категории — первый макет подкатегорий включился во всех категориях.
Как этого избежать:
- меняйте настройки через панель на страницах, где подмена не срабатывает (для примера с глубиной — на главной или на странице категории верхнего уровня);
- либо меняйте их в настройках темы в бэкенде — там подмена не действует;
- если общая настройка всё же поменялась, верните её значение и сохраните ещё раз со «чистой» страницы.
Именование настроек
Ключи настроек формируются по следующей схеме:
{раздел}__{секция}_{название}[_type_{тип_контрола}]Примеры:
common__design_elements_rounded_type_buttons— скругление элементов (radio)apps__shop_common_notification_cart_type_buttons— уведомления корзины (radio)home__products_01_title— заголовок блока товаров на главнойhome__advantages_01_advantages_type_json— JSON-данные блока преимуществ
Типы контролов (суффиксы)
| Суффикс | control_type в theme.xml | Описание |
|---|---|---|
_type_json |
text | JSON-структура (простая) |
_type_json_tree |
text | JSON-структура (древовидная) |
_type_json_grouped_elements |
text | JSON-структура (группированные элементы, например состав секций шапки) |
_type_buttons |
radio (в отдельных настройках — select или image_select) | Выбор с кнопками |
_type_select |
text | Выбор из списка |
_type_ace_editor |
text | Код-редактор |
_type_wysiwyg |
text | WYSIWYG-редактор |
_type_number |
text | Числовое значение |
Суффикс отражает соглашение об именовании, а не жёсткую привязку к control_type — точный тип смотрите в theme.xml.