Обработчик событий - это код, который вы пишете для реагирования на событие.
|
| Примеры обработчиков - с кодом |
Примеры событий из 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'],
]
]); |