События и API темы дизайна
Тема Seller 2.0 предоставляет три механизма расширения: JavaScript API-модули, собственные JS-события и Smarty-хуки для плагинов. Все API доступны через глобальный объект window.waTheme.
Доступные API-модули
| Модуль | Глобальный доступ | Описание |
|---|---|---|
| Cart API | window.waTheme.cartAPI | Работа с корзиной |
| Wishlist API | window.waTheme.wishlistAPI | Работа с избранным |
| Compare API | window.waTheme.compareAPI | Работа со сравнением |
| Управление товарами | window.waTheme.initProducts, window.waTheme.initProductsInContainer, экземпляры — element._productInstance | Количество, SKU, характеристики, услуги |
| Notification API | window.waTheme.notificationAPI | Уведомления |
| Offcanvas API | window.waTheme.offcanvasAPI | Выезжающие панели |
Подробная документация по каждому модулю — в соответствующих разделах.
События JavaScript
Тема генерирует собственные события (CustomEvent), на которые можно подписаться из своего кода — например, для отслеживания целей Яндекс.Метрики. События корзины, избранного, сравнения, ленивой подгрузки и обновления списка товаров в категории отправляются на document; события товара — на элементе товара с bubbles: true, поэтому их тоже можно ловить на document.
| Событие | Когда срабатывает | Основные поля event.detail |
|---|---|---|
cart:changed | Изменение корзины | action (added, removed, updated, cleared), itemInfo, quantity, count |
wishlist:changed | Изменение избранного | action (added, removed, cleared), productId, count, wishlist |
compare:changed | Изменение списка сравнения | action (added, removed, cleared), productId, count, compareList |
product:sku-changed | Переключение артикула товара | sku, productId, productData |
product:service-changed | Включение/выключение услуги | serviceId, isEnabled, productId, servicesPrice |
product:service-variant-changed | Выбор варианта услуги | serviceId, variantId, variantPrice, productId, servicesPrice |
lazyload:items-loaded | Ленивая подгрузка списка товаров | newItems, container, wrapper |
category-views:products-updated | Смена вида списка товаров в категории | newItems, container, source |
category-sorting:products-updated | Смена сортировки в категории | newItems, container, source |
category-filters:products-updated | Применение фильтров в категории | source |
Пример: цели Яндекс.Метрики
Код можно разместить в блоке site.{имя_темы}_js (Сайт — Блоки) — он подключается перед закрывающим тегом </body>:
{literal}
<script>
document.addEventListener('cart:changed', (event) => {
if (event.detail.action === 'added') {
// добавление товара в корзину
// 00000000 - номер счетчика, addToCart - цель
ym(00000000, 'reachGoal', 'addToCart');
}
});
document.addEventListener('wishlist:changed', (event) => {
if (event.detail.action === 'added') {
// добавление товара в избранное
}
});
document.addEventListener('compare:changed', (event) => {
if (event.detail.action === 'added') {
// добавление товара в сравнение
}
});
</script>
{/literal}
Встроенные цели Метрики без кода
Для типовых целей писать JavaScript не обязательно: в настройках темы есть группа «Цели Яндекс.Метрики». Укажите «Номер счётчика Яндекс.Метрики» и идентификаторы целей в полях:
-
«Добавление товара в корзину»
-
«Добавление товара к сравнению»
-
«Добавление товара в избранное»
-
«Начало оформления заказа»
-
«Успешное оформление заказа»
Тема отправит эти цели самостоятельно.
Кроме собственных событий, тема использует события компонентов Preline UI (open.hs.overlay, close.hs.overlay и другие) — они описаны в статье «События Preline».
Хуки темы дизайна (Smarty)
Хуки позволяют плагинам добавлять свой функционал в различные части интерфейса темы. В шаблонах места вывода помечены аннотациями вида {* @event имя_хука.%plugin_id% *}. Ниже перечислены все доступные хуки по приложениям; в именах хуков * — идентификатор плагина.
Обратите внимание: основные шаблоны (head.html, header.html, footer.html и т.д.) лежат в корне темы соответствующего приложения, а не в папке html/.
Shop (Магазин) — 18 хуков
Общие элементы страницы
| Хук | Расположение | Описание |
|---|---|---|
frontend_head | head.html | Хук в секции <head> для добавления meta-тегов, скриптов, стилей |
frontend_header | header.html | Хук в шапке сайта |
frontend_footer | footer.html | Хук в подвале сайта |
frontend_nav | sidebar.html | Хук в боковой навигации |
Главная страница
| Хук | Расположение | Описание |
|---|---|---|
frontend_homepage | home.html | Хук на главной странице магазина |
Категории и поиск
| Хук | Расположение | Описание |
|---|---|---|
frontend_category | category.html | Хук на странице категории товаров |
frontend_search | search.html, html/search/wsearch.html, html/search/search-pro-plugin.html | Хук на странице поиска |
Карточка товара
| Хук | Расположение | Описание |
|---|---|---|
frontend_product.*.menu | html/product/product_01.html … product_03.html | Хук в меню товара |
frontend_product.*.block | html/product/product_01.html … product_03.html | Хук в основном блоке товара |
frontend_product.*.block_aux | html/product/product_01.html … product_03.html | Хук в дополнительном блоке товара |
frontend_product.*.cart | html/product/blocks/prices.html, html/product/blocks/price-card.html | Хук у блока цены/кнопки корзины |
Корзина и оформление заказа
| Хук | Расположение | Описание |
|---|---|---|
frontend_cart | cart.html | Хук на странице корзины |
frontend_checkout | checkout.contactinfo.html, checkout.shipping.html, checkout.payment.html, checkout.confirmation.html, checkout.success.html, checkout.error.html | Хук на шагах оформления заказа и страницах успеха/ошибки |
Заказы
| Хук | Расположение | Описание |
|---|---|---|
frontend_order | order.html | Хук на странице просмотра заказа |
Личный кабинет
| Хук | Расположение | Описание |
|---|---|---|
frontend_my_nav | my.nav.html | Хук в навигации личного кабинета |
frontend_my_orders | my.orders.html | Хук на странице списка заказов |
frontend_my_order | my.order.html | Хук на странице конкретного заказа |
frontend_my_affiliate | my.affiliate.html | Хук на странице партнерской программы |
Blog (Блог) — 10 хуков
Общие элементы
| Хук | Расположение | Описание |
|---|---|---|
frontend_action_<тип>.*.head | head.html | Хук в секции <head> для страниц блога |
frontend_action_<тип>.*.nav_before | main.html | Хук перед навигацией блога |
frontend_action_<тип>.*.sidebar | sidebar.html | Хук в боковой панели блога |
Вместо <тип> подставляется тип страницы: default, post, page, error.
Посты
| Хук | Расположение | Описание |
|---|---|---|
prepare_posts_frontend.*.post_title | post.html | Хук в области заголовка поста |
prepare_posts_frontend.*.before | post.html | Хук перед контентом поста |
prepare_posts_frontend.*.after | post.html | Хук после контента поста |
frontend_post.*.footer | post.html | Хук в подвале поста |
Комментарии
| Хук | Расположение | Описание |
|---|---|---|
prepare_comments_frontend.*.authorname_suffix | comment.html | Хук после имени автора комментария |
prepare_comments_frontend.*.before | comment.html | Хук перед текстом комментария |
prepare_comments_frontend.*.after | comment.html | Хук после текста комментария |
Photos (Фотогалерея) — 10 хуков
Общие элементы
| Хук | Расположение | Описание |
|---|---|---|
frontend_assets | head.html | Хук для добавления ассетов (стили, скрипты) |
frontend_layout.*.header | main.html | Хук в шапке приложения Photos |
Коллекции и альбомы
| Хук | Расположение | Описание |
|---|---|---|
frontend_collection.*.name | album.html | Хук в области названия коллекции |
frontend_collection.*.content | album.html | Хук в контентной области коллекции |
frontend_collection.*.search_name | search.html | Хук в названии результатов поиска |
Страница фотографии
| Хук | Расположение | Описание |
|---|---|---|
frontend_photo.*.top_left | photo.html | Хук в левом верхнем углу страницы фото |
frontend_photo.*.top_right | photo.html | Хук в правом верхнем углу страницы фото |
frontend_photo.*.sidebar | photo.html | Хук в боковой панели страницы фото |
frontend_photo.*.content | photo.html | Хук в контентной области страницы фото |
frontend_photo.*.bottom | photo.html | Хук внизу страницы фото |
Hub — 17 хуков
Общие элементы
| Хук | Расположение | Описание |
|---|---|---|
frontend_head | head.html | Хук в секции <head> |
frontend_header | main.html | Хук в шапке приложения |
frontend_footer | footer.html | Хук в подвале |
frontend_nav | sidebar.html | Хук в боковой навигации |
frontend_homepage | home.html | Хук на главной странице |
Списки и поиск
| Хук | Расположение | Описание |
|---|---|---|
frontend_category | category.html | Хук на странице категории |
frontend_search | search.html | Хук на странице поиска |
frontend_tag | tag.html | Хук на странице тега |
frontend_author | author.html | Хук на странице автора |
Топики
| Хук | Расположение | Описание |
|---|---|---|
frontend_topic.*.title_suffix | topic.html | Хук после заголовка топика |
frontend_topic.*.body | topic.page.html, topic.question.html, topic.forum.html, topic.feedback.html | Хук в теле топика (для всех типов топиков) |
frontend_topic.*.comments | comments.html | Хук в области комментариев топика |
frontend_comments | comment.html | Хук в комментарии |
Создание и редактирование топика
| Хук | Расположение | Описание |
|---|---|---|
frontend_topic_add.*.top_block | add.html | Хук вверху формы создания топика |
frontend_topic_add.*.bottom_block | add.html | Хук внизу формы создания топика |
frontend_topic_edit.*.top_block | add.html | Хук вверху формы редактирования топика |
frontend_topic_edit.*.bottom_block | add.html | Хук внизу формы редактирования топика |
Другие приложения
| Приложение | Хук | Расположение | Описание |
|---|---|---|---|
| Mailer | frontend_my_nav | my.nav.html | Хук в навигации личного кабинета (рассылки) |
| Helpdesk | frontend_my_nav | my.nav.html | Хук в навигации личного кабинета (тикеты) |
Хуки в блоках конструктора (Site)
Блоки конструктора темы в приложении «Сайт» также содержат хуки:
| Хук | Расположение | Описание |
|---|---|---|
prepare_photos_frontend.top_left.* | html/blocks/photos/photos_01.html | Хук в левом верхнем углу фото в блоке фотографий |
prepare_photos_frontend.top_right.* | html/blocks/photos/photos_01.html | Хук в правом верхнем углу фото в блоке фотографий |
prepare_posts_frontend.*.post_title | html/blocks/basic/cards-image/*.html | Хук в заголовке карточки поста |
prepare_posts_frontend.*.before | html/blocks/basic/cards-image/*.html | Хук перед контентом карточки поста |
prepare_posts_frontend.*.after | html/blocks/basic/cards-image/*.html | Хук после контента карточки поста |
Использование хуков в плагинах
Обработчики хуков регистрируются в конфигурации плагина lib/config/plugin.php:
return array(
// ...
'handlers' => array(
'frontend_head' => 'frontendHead',
'frontend_product' => 'frontendProduct',
),
);
Метод-обработчик определяется в классе плагина. Для простых хуков он возвращает HTML-строку, для хуков с под-ключами (например, frontend_product.*.menu) — массив с соответствующими ключами:
class shopMypluginPlugin extends shopPlugin
{
public function frontendHead($params)
{
return '<link rel="stylesheet" href="...">';
}
public function frontendProduct($product)
{
return array(
'menu' => '<li>Пункт меню</li>',
'block' => '<div>HTML для основного блока</div>',
);
}
}
Рекомендации
-
Используйте хук
frontend_headдля подключения стилей и скриптов -
Для добавления элементов в личный кабинет используйте
frontend_my_nav -
Хуки
prepare_*срабатывают при подготовке данных и позволяют модифицировать контент -
Хуки
frontend_*срабатывают при рендеринге шаблона -
Всегда проверяйте наличие хука в актуальной версии темы перед разработкой плагина: места вывода помечены в шаблонах аннотациями
{* @event ... *}