1C-Битрикс: Управление сайтом

Взаимодействие модулей

Модули могут взаимодействовать между собой двумя способами: явно (прямым вызовом) и скрыто (через систему событий).

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

Явное взаимодействие подразумевает:

  • Подключение модуля с помощью функции CModule::IncludeModule
  • Непосредственный вызов метода класса или функции модуля

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

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

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

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

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

  • Собрать все зарегистрированные обработчики с помощью функции GetModuleEvents.
  • Выполнить их по одному с помощью функции ExecuteModuleEvent, обрабатывая соответстсвующим образом возвращаемые обработчиками значения.
В свою очередь, модуль который хочет выполнить какие либо действия на это событие должен:
  • Зарегистрировать в момент инсталляции свой обработчик. Регистрация осуществляется с помощью функции RegisterModuleDependences.
  • Соответственно необходимо иметь эту функцию-обработчик и убедиться, что скрипт, в котором эта функция находится, подключается в файле /bitrix/modules/ID модуля/include.php.

Таким образом событие - это какое либо произвольное действие, в момент выполнения которого (до или после) собираются все обработчики этого события и выполняются по одному.

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

Список событий главного модуля доступен в разделе "События".

Пример взаимодействия через события:

<?
// регистрация обработчика:
// когда в модуле init_module возникнет событие OnSomeEvent
// будет вызван метод CMyModuleClass::Handler модуля handler_module

RegisterModuleDependences(
    "init_module", "OnSomeEvent",
    "handler_module", "CMyModuleClass", "Handler"
    );
?>
<?
// произвольная функция модуля init_module
// в которой генерируется событие

function MyFunction()
{
    // здесь располагается произвольный код 
    // представляющий из себя событие

    // далее следует сбор зарегистрированных обработчиков
    $rsHandlers = GetModuleEvents("anothermodule", "OnSomeEvent");
    while($arHandler = $rsHandlers->Fetch())
    {
        // и их выполнение по одному
        if(!ExecuteModuleEvent($arHandler, $param1, $param2))
        {
            // если обработчик вернет false, 
            // то например, вернем надпись "I can't do it..."
            return "I can't do it...";
        }
    }
    return "I have done it!";
}
?>
<?
// обработчик

class CMyModuleClass
{
    function Handler($param1, $param2)
    {
        if($param1=="delete all")
            return false;
        return true;
    }
}
?>

Пользовательские комментарии

Пользовательские комментарии не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Добавлять комментарии могут только зарегистрированные пользователи. Сообщения для просмотра появляются после модерации.
© «Битрикс», 2001-2012, «1C-Битрикс», 2012