Полный цикл в digital

События в модуле Bitrix

Модули могут взаимодействовать между собой двумя способами:

  1. Явно прямым вызовом исполняемого файла
  2. Скрыто через систему событий

Явное взаимодействие

Явное взаимодействие с помощью API. Подразумевает подключение модуля с помощью метода CModule::IncludeModule(), указав в качестве параметра id модуля с последующим непосредственным вызовом метода класса или функции модуля. Пример явного взаимодействия:

<?
// подключаем модуль
if (CModule::IncludeModule("mymodule"))
{
    // выполним метод модуля
    CMyModuleClass::DoIt();
}

Скрытное взаимодействие через события

Событие - это произвольное действие, в момент выполнения которого собираются все обработчики этого события и выполняются по одному. Обычно для регистрации событий в системе есть два метода RegisterModuleDependences и AddEventHandler.

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

Схема работы

Модуль, инициирующий событие, в том месте кода, где это событие происходит, должен выполнить следующее:

  • Собрать все зарегистрированные обработчики с помощью функции GetModuleEvents
  • Выполнить их по одному с помощью функции ExecuteModuleEvent, обрабатывая соответствующим образом возвращаемые обработчиками значения

В свою очередь, модуль, который хочет выполнить какие-либо действия на это событие, должен:

  • Зарегистрировать в момент инсталляции свой обработчик с помощью функции RegisterModuleDependences
  • Соответственно необходимо иметь эту функцию-обработчик и убедиться, что скрипт, в котором эта функция находится, подключается в файле local/modules/ID модуля/include.php

В Бтрикс есть два способа регистрации события, которое потом можно отследить и выполнить соответствующую логику:

  • RegisterModuleDependences вызывается 1 раз за время работы проекта, например при установке модуля. Обработчик регистрируется в базе с указанием модуля, в котором определен обработчик. Срабатывание события, приведет к подключению модуля. Вот ссылка на документацию RegisterModuleDependences. Как следует из названия Эта функция регистрирует зависимости модуля. Ее стоит использовать когда вы разрабатываете свой модуль для битрикса. По сути вызов этого метода создает запись в таблице b_module_to_module
  • AddEventHandler исполняется на каждом хите, дополняет массив обработчиков собранных из базы. Вот ссылка на документацию OnAfterIBlockElementAdd, срабатывает на каждом хите

Пример взаимодействия

Ярким примером взаимодействия, является взаимодействие модулей системы с модулем Поиска. Этот модуль не имеет никакой информации о данных других модулей, особенностях их хранения и обработки. Он только предоставляет интерфейс для индексации данных. Любой модуль системы, который должен индексироваться, при инсталляции регистрирует обработчик на событие OnReindex. Каждый такой обработчик в свою очередь возвращает данные для индексации, которые модуль Поиска использует для наполнения своей базы.

Если быть проще, ниже приведен наглядный пример как это устроено.

Регистрация обработчика события, когда в модуле init_module возникнет событие OnSomeEvent, будет подключен модуль handler_module, вызван класс CMyModuleClass::Handler и метод BeforeIndex:

install/index.php// заносим при инсталяции модуля в базу событие
function InstallEvents()
{
        RegisterModuleDependences("init_module", "OnSomeEvent", "handler_module", "\\CMyModuleClass\\Handler", "BeforeIndex");
}
// удаляем при диинсталяции модуля из базы событие
function UnInstallEvents()
{
        UnRegisterModuleDependences("init_module", "OnSomeEvent", "handler_module", "\\CMyModuleClass\\Handler", "BeforeIndex");
}

Генерация события, произвольная функция модуля init_module в которой генерируется событие OnSomeEvent:

function MyFunction()
{

    // здесь располагается произвольный код представляющий из себя реализацию логики события

    // собираем зарегистрированные через RegisterModuleDependences и AddEventHandler обработчики события OnSomeEvent
    $rsHandlers = GetModuleEvents("init_module", "OnSomeEvent");
    // перебираем зарегистрированные в системы события
    while($arHandler = $rsHandlers->Fetch())
    {
        // выполняем каждое зарегистрированное событие по одному
        ExecuteModuleEventEx($arHandler, array(/* параметры которые нужно передать в модуль */));
    }
}

Обработчик события, класс и метод который подключен к модулю через файл include.php, сам файл находится в директории libs/eventhandler.php и имеет следующие содержимое:

libs/eventhandler.phpnamespace CMyModuleClass;
class Handler
{
    public static function BeforeIndex()
    {
      // код который должен выполнится
    }
}
include.phpBitrix\Main\Loader::registerAutoloadClasses(
	// имя модуля
	"handler_module",
	array(
		// ключ - имя класса с простанством имен, значение - путь относительно корня сайта к файлу
		"CMyModuleClass\\Handler" => "lib/eventhandler.php",
	)
);
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг