Хуки шаблонов и приложений
Обновлено
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. Наличие метки подтверждает место вывода, а работа плагина — видимое содержимое и его действия. Не переносите одну точку в несколько узлов: это может продублировать интерфейс плагина.