Система событий в Битрикс широко развита, что позволяет добавлять свою бизнес логику в проект, не затрагивая ядра продукта. В этой статье мы разберем как добавить своё событие в систему, а так же создадим обработчик для него.
$event = new \Bitrix\Main\Event("mymodule", "OnCustomBeforeSave", array($value));
$event->send();
if ($event->getResults()) {
foreach ($event->getResults() as $evenResult) {
if ($evenResult->getResultType() == \Bitrix\Main\EventResult::SUCCESS) {
//Необязательно. Код для случая когда обработчик вернул успешных результат
}
else {
//Необязательно. Код для случая когда обработчик вернул неуспешный результат
}
}
}
mymodule
- код модуля в котором происходит событие.
OnCustomBeforeSave
- код события.
array($value)
- массив параметров передоваемых в обработчик события.
Пример: обработчик внутри компонента
На одной из страниц сайта подключается компонент test:event
:
<?php $APPLICATION->IncludeComponent("test:event", "", array()); ?>
Код компонента test:event
:
<?php
class EventExample extends \CBitrixComponent {
public function executeComponent() {
if(!empty($_REQUEST["DATA"])) {
if($this->beforeSaveData()) {
/** code save data */
$this->afterSaveData();
}
}
$this->IncludeComponentTemplate();
}
protected function beforeSaveData() {
$event = new \Bitrix\Main\Event("mymodule", "OnEventExampleBeforeSave", array('arData' => $_REQUEST["DATA"]));
$event->send();
if ($event->getResults()) {
foreach ($event->getResults() as $evenResult) {
if ($evenResult->getResultType() == \Bitrix\Main\EventResult::SUCCESS) {
return true;
}
else {
$arParameters = $evenResult->getParameters();
var_dump($arParameters['errorText']);
return false;
}
}
}
}
protected function afterSaveData() {
$event = new \Bitrix\Main\Event("mymodule", "OnEventExampleAfterSave", array($value));
$event->send();
if ($event->getResults()) {
foreach ($event->getResults() as $evenResult) {
if ($evenResult->getResultType() == \Bitrix\Main\EventResult::SUCCESS) {
//Необязательно. Код для случая когда обработчик вернул успешных результат
}
else {
//Необязательно. Код для случая когда обработчик вернул неуспешный результат
}
}
}
}
}
При получении запроса с массивом DATA компонент производит сохранение полученных данных. Непосредственно перед сохранением и после сохранения данных вызываются методы beforeSave()
и afterSave()
. В обоих этих методах регистрируется событие, на которые можно добавить свои обработчики. Обработчики могут быть разными, например после сохранения полученных данных нужно так же обновить еще какие-то данные, которые с ними связаны или отправить письмо об успешном сохранении и т.д.
Важно, что если метод beforeSave()
вернет false
, то сохранение данных не произайдет, то есть с помощью своего обработчика события OnEventExampleBeforeSave
можно влиять на то будут сохранены данные или нет.
Обработчик:
<?php
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler("mymodule", "OnEventExampleBeforeSave", "CustomOnEventExampleBeforeSave");
function CustomOnEventExampleBeforeSave($event) {
$arData = $event->getParameter('arData');
if(empty($arData["name"])) {
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, array("errorText" => "Empty name field"));
}
else {
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ["VALUE" => 'Y']);
}
return $result;
}
Внутри обработчика происходит проверка был ли передан в массиве DATA параметр name, если параметр name не был передан, то обработчик вернет ошибку.
Константы:
\Bitrix\Main\EventResult::ERROR
- обработчик вернул ошибку
\Bitrix\Main\EventResult::SUCCESS
- обработчик отработал успешно