D7 ORM предоставляет мощный механизм событий, который позволяет вмешиваться в процесс сохранения, обновления или удаления данных.
Это правильный способ добавить бизнес-логику (например, проверку, отправку уведомлений, изменение связанных данных), не переписывая стандартные методы add, update, delete.
Все события описываются как статические On… методы прямо в классе вашей *Table.
Типы событий
Для каждой CRUD-операции существует три события:
- Добавление: OnBeforeAdd, OnAdd, OnAfterAdd
- Обновление: OnBeforeUpdate, OnUpdate, OnAfterUpdate
- Удаление: OnBeforeDelete, OnDelete, OnAfterDelete
Самые полезные из них — OnBefore… (для проверки и изменения данных) и OnAfter… (для выполнения действий после успешной операции).
Структура обработчика
Каждый метод-обработчик принимает один аргумент — объект \Bitrix\Main\Entity\Event.
Из него можно получить данные, а для OnBefore… событий — вернуть результат \Bitrix\Main\Entity\EventResult, чтобы повлиять на операцию.
Пример 1: Валидация и модификация данных перед добавлением (OnBeforeAdd)
Задача: Перед добавлением элемента в HL-блок «Заказы» проверить, что поле UF_PRICE больше нуля. Если не заполнено поле UF_CREATED_AT, установить текущее время.
// В классе вашей сущности MyOrdersTable extends \Bitrix\Main\Entity\DataManager
use Bitrix\Main\Entity;
use Bitrix\Main\Type\DateTime;
public static function OnBeforeAdd(Entity\Event $event)
{
$result = new Entity\EventResult();
$data = $event->getParameter("fields"); // Получаем массив полей
// 1. Валидация
if (isset($data['UF_PRICE']) && (float)$data['UF_PRICE'] <= 0) {
$result->addError(new Entity\EntityError(
"Цена должна быть положительным числом."
));
}
// 2. Модификация
$modifiedData = $data;
if (empty($modifiedData['UF_CREATED_AT'])) {
$modifiedData['UF_CREATED_AT'] = new DateTime();
}
// Передаем измененные данные обратно
$result->modifyFields($modifiedData);
return $result;
}
- $event->getParameter(«fields»): Возвращает массив данных, которые пытаются сохранить.
- $result->addError(): Добавляет ошибку. Если есть хотя бы одна ошибка, операция add будет прервана.
- $result->modifyFields(): Позволяет изменить данные перед их записью в БД.
Пример 2: Действие после успешного обновления (OnAfterUpdate)
Задача: После изменения статуса заказа (поле UF_STATUS_ID) на «Выполнен» (ID=4), нужно сбросить тегированный кэш страницы этого заказа.
use Bitrix\Main\Application;
public static function OnAfterUpdate(Entity\Event $event)
{
$primary = $event->getParameter("id"); // Первичный ключ (ID) записи
$id = $primary["ID"];
$data = $event->getParameter("fields");
// Проверяем, был ли изменен статус и стал ли он "Выполнен"
if (isset($data['UF_STATUS_ID']) && $data['UF_STATUS_ID'] == 4) {
// Сбрасываем тегированный кэш
$taggedCache = Application::getInstance()->getTaggedCache();
$taggedCache->clearByTag('order_id_' . $id);
// Тут можно отправить email-уведомление и т.д.
}
}
- $event->getParameter(«id»): Возвращает массив с первичным ключом обновленной записи.
- $event->getParameter(«fields»): Возвращает только те поля, которые были переданы в метод update.
Вывод:
События ORM — это чистый и правильный способ встраивать вашу бизнес-логику в стандартные процессы работы с данными. Используйте OnBefore… для контроля и модификации данных, а OnAfter… для выполнения побочных эффектов (сброс кэша, уведомления).
Это делает ваш код предсказуемым, поддерживаемым и соответствующим архитектуре D7.
D7 ORM события, OnBeforeAdd, OnAfterUpdate, OnBeforeDelete, EventResult, modifyFields, валидация данных, DataManager.