Joomla 1.5: Система событий.

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' и передали слушателям события параметр - массив, содержащий именя исполнителя и название дорожки. Все плагины получат эти параметры, и смогут обработать их.

Минусы реализации.

Минус триггерного метода состоит в том, что он не определяет, какая группа плагинов должна быть уведомлена о событии. Как следствие уведомляются все плагины, которые были загружены на момент события, независимо от группы, в которой они находятся. Поэтому важно удостовериться, что имя Вашего события не конфликтует с именем события никакой другой группы плагинов. Обычно это не проблема, потому что группу плагинов загружает Ваш компонент (коммуникитор), таким образом, Вы знаете, какая группа загружена. Однако имейте в виду, что "системная" группа плагинов загружается довольно близко к началу запроса. Удостоверьтесь, что у Вас нет никаких конфликтов имен событий с системными событиями.

Ну, вот и всё. Оригинал

Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 62 гостей онлайн