Bitrix регистрация своего события

Система событий в Битрикс широко развита, что позволяет добавлять свою бизнес логику в проект, не затрагивая ядра продукта. В этой статье мы разберем как добавить своё событие в систему, а так же создадим обработчик для него.

$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);
	}
	return $result;	
}

Внутри обработчика происходит проверка был ли передан в массиве DATA параметр name, если параметр name не был передан, то обработчик вернет ошибку.

Константы:

\Bitrix\Main\EventResult::ERROR - обработчик вернул ошибку

\Bitrix\Main\EventResult::SUCCESS - обработчик отработал успешно

Рубрики: PHP Bitrix

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

Bitrix получить значения списочного поля

В статье приводится пример кода для получения всех вариантов значений пользовательского поля с типом "Список". Так же описано как можно получить конкретный вариант значения поля.

Bitrix подключить класс компонента

В статье приводится пример того как можно подключить только компонент битрикс без подключения его шаблона, чтобы можно было вызвать его метод или получить значения свойств

Bitrix запись своих настроек в settings.php

Статья о том как разместить свои настройки не создавая велосипеды и костыли, а используя возможности системы.

Bitrix получить путь до компонента

В статье приводится пример кода для получения директории в которой находится файл компонента.

Bitrix сбросить буфер вывода

Функция RestartBuffer() в Bitrix используется для сброса буфера вывода. Она позволяет прервать вывод страницы на определенном этапе выполнения скрипта и начать вывод заново. В статье рассмотрим основные сценарии использования данной функции, рассмотрим пример кода.

Как в bitrix получить параметры запроса

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

Комментарии

Гость [15.09.2022]
Спасибо, получилось разобраться
Данный сайт использует файлы cookies. Продолжая просмотр сайта, вы соглашаетесь с использованием файлов cookies.
ОК