Блог Горошко Андрея 1C-Битрикс,Разработка Система событий в Битрикс: AddEventHandler и современный EventManager из D7

Система событий в Битрикс: AddEventHandler и современный EventManager из D7

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

Система событий — один из самых мощных механизмов в 1С-Битрикс. Она позволяет «вклиниваться» в стандартные процессы (например, перед добавлением товара в корзину или после обновления пользователя) и выполнять свой собственный код. Это ключевой принцип кастомизации, позволяющий обновлять систему без потери доработок.

Обработчики событий обычно размещают в файле /bitrix/php_interface/init.php (или /local/php_interface/init.php, что предпочтительнее).

1. Классический подход: AddEventHandler()

Это старый, но все еще широко используемый способ регистрации обработчика.

Синтаксис:
AddEventHandler(«ID_МОДУЛЯ», «НАЗВАНИЕ_СОБЫТИЯ», «ФУНКЦИЯ_ОБРАБОТЧИК»);

  • ID_МОДУЛЯ: Модуль, который инициирует событие (например, iblock, main, sale).
  • НАЗВАНИЕ_СОБЫТИЯ: Имя события (например, OnBeforeIBlockElementAdd).
  • ФУНКЦИЯ_ОБРАБОТЧИК: Имя глобальной функции или метод класса, который будет выполнен.

Пример: Установка символьного кода из названия перед добавлением элемента

Событие OnBeforeIBlockElementAdd срабатывает прямо перед тем, как элемент инфоблока будет сохранен в базу. Оно передает в обработчик массив полей $arFields по ссылке, что позволяет их изменить.

// В /local/php_interface/init.php

// Регистрируем обработчик
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", "SetElementCodeFromTitle");

// Сама функция-обработчик
function SetElementCodeFromTitle(&$arFields)
{
    // Работаем только с инфоблоком новостей (ID = 2)
    if ($arFields['IBLOCK_ID'] == 2 && empty($arFields['CODE'])) {
        $params = [
            "max_len" => 100, // Максимальная длина
            "change_case" => 'L', // Привести к нижнему регистру
            "replace_space" => '_', // Заменять пробелы
            "replace_other" => '_', // Заменять прочие символы
            "delete_repeat_replace" => true
        ];
        // Транслитерируем название и записываем в поле CODE
        $arFields['CODE'] = CUtil::translit($arFields['NAME'], "ru", $params);
    }
}

2. Современный подход D7: EventManager

В ядре D7 для работы с событиями предназначен класс \Bitrix\Main\EventManager. Синтаксис более современный и объектно-ориентированный.

Синтаксис:

use Bitrix\Main\EventManager;

$eventManager = EventManager::getInstance();
$eventManager->addEventHandler("ID_МОДУЛЯ", "НАЗВАНИЕ_СОБЫТИЯ", "ФУНКЦИЯ_ОБРАБОТЧИК");

Ключевое отличие: В D7-обработчик передается не набор аргументов, а один объект класса \Bitrix\Main\Event. Все параметры события нужно получать из этого объекта.

Пример: Та же задача на D7

// В /local/php_interface/init.php
use Bitrix\Main\EventManager;

$eventManager = EventManager::getInstance();
$eventManager->addEventHandler(
    'iblock',
    'OnBeforeIBlockElementAdd',
    ['MyEventHandlerClass', 'handleSetElementCode'] // Обработчик - статический метод класса
);

// Рекомендуется выносить обработчики в классы
class MyEventHandlerClass
{
    public static function handleSetElementCode(\Bitrix\Main\Event $event)
    {
        // Получаем параметры из объекта события
        $arFields = $event->getParameter("fields");

        if ($arFields['IBLOCK_ID'] == 2 && empty($arFields['CODE'])) {
            $params = ["max_len" => 100, "change_case" => 'L', "replace_space" => '_', "replace_other" => '_', "delete_repeat_replace" => true];
            $arFields['CODE'] = CUtil::translit($arFields['NAME'], "ru", $params);

            // Чтобы изменения применились, нужно создать объект Result и установить в него измененные поля
            $result = new \Bitrix\Main\Entity\EventResult();
            $result->modifyFields($arFields);
            
            // Возвращаем результат
            return $result;
        }
    }
}

Сравнение подходов

КритерийAddEventHandler (старое API)EventManager (D7)
АргументыНабор переменных, часто по ссылке (&$arFields)Один объект \Bitrix\Main\Event
Изменение данныхПрямое изменение переменных по ссылкеЧерез методы объекта EventResult
СтильПроцедурныйОбъектно-ориентированный
СовместимостьПолная, работает вездеПредпочтителен для новых проектов

Вывод:
Система событий — это ваш главный инструмент для безопасной кастомизации Битрикс. Для поддержки старого кода необходимо знать AddEventHandler, но для всех новых проектов настоятельно рекомендуется использовать EventManager и выносить логику обработчиков в отдельные классы. Это делает код более структурированным, читаемым и легко тестируемым.

AddEventHandler, EventManager, OnBeforeIBlockElementAdd, Битрикс события, обработчик событий, init.php, D7 события, модуль, event.

Мой рейтинг:

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

Related Post

Многосайтовость в Битрикс: Как разделить контент и шаблоныМногосайтовость в Битрикс: Как разделить контент и шаблоны

Средний рейтинг Еще нет оценок Многосайтовость — одна из ключевых «фишек» Битрикс. Она позволяет управлять неограниченным количеством сайтов (с разными доменами, шаблонами и контентом) из одной административной панели на базе

Создание собственных D7 ORM сущностей (таблиц) в Битрикс: Пошаговое руководствоСоздание собственных D7 ORM сущностей (таблиц) в Битрикс: Пошаговое руководство

Средний рейтинг Еще нет оценок Работать с готовыми ORM-сущностями вроде ElementTable — это хорошо, но настоящая сила D7 ORM раскрывается, когда вы создаете собственные таблицы для хранения данных вашего модуля. Давайте создадим

Заполнение тега 1260 фискального документа: как передать данные о проверке маркировкиЗаполнение тега 1260 фискального документа: как передать данные о проверке маркировки

Средний рейтинг Еще нет оценок С 21 ноября 2023 года в силу вступило постановление Правительства РФ №1944, которое обязывает продавцов фиксировать факт и время проверки кода маркировки. Эти данные нужно