Документация

JS-события

Скрипты шаблона общаются через собственную шину событий EventHandler (файл assets/js/libs/event.js). Подписка на события позволяет реагировать на корзину, формы и подгрузку контента, а также менять параметры AJAX-запросов — без правки файлов шаблона.

Как подписаться

Подписывайтесь в файле assets/js/custom.js шаблона: он подключается последним и не перезаписывается при обновлении — подробнее в разделе «Свои скрипты и стили».

EventHandler.register(['FormHandler', 'action'], function (params) {
    console.log('Отправлена форма', params.type, params.data);
});
!
Скрипты шаблона подключаются в конце страницы. Встроенный <script> в контенте страницы выполнится раньше, и EventHandler в нём ещё не будет определён. Пишите подписки в custom.js или оборачивайте их в document.addEventListener('DOMContentLoaded', …).

Список событий

СобытиеКогда срабатываетПараметры
MainHandler | initScriptsПосле инициализации скриптов шаблона в блоке: при загрузке страницы (для всей страницы) и после каждой подгрузки контентаparent — jQuery-элемент блока
AjaxHandler | contentПосле вставки на страницу HTML, полученного по AJAX: каталог, фильтр, всплывающие окна, формы, корзинаnode — jQuery-элемент; иногда type, content
AjaxHandler | content:<тип>Перед вставкой содержимого AJAX-области этого типаtype, parent, content
AjaxHandler | actionПосле выполнения действия по кнопке с атрибутом data-ajaxaction: cart:add, cart:setquantity, favorite:trigger, compare:trigger и другиеtype — действие, button, data — отправленные данные, res — ответ сервера
AjaxHandler | data::<действие>Перед отправкой действия на сервер. Верните объект — отправятся эти данные; верните 'prevent' — действие отменитсяaction, button
AjaxHandler | ajax::optionsПеред каждым AJAX-запросом шаблона. Верните объект — он будет добавлен к настройкам $.ajaxdata, options, type, иногда url
AjaxHandler | countersПри обновлении счётчиков в шапке: корзина, избранное, сравнениеid, type, value
FormHandler | actionПосле отправки любой AJAX-формы шаблонаnode, type — тип формы, например form:callback, data — поля формы, result — ответ
FormHandler | <тип формы>То же для конкретной формы, например FormHandler | form:callbacknode, data, result
BasketHandler | actionИзменение количества на странице корзиныtype — add2cart или removeFromCart, products, data
OrderHandler | actionШаги оформления заказаtype — checkout или purchase, products, data: id, price, tax, delivery
PageHandler | actionПоиск по сайтуtype: 'search', node, query
PopupHandler | closeЗакрытие всплывающего окна—
LocationHandler | suggestПоказ подсказок при вводе городаdata, node

Встроенная аналитика шаблона (цели Яндекс Метрики, электронная коммерция, пиксель VK) сама подписана на события action всех источников. Ваши обработчики работают параллельно с ней.

Примеры

Свой плагин на подгружаемом контенте

Каталог, фильтр и всплывающие окна подгружаются по AJAX. Чтобы ваш код работал и в подгруженных блоках, инициализируйте его в initScripts — внутри переданного блока, а не во всём документе:

EventHandler.register(['MainHandler', 'initScripts'], function (params) {
    params.parent.find('[data-my-tooltip]').each(function () {
        $(this).attr('title', $(this).data('my-tooltip'));
    });
});

Своя аналитика по отправке формы

EventHandler.register(['FormHandler', 'form:callback'], function (params) {
    // params.data — поля формы, params.result — ответ сервера
    if (typeof window.myAnalytics === 'object') {
        window.myAnalytics.track('callback_request');
    }
});

Реакция на добавление в корзину

EventHandler.register(['AjaxHandler', 'action'], function (params) {
    if (params.type === 'cart:add') {
        console.log('Товар добавлен', params.data, params.res);
    }
});

Данные и проверка перед своим действием

Обработчик data::<действие> решает, что отправить на сервер. Верните объект вида { 'действие': параметры } — отправится он; верните 'prevent' — действие отменится; ничего не верните — шаблон возьмёт параметры из атрибута data-params.

EventHandler.register(['AjaxHandler', 'data::promo:coupon'], function (params) {
    var email = $('#promo-email').val();
    if (!email) {
        PopupHandler.error('Укажите e-mail');
        return 'prevent';
    }
    return { 'promo:coupon': { email: email } };
});
!
Не подписывайтесь на data:: встроенных действий
Шаблон сам обрабатывает data::cart:add, data::cart:setquantity, data::favorite:trigger, data::compare:trigger, data::compare:clear, data::subscribe:delete и data::cookies:night. Так как учитывается ответ последнего обработчика, ваш обработчик заменит встроенный — и корзина, избранное или счётчики перестанут работать правильно. Для своих проверок используйте свои действия, а на встроенные реагируйте через AjaxHandler | action.

Заголовок для всех AJAX-запросов

EventHandler.register(['AjaxHandler', 'ajax::options'], function (params) {
    return {
        headers: { 'X-Client-Version': '2' }
    };
});
!
Для ajax::options учитывается ответ только последнего обработчика. Подписывайтесь на это событие в одном месте. Демонстрационный обработчик ajax::options с console.log в стандартном custom.js лучше удалить: он пишет в консоль каждый запрос.

Своя кнопка с AJAX-действием

Любой элемент с атрибутом data-ajaxaction отправляет действие на сервер по клику, а поле или список — при изменении. Параметры передаются в атрибуте data-params строкой JSON. Ответ на своё действие формируется в PHP-событии onAjaxResult:

<button type="button" class="btn" data-ajaxaction="promo:coupon" data-params='{"code":"SPRING"}'>
    Получить купон
</button>

Если в ответе есть message, шаблон покажет всплывающее окно — успешное при success: true. Кнопки в подгруженном по AJAX контенте подключаются автоматически.

Полезные объекты шаблона

ВызовЧто делает
PopupHandler.success(text, title)Всплывающее окно с сообщением об успехе.
PopupHandler.error(text, title)Всплывающее окно с ошибкой.
MainHandler.initScripts($block)Инициализирует скрипты шаблона (слайдеры, формы, кнопки действий) в блоке, который вы вставили на страницу сами.
EventHandler.fire(['MyHandler', 'event'], params)Отправляет своё событие — удобно, чтобы связать несколько своих скриптов.