Приведём полноценный пример использования системы событий.
Допустим, мы хотим отслеживать авторизацию пользователей из группы «Администрация» (группа имеет номер 1). По итогам администратор будет получать письмо с уведомлением о каждой авторизации пользователя.
Весь код можно поместить в модуль «Интерфейс разработчика», в файл /netcat/modules/default/function.inc.php.
Для отслеживания события authorizeUser (авторизация пользователя) введём класс ListenUser:
class ListenUser { public function __construct () { $nc_core = nc_Core::get_object(); $nc_core->event->bind($this, array('authorizeUser' => 'authorize_user') ); } }
У нашего класса есть конструктор, в котором две строчки:
на первой строчке идёт получение системного объекта $nc_core, который содержит расширение event, нужное для работы с событиями;
на второй строчке конструктора идёт привязывание события authorizeUser к объекту класса ListenUser. При трансляции события authorizeUser будет вызван метод authorize_user нашего класса. Теперь приведем сам метод authorize_user, который узнает номер группы пользователя и, в случае необходимости, отправляет письмо:
public function authorize_user ( $user_id ) { $nc_core = nc_Core::get_object(); $system_env = $nc_core->get_settings(); $groups = nc_usergroup_get_group_by_user($user_id); if ( in_array( 1, $groups ) ) { $mailer = new CMIMEMail(); $mailer->mailbody('Авторизация пользователя '.$user_id); $mailer->send( 'admin@example.com', $system_env['SpamFromEmail'], $system_env['SpamFromEmail'], 'Авторизация пользователя', $system_env['SpamFromName'] ); } return 0; }
В начале работы этой функции мы получаем системный объект $nc_core, далее с помощью метода get_settings получаем настройки системы и записываем их в массив $system_env. Этот массив содержит такие элементы, как:
$system_env['SpamFromEmail'] — адрес, откуда отправляются письма
и
$system_env['SpamFromName'] — имя, от которого отправляются письма.
Эти параметры задаются в настройках системы (меню: «Настройки» — «Настройки системы»).
С помощью функции nc_usergroup_get_group_by_user можно получить номера всех групп, в которых состоит пользователь. Описание этой функции можно найти в главе «Функции для работы с группами пользователей» данного руководства.
После того, как в массив $groups мы записали номера всех групп авторизированного пользователя, нужно проверить, входит ли в них группа с номером 1. Для этого используется php-функция in_array. Если нужная группа входит в их число – отправляем письмо с помощью класса CMIMEMail. Данный класс также описан в данном руководстве, так что останавливаться на нем не будем, отметим только то, что письмо отправится на адрес admin@example.com.
После того, как класс был объявлен, надо создать его экземпляр:
$listenObj = new ListenUser();
В итоге файл будет выглядеть так:
<?php class ListenUser { public function __construct () { $nc_core = nc_Core::get_object(); $nc_core->event->bind($this, array('authorizeUser' => 'authorize_user') ); } public function authorize_user ( $user_id ) { $nc_core = nc_Core::get_object(); $system_env = $nc_core->get_settings(); $groups = nc_usergroup_get_group_by_user($user_id); if ( in_array( 1, $groups ) ) { $mailer = new CMIMEMail(); $mailer->mailbody('Авторизация пользователя '.$user_id); $mailer->send( 'admin@example.com', $system_env['SpamFromEmail'], $system_env['SpamFromEmail'], 'Авторизация пользователя', $system_env['SpamFromName'] ); } return 0; } } $listenObj = new ListenUser(); ?>
Теперь, после авторизации пользователя из группы «Администрация», администратору сайта будет отправлено письмо-уведомление на адрес admin@example.com.
Внимание! Чтобы отследить события внутри любого модуля следует отметить чекбокс "Загружать всегда" напротив его названия в списке модулей системы.
Внимание! Чтобы отследить внутри одного модуля события другого модуля, для прикрепления слушателей следует использовать событие nc_event::AFTER_MODULES_LOADED
, чтобы избежать возможных проблем из-за порядка загрузки модулей:
nc_core::get_object()->event->add_listener(nc_event::AFTER_MODULES_LOADED, function() { // инициализация слушателя событий });