Joomla 1.5: Система событий.
Joomla 1.5 имеет систему событий, основанную на реализации шаблона проектирования Observer. И эта система очень неплохо заточена для обеспечения взаимодействия между компонентами, модулями и плагинами системы.
Основная идея в том, что один или более "наблюдателей" ( или "слушателей" ) регистрируют себя в системе, для какого - нибудь события. Во время определённого момента времени, приложение "коммуникатор" ( это может быть компонент, модуль или плагин) запускает событие, передавая некоторую информацию всем наблюдателям, подписавшимся на него. Наблюдатели могут взаимодействовать с информацией, передаваемой им, и даже возвращать какой - нибудь результат коммуникатору.
Joomla 1.5 Реализации Наблюдателя
Шаблон Observer реализуется в Joomla1.5 на глобальном уровне: через классы JPlugin (Observer) и JDispatcher (Observable). Если мы хотим работать со своими событиями, то нам нужно создать плагин, который расширит класс JPlugin. Подклассы JPlugin автоматически регистрируют себя в глобальном классе JDispatcher, во время подгрузки их категории (подробнее об этом позже). В качестве механизма диспетчеризации используется класс JDispatcher, который получает события от коммуникаторов и передает их слушателям.
Цель Коммуникаторов
Представим такую ситуёвину, скажем, у Вас есть компонент - библиотека компакт-дисков(CD). И тут Вас озаряет: что неплохо бы сообщать пользователям, когда кто то добавляет в библиотеку новый CD. Глядишь посещалка подымется.В этом случае мы можем описать своё событие, например: onCdAddedToLibrary, и в нужное время, "инициировать" его. Все плагины, которые "подписаны" на это событие сразу же получат извещение и нужную информацию, и смогут обработать её требуемым образом - например запустить почтовую рассылку уведомлений, что у вас появились новые фильмы.
Реализация Коммуникаторов
Так как вся диспетчеризация реализована на уровне ядра Joomla, то будет легко реализовать коммуникатор. Фактически, это - всего лишь вопрос загрузки определенной группы плагинов и запроса триггерного метода класса JDispatcher.
Есть один момент - плагины управляются на групповом уровне, группа плагина определяется в XML - файле установки. Есть восемь предопределенных групп, и каждая группа обрабатывает определённый набор задач.
Например, есть "поисковая" группа, которая предназначается, чтобы обрабатывать события поиска, и "пользовательская" группа плагинов для обработки событий пользователя, такие, как добавление и удаление пользователей Joomla. Эти группы загружаются коммуникатором, только тогда, когда они необходимы. Таким образом, Вы можете создать свою собственную группу и назвать ее так, как Вы хотите.А Ваш компонент должен определить, всех слушателей, которые будут знать, к какой группе и событиям они должны прислушиваться.
Как Инициировать События
Подходим к самому интересному: как инициировать события, что бы наши плагины могли реагировать на них? - Первая вещь, которую нужно сделать, это загрузить группу события:
JPluginHelper::importPlugin( 'myplugingroup' );
Это загрузит все подключенные плагины, которые определены как часть Вашей группы. Следующее, что нужно сделать - получить экземпляр класса JDispatcher:
$dispatcher =& JDispatcher::getInstance();
Здесь пара нюансов: Во-первых, чтобы создать новый экземпляр мы используем метод getInstance(), а не оператор "new". Это - метод корректного получения объекта класса JDispatcher ( здесь речь идёт о реализации классом JDispatcher - шаблона Singleton ), который содержит список всех доступных плагинов. Во-вторых, мы используем конструкцию =&, для получения значения по ссылке. Это приемлемо только для версии PHP <= 4!
Затем, мы должны инициировать наше собственное событие:
$results = $dispatcher->trigger( 'onCdAddedToLibrary', array( &$artist, &$title ) );
Здесь мы инициировали событие 'onCdAddedToLibrary' и передали слушателям события параметр - массив, содержащий именя исполнителя и название дорожки. Все плагины получат эти параметры, и смогут обработать их.
Минусы реализации.
Минус триггерного метода состоит в том, что он не определяет, какая группа плагинов должна быть уведомлена о событии. Как следствие уведомляются все плагины, которые были загружены на момент события, независимо от группы, в которой они находятся. Поэтому важно удостовериться, что имя Вашего события не конфликтует с именем события никакой другой группы плагинов. Обычно это не проблема, потому что группу плагинов загружает Ваш компонент (коммуникитор), таким образом, Вы знаете, какая группа загружена. Однако имейте в виду, что "системная" группа плагинов загружается довольно близко к началу запроса. Удостоверьтесь, что у Вас нет никаких конфликтов имен событий с системными событиями.
Ну, вот и всё. Оригинал