Найти тему

Свои события (Event) в Bitrix

Иногда очень нужно отследить воздействие на класс или таблицу, например изменения внесенные через REST API и собственные методы, и здесь могут помочь события и их обработчики.

Предположим у нас есть функция обновления таблицы, и мы хотели бы внести возможность довнесения данных или их модерацию перед тем, как эти данные будут обновлены. Для этого в классе непосредственно перед инициацией обновления регистрируем создание события.

$event = new Event("sync", "OnBeforeTicketUpdate", array('ID' => $id, 'DATA' => $updateFields));

Здесь будет зарегистрировано событие, с указанием модуля, имени события, массива данных.

$event->send();

Наше событие будет зарегистрировано и отдано в ядро событий, которое будет выполнит поиск зарегистрированного обработчика нашего события и передаст в него наши данные.

Регистрация обработчика нашего события ничем не отличается регистрации от обработчика встроенных событий.

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sync',
'OnBeforeTicketUpdate',
'UpdateHandlerBeforeUpdate'
);

Регистрацию вставляем собственного в файл, которые связан с init.php либо в сам init.php

Здесь указываем модуль, в котором будет происходить поиск сработавшего события, затем название события и далее - имя функции-обработчика.

Сама функция будет иметь следующий вид.

function UpdateHandlerBeforeUpdate(Bitrix\Main\Event $event) {
$data = $event->getParameters();
if ($data['ID'] == '1') {
$data['ID'] = 2;
}
$result = new Bitrix\Main\EventResult($event->getEventType(), array($data));
return $result;
}

Сперва мы получим параметры события, это массив данных, который мы отправлял в событие array('ID' => $id, 'DATA' => $updateFields);

Затем мы выполняем любые проверки и действия над массивом данных и по итогу наших действий возвращаем массив обратно, при этом указание $event->getEventType() передает статус выполненного события, здесь можно указывать, что обработчик вернул ошибку и тогда действия по обновлению могут быть, к примеру, отменены.

Могут быть использованы следующие варианты:
\Bitrix\Main\EventResult::SUCCESS - при успешной обработке
\Bitrix\Main\EventResult::ERROR - если нужно вернуть ошибку
$event->getEventType() - статус на входе (например, после другого обработчика), он же при прочих равных равен успеху.

Конкретно в этом примере передается успех.

Далее мы возвращаемся в наш класс, где мы регистрировали событие и смотри уже в результаты возможных обработчиков.

foreach ($event->getResults() as $eventResult) {
if ($eventResult->getType() == \Bitrix\Main\EventResult::ERROR) // если обработчик вернул ошибку, ничего не делаем
continue;
$updateFields = array_merge($updateFields, $eventResult->getParameters());
}

Здесь, как раз после выше вызванной передачи данных в обработчики ( $event->send(); ) мы сразу проверяем данные, которые могли вернуть зарегистрированные обработчики и уже по результату решаем, что мы делаем дальше. Не делаем модификацию данных, если обработчики вернули ошибки, либо делаем обновление массива данных под update и затем уже не препятствуем дальнейшему коду с обновлением.

После обновления можно зарегистрировать аналогично, например, событие "OnAfterTicketUpdate", которое будет обрабатывать результат обновления данных.

На этом канале размещаются решения для конкретных вопросов, возникающих при работе с сайтами на Bitrix или Bitrix24 с использованием D7 и не только.

Сами занимаемся созданием сайтов и внедрением CRM на базах вышеназванных систем. Электронный адрес по всем вопросам - info@msl.ru, либо через форму вопроса на сайте msl.ru