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

Как написать обработчик события

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

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

Анализ вызова события

Для начала разберемся в событиях как таковых. Теорию вы уже знаете, рассмотрим на практике.

Вызов обработчиков всегда одинаковый, меняются только переменные и логика обработки ответа. Для анализа необходимо обратиться к исходным кодам. Это можно сделать просмотрев файлы системы, а лучше с использованием модуля Живое АПИ.

Выберем для примера событие OnBeforeSocNetGroupAdd:

Количество переменных. В этом событии переменных всего одна ($arFields). Именно столько же переменных нам надо будет вызвать в нашем обработчике. Переменных также может быть две или больше, например в событии OnSocNetGroupAdd:

Переопределение переменных. Если перед одной из переменных стоит &, значит ее можно переопределить (это называется передача по ссылке).

Отмена действия. В нашем случае для события OnBeforeSocNetGroupAdd есть такая возможность:, если мы в нашем обработчике сделаем return false, группа создана не будет. А, к примеру, в OnSocNetGroupAdd возможности отмены действия нет. Ибо действие уже произведено.

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

Напомним теорию: для обработки событий в ваших модулях вам надо использовать RegisterModuleDependences. А для обработки в иных случаях вам надо использовать AddEventHandler.

Имя модуля нам известно (socialnetwork), имя события известно (OnBeforeSocNetGroupAdd), пишем функцию/метод по правилам из теории и не забываем про:

  • количество переменных
  • возможность переопределения
  • отмену действия

Как узнать что содержится в переменных, какие ключи массива и так далее?

Делаем вывод на экран переменных с завершением работы в теле функции:

echo '
'; print_r($arFields); echo '
'; die();

Отмена действий

Отмена действия с передачей ошибки в систему:

if ($GLOBALS['USER']->GetID() == 2) {
	$GLOBALS['APPLICATION']->throwException('Вы не можете создавать группы.');
	return false;
}

Результат

Мы собрали абстрактный обработчик, который добавляет к описанию группы правило, и запрещает пользователю с ID=2 создавать группы в принципе.

AddEventHandler('socialnetwork', 'OnBeforeSocNetGroupAdd', 'TestHandler');
function TestHandler(&$arFields) {
	$arFields['DESCRIPTION'] .= ' Ругаться матом запрещено!';
	if ($GLOBALS['USER']->GetID() == 2) {
		$GLOBALS['APPLICATION']->throwException('Вы не можете создавать группы.');
		return false;
	}
}
Совет от Антона Долганина: Лучше не плодить функции, а создать класс ваших обработчиков (в идеале по одному классу на каждый модуль), и писать обработчики внутри классов. Например, CForumHandlers::onBeforeTopicAdd();.
32
Курсы разработаны в компании «1С-Битрикс»

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