Дата последнего изменения: 13.11.2023
Поставим перед собой абстрактную задачу: пусть для каждой создаваемой группы в соцсети (или в корпортале) в описание добавляется информация о том, что ругаться нельзя и некоторому пользователю вообще нельзя создавать группы.
Для начала разберемся в событиях как таковых. Теорию вы уже знаете, рассмотрим на практике.
Вызов обработчиков всегда одинаковый, меняются только переменные и логика обработки ответа. Для анализа необходимо обратиться к исходным кодам. Это можно сделать просмотрев файлы системы, а лучше с использованием модуля Живое АПИ.
Выберем для примера событие 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();. |