376  /  382
Справочник

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

Просмотров: 45533
Дата последнего изменения: 24.01.2024
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

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

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

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

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

<?
// подключаем модуль 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("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;
	}
}
?>

38
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии