К содержимому
Параметры, хуки и интеграции

Хуки шаблонов и приложений

Обновлено

Slate выводит результаты штатных событий приложений Webasyst в предусмотренных местах страницы. Через эти точки плагины добавляют свой интерфейс: блок рядом с покупкой, пункты личного кабинета, содержимое боковой колонки или дополнительные элементы страницы. При создании собственного варианта важно сохранить точки, которые были в исходном шаблоне.

Как работает вывод

Приложение передаёт в шаблон результаты события, например $frontend_product. Макрос Slate hook выводит эти результаты; сам он не вызывает событие приложения и не получает данные плагинов заново.

{call hook point="frontend_product"
    data=$frontend_product|default:[] key="cart"}

Этот пример выводит слот cart события товара. Для массива результатов по плагинам выбирается указанный ключ. Если результат отдельного плагина — строка, макрос выводит её напрямую. Для обычных строковых результатов ключ не нужен:

{call hook point="frontend_homepage"
    data=$frontend_homepage|default:[]}

point задаёт диагностическую метку, а не имя события для вызова. В HTML вывод обрамляется комментариями slate:required hook.<точка>. При пустом ответе плагинов метки остаются, но видимого содержимого нет. Результаты выводятся как готовая разметка приложения или плагина, без повторного экранирования. Собственный пользовательский текст экранируйте при формировании его HTML.

Макрос доступен после {include utils.html}. Варианты узлов уже получают этот контекст от страницы, поэтому повторное подключение им не нужно.

Основные точки магазина

Страница или место Точка
Общая обвязка сайта и магазина frontend_head, frontend_header, frontend_footer
Боковая колонка frontend_nav, frontend_nav_aux
Главная магазина frontend_homepage
Категория frontend_category
Поиск frontend_search — над товарами, в теле каталога (так «Умный поиск» показывает найденные категории)
Товар frontend_product: menu, cart, block_aux, block
Корзина frontend_cart
Страница заказа frontend_order
Успешное или неуспешное завершение оформления frontend_checkout
Сравнение frontend_compare

У товара слоты распределены между узлами. menu и block выводит страница товара, cart — узел кнопок покупки, block_aux — вариант раскладки. Если заменить раскладку или кнопки целиком, соответствующие вызовы нужно сохранить в подходящем месте новой разметки.

Личный кабинет использует frontend_my, frontend_my_orders, frontend_my_order, frontend_my_affiliate. Вывод плагинов в разделе кабинета показывается отдельной карточкой с полями и кнопками в стиле темы; карточка появляется, только если у плагинов есть видимое содержимое, — одни скрипты и пустые обёртки её не создают. Пункты навигации плагинов поступают через frontend_my_nav: шаблон навигации выводит непустой HTML каждого плагина внутри элемента списка, без макроса hook.

На странице оформления заказа тема сохраняет штатные обёртки Shop-Script #js-order-page, #js-order-cart и #js-order-form: по ним плагины («Гибкие скидки», «Выбор города», «Управление товарами в корзине») находят оформление и его контроллер. В собственной версии страницы заказа эти идентификаторы нужно сохранить.

Корзина также имеет отдельную реализацию: файл может рендериться ядром вне общего каркаса. Поэтому frontend_cart выводится непосредственно циклом, с теми же диагностическими метками. В ответе ?get_items=1 разметка плагинов не печатается.

Блог, фотографии и другие приложения

У каждого приложения свой набор данных и мест вывода:

Приложение Точка или слот Где выводится
Блог frontend_action.head Подключения в <head>
Блог frontend_action.nav_before Перед навигацией
Блог frontend_action.sidebar В узле боковой колонки через включённые виджеты; теги и категории отдельно, остальные плагины — виджетом их вывода
Блог frontend_action.footer В подвале обвязки
Блог frontend_post, ключ footer После содержимого записи
Фото frontend_assets В <head>
Фото frontend_layout.header, frontend_layout.footer В обвязке страницы
Фото frontend_sidebar.menu, frontend_sidebar.section В боковой колонке
Фото frontend_collection.name, frontend_collection.footer На главной, в альбоме и на странице поиска
Фото frontend_collection.content На главной и в альбоме
Фото frontend_photo.top_left, frontend_photo.top_right В области фотографии
Фото frontend_photo.sidebar В боковой области страницы фотографии
Фото frontend_photo.content, frontend_photo.bottom В соответствующих секциях страницы фотографии
Рассылки frontend_my_nav Дополнительные пункты личного кабинета; готовый HTML плагина выводится циклом
Поддержка frontend_my_nav Дополнительные пункты личного кабинета; готовый HTML плагина выводится циклом
Хаб frontend_head В <head> страниц сообщества
Хаб frontend_header, frontend_nav В начале и в конце панели навигации сообщества (ссылки, поиск, кнопка новой темы)
Хаб frontend_homepage На главной сообщества
Хаб frontend_category, frontend_tag, frontend_search Над списком тем категории, тега и поиска
Хаб frontend_author На странице участника, над списком его тем или ответов
Хаб frontend_topic: title_suffix, body, comments После заголовка темы, после её текста и над комментариями
Хаб frontend_topic_add, frontend_topic_edit: top_block, bottom_block В начале и в конце формы новой темы или её правки
Хаб $comment.plugins После текста комментария

