Блог Горошко Андрея 1C-Битрикс События в D7 ORM: OnBeforeAdd, OnAfterUpdate и другие. Полный контроль над данными

События в D7 ORM: OnBeforeAdd, OnAfterUpdate и другие. Полный контроль над данными

Средний рейтинг
Еще нет оценок

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.

Мой рейтинг:

Добавить комментарий

Related Post

Как работать с HL-блоками в 1С-БитриксКак работать с HL-блоками в 1С-Битрикс

Средний рейтинг Еще нет оценок В этой статье я расскажу вам, как работать с HL-блоками в 1С-Битрикс, используя API Bitrix. HL-блоки (Highload-блоки) — это специальные сущности, которые позволяют хранить и

Современные компоненты Битрикс: Переходим на class.phpСовременные компоненты Битрикс: Переходим на class.php

Средний рейтинг Еще нет оценок Традиционно вся логика компонента Битрикс размещалась в файле component.php. Это простой и понятный подход, но для сложных компонентов он приводит к «лапше» из кода. Современный стандарт

 Безопасность AJAX-компонентов: Подписанные параметры (SignedParameters) Безопасность AJAX-компонентов: Подписанные параметры (SignedParameters)

Средний рейтинг Еще нет оценок Когда вы делаете компонент асинхронным (AJAX), его параметры ($arParams) становятся уязвимы. Злоумышленник может изменить их прямо в JavaScript-коде перед отправкой запроса. Например, подменить IBLOCK_ID и получить доступ