Меню

Менеджер событий (EventManager) в 1C-Битрикс

Просмотров: 203

Менеджер событий (EventManager) — это централизованный механизм регистрации, обработки и управления событиями. Он обеспечивает гибкость и удобство работы с событиями в рамках D7 API.

even_manager.jpeg

Основные функции EventManager

  • Регистрация событий: Позволяет "подписаться" на события, происходящие в системе.
  • Обработка событий: Связывает определенные действия (обработчики) с событиями.
  • Управление событиями: Легко управлять подключенными обработчиками (добавлять, удалять или изменять их порядок).

Пример: при обновлении элемента инфоблока система генерирует событие OnAfterIBlockElementUpdate. В этот момент проверяется, есть ли подписанные обработчики для данного события. Если такие обработчики существуют, они будут вызваны менеджером событий в порядке их добавления.

Как зарегистрировать обработчик?

Регистрация обработчика событий выполняется с помощью метода EventManager::getInstance() класса Bitrix\Main\EventManager;:

EventManager::getInstance()->addEventHandler(
    moduleName,  // Модуль, в котором происходит событие
    eventName,   // Имя события
    callback,    // Обработчик (функция или метод)
    sort = 100,  // Приоритет вызова (чем ниже число, тем раньше вызывается)
);
  • moduleName — модуль, событие которого обрабатывается (например, "main" или "iblock").
  • eventName — имя события (например, "OnBeforeUserUpdate").
  • callback — функция или метод, который вызывается для обработки события.
  • sort — порядок вызова обработчиков. Чем ниже число, тем раньше вызывается обработчик.
  • arguments — дополнительные параметры (редко используются).

Пример использования EventManager

Представим, что при изменении элемента инфоблока нужно автоматически задать дату начала активности как текущую дату, а дату завершения активности — через 14 дней.

Для этого используем событие модуля "iblock" OnAfterIBlockElementUpdate. Код размещаем в файле init.php:

use Bitrix\Main\EventManager;
use Bitrix\Main\Loader;
// use Bitrix\Iblock\Elements\ElementTable;
use Bitrix\Main\Type\DateTime;

// Регистрируем обработчик через EventManager
EventManager::getInstance()->addEventHandler(
    "iblock",
    "OnAfterIBlockElementUpdate",
    ["UpdateBulletinsElements", "onAfterIBlockElementUpdateHandler"]
);

class UpdateBulletinsElements
{
    // Обработчик события
    public static function onAfterIBlockElementUpdateHandler(&$arFields)
    {
        if ($arFields['ACTIVE'] === 'Y') {
            if (!Loader::includeModule('iblock')) {
                return;
            }

            $currentDate = new DateTime();
            $dateActiveFrom = $currentDate->toString();
            $dateActiveTo = $currentDate->add('14D')->toString();

            // Обновляем элемент инфоблока
            $el = new CIBlockElement();
            $el->Update(
                $arFields['ID'],
                [
                    'ACTIVE_FROM' => $dateActiveFrom,
                    'ACTIVE_TO' => $dateActiveTo
                ]
            );

//            if (!$el->isSuccess()) {
//                $errors = $result->getErrorMessages();
//                AddMessage2Log('Ошибка обновления элемента: ' . implode(', ', $errors));
//            }
        }
    }
}

Менеджер событий в 1С-Битрикс — это мощный инструмент для управления бизнес-логикой. Он позволяет гибко обрабатывать системные события, добавлять свою логику и интегрировать платформу с внешними сервисами.

Михаил Базаров 30.12.2024
Если вы подключаете классы с помощью use, то эти классы будут загружены в скрипт при каждом его вызове, даже если обработчик фактически не выполняется. Это может немного повлиять на производительность, особенно если обработчик используется редко.

Код
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    "iblock",
    "OnAfterIBlockElementUpdate",
    ["UpdateBulletinsElements", "onAfterIBlockElementUpdateHandler"]
);

class UpdateBulletinsElements
{
    public static function onAfterIBlockElementUpdateHandler(&$arFields)
    {
        \Bitrix\Main\Loader::includeModule('iblock'));

        // Подключаем классы внутри обработчика
        $currentDate = new \Bitrix\Main\Type\DateTime();
        $dateActiveFrom = $currentDate->toString();
        $dateActiveTo = $currentDate->add('14D')->toString();

        // Обновляем элемент инфоблока
            $el = new CIBlockElement();
            $el->Update(
                $arFields['ID'],
                [
                    'ACTIVE_FROM' => $dateActiveFrom,
                    'ACTIVE_TO' => $dateActiveTo
                ]
            );
    }
}

В этом случае классы загружаются только тогда, когда они действительно нужны, что снижает нагрузку на сервер.
  • Если обработчик вызывается редко, подключайте классы внутри обработчика.
  • Если обработчик используется часто, то использование use оправдано.
  • Всегда учитывайте баланс между производительностью и удобством поддержки кода.

Стоимость и сроки разработки сайтов и приложений

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

Интернет магазин: разработка с нуля от 400 000 руб.
от 5-ти недель

Cоздание интернет-магазина на 1С-Битрикс. Разработка с нуля, оптимизация кода под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Интернет-магазин на готовом решении от 100 000 руб.
от 7-ми дней

Готовое решение — вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Запускается на одном из 200-та (на ваш выбор) готовых решений.

Мобильное приложение от 400 000 руб.
от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.