Основная идея системы событий заключается в возможности отслеживания базовых действий в системе. Это может быть добавление или изменение сайта, удаление раздела и проч.
Система генерирует событие по факту. Например, удаление раздела — это запрос к базе данных на удаление записи. Это и есть событие. При этом все так называемые слушатели (подписчики на событие) получат необходимые данные о его совершении. Подписчики назначаются при подключении модуля или библиотеки.
Важно: событие генерируется после обновления системной информации в базе данных. Если событие связано с удалением объекта, будет абсолютно бессмысленно пытаться получить данные об объекте после его удаления.
Система разделяет два типа событий: базовые системные события (те, которые уже содержатся в ядре системы) и пользовательские события (те, которые добавил сам разработчик сайта). Принципиально они ничем не отличаются.
У каждого события есть имя (в именах могут использоваться только латинские
буквы, цифры и знак подчеркивания). Имена всех системных событий строятся по
шаблону:
«действиеСущность».
В качестве действия могут выступать:
Сущности описаны в таблице ниже:
Название сущности | Ключевое слово сущности |
---|---|
Сайт | Catalogue |
Раздел | Subdivision |
Компонент в разделе | SubClass |
Компонент | Class |
Шаблон компонента | ClassTemplate |
Сообщение | Message |
Системная таблица | SystemTable |
Макет дизайна | Template |
Пользователь | User |
Комментарий | Comment |
Виджет | Widget |
Модуль | Module |
Таким образом событие addMessage возникает при добавление нового объекта, а событие dropUser – при удалении пользователя.
Начиная с версии 5.6 для обозначения событий можно использовать константы класса nc_event. Название констант состоят из трёх частей:
Таким образом, константы модуля nc_event имеют следующий вид: nc_event::BEFORE_OBJECT_DISABLED, nc_event::AFTER_COMPONENT_TEMPLATE_UPDATED, nc_event::AFTER_MODULES_LOADED и т. д.
Так как же работает система событий?
Каждое событие несёт в себе определённый набор параметров, которые могут быть использованы при его отслеживании. Например, при обновлении раздела (событие updateSubdivision) передаются параметры Catalogue_ID и Subdivision_ID, причём именно в указанной последовательности, т. к. в таком виде они попадут в функцию, вызываемую при «улавливании» события.
Ниже будет приведён более подробный пример с кодом.
Трансляция и «улавливание» событий происходит через расширение event системного объекта $nc_core. У данного расширения есть три метода, которые нас интересуют — bind(), add_listener() и execute(). Именно они отвечают за отслеживание и трансляцию событий.
Комментарии 1