Для «Рассылок», «Поддержки» и «Хаба» перечислены фактические точки вывода в их шаблонах. Кроме frontend_head, эти результаты выводятся циклом прямо в шаблонах и узлах приложения, без макроса hook и его диагностических меток; при собственной версии узла или страницы сохраняйте соответствующий цикл. Произвольные хуки из документации другой темы не становятся доступными автоматически.

Слоты подготовленных записей, комментариев и фотографий

Некоторые результаты плагинов приходят внутри объекта содержимого, а не отдельной переменной frontend_*. Slate сохраняет их в узлах блога и фотографий:

Событие приложения Данные Вывод Slate
prepare_posts_frontend $post.plugins.post_title, .post_title_right, .before, .after Узел posts/item собирает все четыре слота; его варианты выводят их рядом с заголовком и до/после содержимого
prepare_comments_frontend $comment.plugins.authorname_suffix, .before, .after Шаблон комментария выводит дополнение имени автора и содержимое до/после комментария; те же данные сохраняются при сборке ветки
prepare_photos_frontend $photo.hooks.thumb, .plain, .top_left, .top_right На миниатюрах сеток и лент «Фото», а также блока «Фото»: угловые слоты — поверх фотографии, thumb — внутри карточки после изображения, plain — под плиткой за её рамкой

Это готовая разметка в данных содержимого, а не отдельные вызовы макроса hook. При собственной версии узла сохраняйте соответствующие циклы вывода. Для фотографий в каждом слоте hooks находится массив ответов по идентификаторам плагинов. Общая функция photo_hooks выводит выбранный слот, а photo_tile размещает слоты в карточке; пустые ответы не создают обёрток. Угловые слоты находятся вне ссылки на фотографию. В своей версии плитки сохраняйте все четыре слота. Слот frontend_collection.sidebar в текущих шаблонах Slate не выводится.

Обычный лендинг получает общие точки обвязки автоматически. frontend_homepage относится к главной магазина и не добавляется на произвольную страницу «Сайта» только потому, что она состоит из блоков.

Вставки через блоки приложения «Сайт»

Для дополнительного текста, HTML, CSS или JavaScript не всегда нужна правка файлов темы. В «Сайт → Блоки» создайте блок с одним из фиксированных кодов ниже. Вместо <тема> укажите идентификатор активной темы, например slate; это не имя приложения.

Код блока Место вывода
site.<тема>_head_html В конце <head>
site.<тема>_css, site.<тема>_js, site.<тема>_body_html В конце страницы: CSS, затем JavaScript, затем HTML
<тема>.page.before, <тема>.page.after До и после содержимого страницы «Сайта» или магазина; page.after — также после блоков главной «Сайта»
<тема>.category.before_products, <тема>.category.after_products До товаров категории и после её списка, пагинации и описания
<тема>.sidebar.before, <тема>.sidebar.after До и после виджетов колонки каталога
<тема>.search.before, <тема>.search.after До и после поиска магазина, включая пустой результат
<тема>.products_grid.after, <тема>.products_list.after, <тема>.products_table.after, <тема>.products_swiper.after Внутри каждой карточки соответствующего вида: плитка, список, таблица, карусель
<тема>.product.before_price, <тема>.product.after_price До и после цены товара
<тема>.product.after_images, <тема>.product.after_overview, <тема>.product.after_product После галереи, описания в обзоре и основного содержимого товара
<тема>.product.before_upselling, <тема>.product.before_crossselling, <тема>.product.before_viewed Перед соответствующей непустой подборкой товара
blog.<тема>.post.before, blog.<тема>.post.after До и после записи блога, перед комментариями
blog.<тема>.stream.before, blog.<тема>.stream.after, blog.<тема>.stream.item.after До и после ленты блога и в конце каждой записи ленты

Например, блок slate.product.after_images добавит содержимое под галереей товара. Отсутствующий или пустой блок не создаёт видимой вставки. Для CSS и JavaScript нужны собственные теги <style> и <script>: содержимое выводится как есть и обрабатывается Smarty.

Вставки после карточек товаров и записей ленты вычисляются один раз на список, затем повторяются в его элементах. Текущий товар или запись в них не передаётся: для персонального содержимого нужна доработка узла. Внешние вставки ленты не копируются при подгрузке следующей страницы. Места категории не вызываются в поиске и избранном, места поиска — в избранном. Вставка колонки может сделать её непустой, но не отменяет явное скрытие колонки.

В составе шапки и товара также можно выбрать свой блок приложения «Сайт» по произвольному коду. Это другой способ вставки: код задаётся в строке состава и не обязан совпадать с таблицей. Служебная точка theme.themesettings_return описана в статье о параметрах.

Проверка собственных шаблонов

Имена штатных событий приложений сохраняются. Размещение результатов нужно сверять с узлами Slate: при подмене страницы или блока переносите соответствующие вызовы из актуального шаблона. То же относится к вставкам блоков «Сайта»: собственная копия страницы отвечает за их вывод.

Для проверки откройте страницу с установленным плагином и найдите нужную метку в HTML. Наличие метки подтверждает место вывода, а работа плагина — видимое содержимое и его действия. Не переносите одну точку в несколько узлов: это может продублировать интерфейс плагина.