Блог Горошко Андрея 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

Управление файлами в Битрикс с помощью CFile: Сохранение, ресайз и удалениеУправление файлами в Битрикс с помощью CFile: Сохранение, ресайз и удаление

Средний рейтинг Еще нет оценок Работа с файлами — неотъемлемая часть веб-разработки. В Битрикс для этого существует мощный класс CFile. Он не просто работает с файлами на диске, но и регистрирует

Компонент main.ui.filter: Подключение и обработка фильтра для ГридаКомпонент main.ui.filter: Подключение и обработка фильтра для Грида

Средний рейтинг Еще нет оценок Таблица данных (main.ui.grid) почти всегда требует фильтрации. Для этого используется парный компонент bitrix:main.ui.filter. Он отображает строку поиска и выпадающую панель с условиями, сохраняет пресеты и настройки

Сила связей в D7 ORM: JOIN’ы и ReferenceField на практикеСила связей в D7 ORM: JOIN’ы и ReferenceField на практике

Средний рейтинг Еще нет оценок Мы уже умеем выбирать данные из одной таблицы с помощью getList. Но настоящая мощь ORM проявляется, когда нужно в одном запросе получить связанные данные из нескольких