API

События и API темы дизайна

Тема Seller 2.0 предоставляет три механизма расширения: JavaScript API-модули, собственные JS-события и Smarty-хуки для плагинов. Все API доступны через глобальный объект window.waTheme.

Доступные API-модули

МодульГлобальный доступОписание
Cart APIwindow.waTheme.cartAPIРабота с корзиной
Wishlist APIwindow.waTheme.wishlistAPIРабота с избранным
Compare APIwindow.waTheme.compareAPIРабота со сравнением
Управление товарамиwindow.waTheme.initProducts, window.waTheme.initProductsInContainer, экземпляры — element._productInstanceКоличество, SKU, характеристики, услуги
Notification APIwindow.waTheme.notificationAPIУведомления
Offcanvas APIwindow.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_headhead.htmlХук в секции <head> для добавления meta-тегов, скриптов, стилей
frontend_headerheader.htmlХук в шапке сайта
frontend_footerfooter.htmlХук в подвале сайта
frontend_navsidebar.htmlХук в боковой навигации

Главная страница

ХукРасположениеОписание
frontend_homepagehome.htmlХук на главной странице магазина

Категории и поиск

ХукРасположениеОписание
frontend_categorycategory.htmlХук на странице категории товаров
frontend_searchsearch.html, html/search/wsearch.html, html/search/search-pro-plugin.htmlХук на странице поиска

Карточка товара

ХукРасположениеОписание
frontend_product.*.menuhtml/product/product_01.html … product_03.htmlХук в меню товара
frontend_product.*.blockhtml/product/product_01.html … product_03.htmlХук в основном блоке товара
frontend_product.*.block_auxhtml/product/product_01.html … product_03.htmlХук в дополнительном блоке товара
frontend_product.*.carthtml/product/blocks/prices.html, html/product/blocks/price-card.htmlХук у блока цены/кнопки корзины

Корзина и оформление заказа

ХукРасположениеОписание
frontend_cartcart.htmlХук на странице корзины
frontend_checkoutcheckout.contactinfo.html, checkout.shipping.html, checkout.payment.html, checkout.confirmation.html, checkout.success.html, checkout.error.htmlХук на шагах оформления заказа и страницах успеха/ошибки

Заказы

ХукРасположениеОписание
frontend_orderorder.htmlХук на странице просмотра заказа

Личный кабинет

ХукРасположениеОписание
frontend_my_navmy.nav.htmlХук в навигации личного кабинета
frontend_my_ordersmy.orders.htmlХук на странице списка заказов
frontend_my_ordermy.order.htmlХук на странице конкретного заказа
frontend_my_affiliatemy.affiliate.htmlХук на странице партнерской программы

Blog (Блог) — 10 хуков

Общие элементы

ХукРасположениеОписание
frontend_action_<тип>.*.headhead.htmlХук в секции <head> для страниц блога
frontend_action_<тип>.*.nav_beforemain.htmlХук перед навигацией блога
frontend_action_<тип>.*.sidebarsidebar.htmlХук в боковой панели блога

Вместо <тип> подставляется тип страницы: default, post, page, error.

Посты

ХукРасположениеОписание
prepare_posts_frontend.*.post_titlepost.htmlХук в области заголовка поста
prepare_posts_frontend.*.beforepost.htmlХук перед контентом поста
prepare_posts_frontend.*.afterpost.htmlХук после контента поста
frontend_post.*.footerpost.htmlХук в подвале поста

Комментарии

ХукРасположениеОписание
prepare_comments_frontend.*.authorname_suffixcomment.htmlХук после имени автора комментария
prepare_comments_frontend.*.beforecomment.htmlХук перед текстом комментария
prepare_comments_frontend.*.aftercomment.htmlХук после текста комментария

Photos (Фотогалерея) — 10 хуков

Общие элементы

ХукРасположениеОписание
frontend_assetshead.htmlХук для добавления ассетов (стили, скрипты)
frontend_layout.*.headermain.htmlХук в шапке приложения Photos

Коллекции и альбомы

ХукРасположениеОписание
frontend_collection.*.namealbum.htmlХук в области названия коллекции
frontend_collection.*.contentalbum.htmlХук в контентной области коллекции
frontend_collection.*.search_namesearch.htmlХук в названии результатов поиска

Страница фотографии

ХукРасположениеОписание
frontend_photo.*.top_leftphoto.htmlХук в левом верхнем углу страницы фото
frontend_photo.*.top_rightphoto.htmlХук в правом верхнем углу страницы фото
frontend_photo.*.sidebarphoto.htmlХук в боковой панели страницы фото
frontend_photo.*.contentphoto.htmlХук в контентной области страницы фото
frontend_photo.*.bottomphoto.htmlХук внизу страницы фото

Hub — 17 хуков

Общие элементы

ХукРасположениеОписание
frontend_headhead.htmlХук в секции <head>
frontend_headermain.htmlХук в шапке приложения
frontend_footerfooter.htmlХук в подвале
frontend_navsidebar.htmlХук в боковой навигации
frontend_homepagehome.htmlХук на главной странице

Списки и поиск

ХукРасположениеОписание
frontend_categorycategory.htmlХук на странице категории
frontend_searchsearch.htmlХук на странице поиска
frontend_tagtag.htmlХук на странице тега
frontend_authorauthor.htmlХук на странице автора

Топики

ХукРасположениеОписание
frontend_topic.*.title_suffixtopic.htmlХук после заголовка топика
frontend_topic.*.bodytopic.page.html, topic.question.html, topic.forum.html, topic.feedback.htmlХук в теле топика (для всех типов топиков)
frontend_topic.*.commentscomments.htmlХук в области комментариев топика
frontend_commentscomment.htmlХук в комментарии

Создание и редактирование топика

ХукРасположениеОписание
frontend_topic_add.*.top_blockadd.htmlХук вверху формы создания топика
frontend_topic_add.*.bottom_blockadd.htmlХук внизу формы создания топика
frontend_topic_edit.*.top_blockadd.htmlХук вверху формы редактирования топика
frontend_topic_edit.*.bottom_blockadd.htmlХук внизу формы редактирования топика

Другие приложения

ПриложениеХукРасположениеОписание
Mailerfrontend_my_navmy.nav.htmlХук в навигации личного кабинета (рассылки)
Helpdeskfrontend_my_navmy.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_titlehtml/blocks/basic/cards-image/*.htmlХук в заголовке карточки поста
prepare_posts_frontend.*.beforehtml/blocks/basic/cards-image/*.htmlХук перед контентом карточки поста
prepare_posts_frontend.*.afterhtml/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 ... *}