Обработчик событий - это код, который вы пишете для реагирования на событие.
|
Примеры обработчиков - с кодом |
Примеры событий из 1С-Битрикс
Событие: добавление пользователя Дополненная логика: Пишем в куку ид аффилиата, а в пользователя при регистрации записываем в доп поле |
Событие: изменение элемента Дополненная логика: удаляем раздел и символьный код, чтобы они наверняка не изменились, чтобы не изменилась ссылочная масса, которая проиндексирована поисковиками |
Событие: оплата заказа Дополнительные действия: Генерация лицензии на купленную программу |
Событие: изменение элемента Дополнительные действия: логируем, кто, когда с какого ip, что именно изменил |
Событие: изменение сделки (before) Дополненная логика: смотрим кто изменяет, если у данного пользователя не должно быть права менять определенное поле, то его новое значение удаляем |
Последовательность
- Обработчик события Before
- Событие (может быть неуспешным)
- Обработчик события After (если событие было успешным)
События Before
- обычно события before позволяют модифицировать данные, но есть и исключения
- все события before позволяют отменить действие
- удобно использовать эти события для модификации изменяемых данных, потому что не придется делать еще раз update
- действия-логика, которые необходимо сделать, когда событие ТОЧНО произошло (уведомление о регистрации, генерация лицензии только при оплате)
- или когда нет обработчика 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); //получить все обработчики |
//версия 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")){ //Ваша логика } } |
- или в своем модуле
обработчики из модулей хранятся в таблице b_module_to_module |
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'], ] ]); |