В предыдущей статье по хайлоад блокам я писал о работе с элементами. В этой рассмотрим, как работать с событиями highload блоков: добавления, обновления, удаления.
Порядок вызова событий и допустимые действия в обработчиках каждого из них:
источник (https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=2244&LESSON_PATH=3913.5062.5748.2244#events)
Все примеры будут производиться с использованием highload блока — Colors.
Поля:

Нужно уловить принцип написания функции addEventHandler для различных событий. Второй аргумент — это название вашего highload блока и название самого события.
На моём примере:
$eventManager->addEventHandler('', 'ColorsOnBeforeUpdate', 'OnBeforeUpdate');
$eventManager->addEventHandler('', 'ColorsOnAfterAdd', 'OnAfterAdd');
и т.д. ...
Содержание:
Код нужно разместить в файле init.php.
OnBeforeAdd
Событие вызывается до добавление элемента highload(HL) блока и валидации полей.
Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnBeforeAdd', 'OnBeforeAdd');
/**
*
* @param \Bitrix\Main\Entity\Event $event
* @return \Bitrix\Main\Entity\EventResult
*/
function OnBeforeAdd(\Bitrix\Main\Entity\Event $event) {
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnBeforeAdd
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
//получить все доступные в этом событие данные
$arParameters = $event->getParameters();
$result = new \Bitrix\Main\Entity\EventResult();
//модификация данных
if (empty($arFields['UF_FULL_DESCRIPTION'])) {
$arFields['UF_FULL_DESCRIPTION'] = $arFields['UF_DESCRIPTION'];
$result->modifyFields($arFields);
}
// для тестирования модификации данных закомментируйте этот блок
if (empty($arFields['UF_DESCRIPTION'])) {
$arErrors = Array();
$arErrors[] = new \Bitrix\Main\Entity\FieldError($entity->getField("UF_DESCRIPTION"), "Ошибка в поле UF_DESCRIPTION. Поле не должно быть пустым!");
$result->setErrors($arErrors);
}
return $result;
}
OnAdd
Событие вызывается перед добавлением в бд, после валидации полей. Модификация данных не доступна.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAdd', 'OnAdd');
function OnAdd(\Bitrix\Main\Entity\Event $event) {
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnAdd
$eventType = $event->getEventType();
// поулчаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
}
OnAfterAdd
Событие вызывается после добавления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после добавления нового элемента данного HL-блока.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAfterAdd', 'OnAfterAdd');
function OnAfterAdd(\Bitrix\Main\Entity\Event $event) {
//id добавляемого элемента
$id = $event->getParameter("id");
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnAfterAdd
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
}
OnBeforeUpdate
Событие вызывается до обновления элемента highload(HL) блока и валидации полей.
Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnBeforeUpdate', 'OnBeforeUpdate');
/**
*
* @param \Bitrix\Main\Entity\Event $event
* @return \Bitrix\Main\Entity\EventResult
*/
function OnBeforeUpdate(\Bitrix\Main\Entity\Event $event) {
$id = $event->getParameter("id");
//id обновляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnBeforeUpdate
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
$result = new \Bitrix\Main\Entity\EventResult();
//модификация данных
if (empty($arFields['UF_FULL_DESCRIPTION'])) {
$arFields['UF_FULL_DESCRIPTION'] = $arFields['UF_DESCRIPTION'];
$result->modifyFields($arFields);
}
// для тестирования модификации данных закомментируйте этот блок
if (empty($arFields['UF_DESCRIPTION'])) {
$arErrors = Array();
$arErrors[] = new \Bitrix\Main\Entity\FieldError($entity->getField("UF_DESCRIPTION"), "Ошибка в поле UF_DESCRIPTION. Поле не должно быть пустым!");
$result->setErrors($arErrors);
}
return $result;
}
OnUpdate
Событие вызывается перед обновлением в бд, после валидации полей. Модификация данных не доступна.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnUpdate', 'OnUpdate');
function OnUpdate(\Bitrix\Main\Entity\Event $event) {
$id = $event->getParameter("id");
//id обновляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnUpdate
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
}
OnAfterUpdate
Событие вызывается после обновления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после обновления элемента данного HL-блока.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAfterUpdate', 'OnAfterUpdate');
function OnAfterUpdate(\Bitrix\Main\Entity\Event $event) {
$id = $event->getParameter("id");
//id обновляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnAfterUpdate
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
}
OnBeforeDelete
Событие вызывается до удаления элемента highload(HL) блока.
Можно отменить удаление.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnBeforeDelete', 'OnBeforeDelete');
/**
*
* @param \Bitrix\Main\Entity\Event $event
* @return \Bitrix\Main\Entity\EventResult
*/
function OnBeforeDelete(\Bitrix\Main\Entity\Event $event) {
// поля в этом событии недоступны, только id
$id = $event->getParameter("id");
//id удаляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnBeforeDelete
$eventType = $event->getEventType();
$result = new \Bitrix\Main\Entity\EventResult();
if ($id <= 20) {
$arErrors = Array();
$arErrors[] = new \Bitrix\Main\Entity\EntityError("Ошибка! Нельзя удалять первые 20 элементов!");
$result->setErrors($arErrors);
}
return $result;
}
OnDelete
Событие вызывается перед удалением из бд. Отмена удаления не доступна.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnDelete', 'OnDelete');
function OnDelete(\Bitrix\Main\Entity\Event $event) {
// поля в этом событии недоступны, только id
$id = $event->getParameter("id");
//id удаляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnDelete
$eventType = $event->getEventType();
}
OnAfterDelete
Событие вызывается после удаления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после удаления элемента данного HL-блока.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAfterDelete', 'OnAfterDelete');
/**
*
* @param \Bitrix\Main\Entity\Event $event
*/
function OnAfterDelete(\Bitrix\Main\Entity\Event $event) {
$id = $event->getParameter("id");
//id удаляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnAfterAdd
$eventType = $event->getEventType();
if ($id > 30 && $id < 1000) {
// ваша логика....
}
}
Отличная статья! Помогло.