Дата последнего изменения: 24.01.2024
Модули могут взаимодействовать между собой двумя способами: явно (прямым вызовом) и скрыто (через систему событий).
Явное взаимодействие с помощью API. Подразумевает подключение модуля с помощью метода CModule::IncludeModule(указав в качестве параметра id модуля) с последующим непосредственным вызовом метода класса или функции модуля.
Пример явного взаимодействия:
<? // подключаем модуль mymodule if (CModule::IncludeModule("mymodule")) { // выполним его метод CMyModuleClass::DoIt(); } ?>
Сущность событие позволяет сделать модули максимально независимыми друг от друга. Модуль ничего не знает об особенностях функционирования другого модуля, но может взаимодействовать с ним через интерфейс событий.
Схема работы с событиями. Модуль, инициирующий событие, в том месте кода, где это событие происходит, должен выполнить следующее:
/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("init_module", "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; } } ?>