Документация для разработчиков
Темная тема

BX.addCustomEvent

Описание

Функция BX.addCustomEvent

Функция подразумевает два варианта входных параметров.

void 
BX.addCustomEvent(
 Object eventObject,
 string eventName,
 Function eventHandler
);
void 
BX.addCustomEvent(
 string eventName,
 Function eventHandler
);

Функция назначает обработчик eventHandler кастомному событию с именем eventName, возникающем в объекте eventObject. Если eventObject не указан (короткий вызов), то обработчик будет вызываться при каждом вызове события с таким именем в любом объекте.

Получение списка всех событий в системе

При работе с кастомными событиями возникает резонный вопрос - как получить полный список событий, который присутствует в системе (актуально для готовых шаблонов, административной части, и Битрикс24-коробки) ?

Данную задачу можно решить следующим образом - в файле /bitrix/js/main/core/core.js находим метод:

BX.onCustomEvent = function(eventObject, eventName, arEventParams, secureParams);

Вставим в его исполнение логирование:

console.log(eventName, arEventParams);

После этого при совершении различных действий на клиенте (клики, push-информации, открытии popup) в лог будут писаться коды событий. Вам останется подобрать нужное.

Примечание: не забудьте удалить в ядре строчку логирования после сбора необходимой информации.


Примеры использования

Как добавить свои шрифты в визуальный редактор

На событии GetFontFamilyList добавить нужные шрифты в массив. Тогда они начнут выводиться в списке шрифтов в редакторе.

BX.addCustomEvent('GetFontFamilyList', BX.delegate(function (fontlist) {
	fontlist.push({value: 'RobotoThin', name: 'RobotoThin'});
	fontlist.push({value: 'RobotoLight', name: 'RobotoLight'});
	fontlist.push({value: 'RobotoRegular', name: 'RobotoRegular'});
	fontlist.push({value: 'RobotoBlack', name: 'RobotoBlack'});

	for(var key in userFonts) {
		fontList.push({value: userFonts[key], name: userFonts[key]})
	}
}));

Как зафиксировать обновление счетчика

Для этого нужно добавить обработчик события:

BX.addCustomEvent("onPullEvent-main", BX.delegate(function(command,params){
   if (command == 'user_counter' && params[BX.message('SITE_ID')] && params[BX.message('SITE_ID')]['__НАЗВАНИЕ_ВАШЕГО_СЧЕТЧИКА__'])
   {
      // вызвать код для обновления счетчика
      // в params[BX.message('SITE_ID')]['__НАЗВАНИЕ_ВАШЕГО_СЧЕТЧИКА__'] будет новое значение счетчика
   }
}, this));

Для мобильной версии:

BX.addCustomEvent("onPull-main", BX.delegate(function(data){
   if (data.command == 'user_counter' && data.params[BX.message('SITE_ID')] && data.params[BX.message('SITE_ID')]['__НАЗВАНИЕ_ВАШЕГО_СЧЕТЧИКА__'])
      {
      // вызвать код для обновления счетчика
      // в data.params[BX.message('SITE_ID')]['__НАЗВАНИЕ_ВАШЕГО_СЧЕТЧИКА__'] будет новое значение счетчика
   }
}, this));

Работа с модулем Push and Pull

Ловушка для страниц десктопной версии (все события кроме событий online):

BX.addCustomEvent("onPullEvent-moduleName", BX.delegate(function(command,params){
   console.log('Events of moduleName', command, params);
}, this));

Ловушка для страниц мобильной версии (все события кроме событий online):

BX.addCustomEvent("onPull-moduleName", BX.delegate(function(data){
    console.log('Events of moduleName', data.command, data.params);
}, this));

Примечание: не забывайте сменить в примере "moduleName" на имя вашего модуля.

Пример кода для работы с PHP классами модуля (Pull, Pull Shared, Pull Watch):

BX.addCustomEvent("onPullEvent-main", function(module_id,command,params) {
    if (command == 'check')
    {
        console.log('Command from module MAIN - its work!');
    }
});

В примере иы подписываемся на событие получение команд (onPullEvent-moduleName), moduleName это название вашего модуля, например main, в функции получаем command, params которые мы указали при отправке команды из PHP, обрабатываем свои команды с учетом вашей логики.

Если ваша логика требует сбора всех событий, то формат немного отличается: (доступно на любой версии pull)

Ловушка для страниц десктопной версии (все события кроме событий online):

BX.addCustomEvent("onPullEvent", BX.delegate(function(module_id,command,params){
   console.log(module_id, command, params);
}, this));

Ловушка для страниц мобильной версии (все события кроме событий online):

BX.addCustomEvent("onPull", BX.delegate(function(data){
    console.log(data.module_id, data.command, data.params);
}, this));

Пример кода для работы с PHP классами модуля (Pull, Pull Shared, Pull Watch):

BX.addCustomEvent("onPullEvent", function(module_id,command,params) {
    if (module_id == "test" && command == 'check')
    {
        console.log('Work!');
    }
});

В примере мы подписываемся на событие получение команд (onPullEvent), в функции получаем module_id, command, params которые мы указали при отправке команды из PHP, обрабатываем свои команды с учетом вашей логики.

Примечания:
  • Для получения данных об онлайне используйте событие onPullOnlineEvent
  • Лучше использовать обработчики событий для конкретных модулей, вместо обработчика на все события. Такой формат будет более производителен.



Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Алексей Попович
Если на одной странице с оформлением заказа лежит также и компонент корзины, в обработчиках sale.order.ajax можно добавить код изменения корзины:
Код
initBasketItemChageQuantity: function () {
    var ctx = this;
    BX.addCustomEvent('OnBasketChange', function(){
        ctx.sendRequest('refreshOrderAjax',null);
    });

.....

1
Алексей Попович
пример события для шаблона drag_n_drop компонента bitrix:main.file.input - событие успешной загрузки файла:
Код
BX.addCustomEvent("OnFileUploadSuccess",function (res) {
    if(res.success!==undefined && res.success){
        ...
    }
})
21
Олег Орестов
Приведу пример решения очень простой задачи, которая была еще до появления этой страницы документации.
На страницы оформления заказа (компонент sale.order.ajax) использовались не стандартные внешне элементы чекбокс и радио. Внешний вид задавался с помощью jquery.uniform плагина. При первом просмотре страницы все было отлично, но как только мы получаем ее заново на ajax, то внешний вид элементов сбрасывался. Решается так:
Код
        BX.addCustomEvent('onAjaxSuccess', function(){
            $(".checkbox, .radio").uniform();
        });
© «Битрикс», 2001-2020, «1С-Битрикс», 2020
Наверх