Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Обработчики событий, события



Обработчик событий - это код, который вы пишете для реагирования на событие.
  • для дополнения стандартной логики события
  • для запуска дополнительных действий после события
  • для отмены события
Примеры обработчиков - с кодом


Примеры событий из 1С-Битрикс
Событие: добавление пользователя
Дополненная логика:  Пишем в куку ид аффилиата, а в пользователя при регистрации записываем в доп поле
Событие: изменение элемента
Дополненная логика: удаляем раздел и символьный код, чтобы они наверняка не изменились, чтобы не изменилась ссылочная масса, которая проиндексирована поисковиками
Событие: оплата заказа
Дополнительные действия: Генерация лицензии на купленную программу
Событие: изменение элемента
Дополнительные действия: логируем, кто, когда с какого ip, что именно изменил
Примеры событий из Битрикс24
Событие: изменение сделки (before)
Дополненная логика:  смотрим кто изменяет, если у данного пользователя не должно быть права менять определенное поле, то его новое значение удаляем


Последовательность
  • Обработчик события Before
  • Событие (может быть неуспешным)
  • Обработчик события After (если событие было успешным)
в большинстве случаев для событий есть 2 вида обработчиков (и before, и after), но бывает, что есть только after

События Before
  • обычно события before позволяют модифицировать данные, но есть и исключения
  • все события before позволяют отменить действие
  • удобно использовать эти события для модификации изменяемых данных, потому что не придется делать еще раз update
Cобытия After
  • действия-логика, которые необходимо сделать, когда событие ТОЧНО произошло (уведомление о регистрации, генерация лицензии только при оплате)
  • или когда нет обработчика before, приходится использовать обработчики after
обработчики событий размещают:
  • или в init.php
старое ядро
//вариант 1 с классом
$handler = AddEventHandler("iblock", "OnAfterIBlockElementAdd", ["nikaImport", "onUserLoginExternal"]), 1); 
//где 1 - Очередность (порядок), в котором выполняется данный обработчик (обработчиков данного события может быть больше одного). Необязательный параметр, по умолчанию равен 100.

class nikaImport {    
   static function FillTheBrands( $arFields ){
      //
   }
}
//вариант 2 без класса
$handler2 = AddEventHandler("iblock", "OnAfterIBlockElementAdd", "MyOnAfterIBlockElementAdd");
function MyOnAfterIBlockElementAdd($arFields){
  
}

RemoveEventHandler("iblock", "OnAfterIBlockElementAdd",$handler);
$handlers = GetModuleEvents("main", "OnProlog", true); //получить все обработчики
d7
//версия 1 
$eventManager = \Bitrix\Main\EventManager::getInstance(); 
$eventManager->registerEventHandlerCompatible("module","event","module2","class","function");

//версия 2 для событий в DataManager например
$eventManager = \Bitrix\Main\EventManager::getInstance(); 
$eventManager->registerEventHandler("module","event","module2","class","function");

//версия 3 без классов и своих модулей
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderSaved',
    'MyOnSaleOrderSaved'
);

function MyOnSaleOrderSaved(\Bitrix\Main\Event $event){   
    $order = $event->getParameter("ENTITY");
    if ($event->getParameter("IS_NEW")){
       //Ваша логика
    }
} 
  • или в своем модуле
старое ядро
RegisterModuleDependences("iblock", "OnBeforeIblockElementAdd", "mymodule", "CMyModuleClass", "MyTriggerFunction");
UnRegisterModuleDependences("iblock", "OnBeforeIblockElementAdd", "mymodule", "CMyModuleClass", "MyTriggerFunction");
новое ядро
EventManager::getInstance()->registerEventHandler(   "main",
   "OnProlog",
   $this->MODULE_ID,
   "Nikaverro\\Test\\EventHandlers",
   "onProlog"
);
EventManager::getInstance()->unRegisterEventHandler(
   "main",
   "OnProlog",
   $this->MODULE_ID,
   "Nikaverro\\Test\\EventHandlers",
   "onProlog"
);

$handlers = EventManager::getInstance()->findEventHandlers("main", "OnProlog");

Почтовые события
CEvent - класс для работы с почтовыми событиями старое ядро
Bitrix\Main\Mail\Event  - d7

в Битриксе есть стандартные почтовые и смс события, они добавляются при установке модулей
/bitrix/admin/type_admin.php?lang=ru
из можно изменять (добавлять параметры, деактивировать и тд)
туда же можно добавить свои события

на 1 почтовое событие можно повесить несколько шаблонов (письмо клиенту и письмо менеджеру)


вызов события


d7
//старое ядро
CEvent::Send("NEW_USER", "s1", $arFields);



\Bitrix\Main\Mail\Event::send([       
        "EVENT_NAME" => "LOCAL_CORE_FORM_ADD_FAQ",
   'MESSAGE_ID' => 64, //определенный шаблон, если не указывать, то отправятся все привязанные к событию
   "LID" => "s1",
   "C_FIELDS" => [
      'ID' => $arFields['ID'],
   ]
]);
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!