В Joomla реализована очень мощная и гибкая система для обработки событий. Придерживаясь идеологии эффективного ООП реализована "система наблюдения (прослушивания)", которая реагирует на зарегистрированные события и выполняет какие либо функции. Проще говоря - они позволяют писать собственные расширения ядра Joomla, без его модификаций.
Реализация
Система событий базируется на двух классах
- JPlugin - наблюдаемый класс.
- JEventDispather - класс- наблюдатель.
/**
* JPlugin Class
*
* @package Joomla.Framework
* @subpackage Application
* @since 1.5
*/
class JPlugin extends JObserver
{
/**
* Constructor
*
* For php4 compatability we must not use the __constructor as a constructor for plugins
* because func_get_args ( void ) returns a copy of all passed arguments NOT references.
* This causes problems with cross-referencing necessary for the observer design pattern.
*
* @param object $subject The object to observe
* @since 1.5
*/
function JPlugin(& $subject)
{
parent::__construct($subject);
}
/**
* Method to map events to handler methods
*
* @access public
* @param array Arguments
* @return mixed Routine return value
* @since 1.1
*/
function update( &$args )
{
/*
* First lets get the event from the argument array. Next we will unset the
* event argument as it has no bearing on the method to handle the event.
*/
$event = $args['event'];
unset($args['event']);
/*
* If the method to handle an event exists, call it and return its return
* value. If it does not exist, return a boolean true.
*/
if (method_exists($this, $event)) {
return call_user_func_array(array($this, $event), $args);
} else {
return true;
}
}
}
Этот класс делает две очень важные вещи.
Первое - это конструктор класса, который создаст экземпляр родительского класса JObserver. Вот что происходит в нем:
// Регистрация наблюдателя
$subject->attach($this);
// Установка объекта наблюдения
$this->_subject = &$subject;
Вторая важная вещь - это метод update. Метод получает массив из триггера, который содержит в себе два элемента - название события и список аргументов. После того как был вызван update, информация о названии события извлекается в отдельную переменную и удаляется, далее вызывается метод "event", в который передаются все параметры. В итоге Update - это ответ из self::$event($args);
Пример стороннего плагина
jimport('joomla.plugin');
/**
* Example Plugin
*/
class ExamplePlugin extends JPlugin
{
/**
* Обязательный конструктор класса
*/
function ExamplePlugin( &$subject ) {
parent::__construct( $subject );
}
/**
* Этот метод является обработчиком для события onIncrement.
* Он получает в виде аргумента целое число и делает инкремент (+1).
*/
function onIncrement($input)
{
return $input++;
}
}
Как видно, плагин сделать очень просто - достаточно правильно расширить класс JPlugin и описать обработку событий в виде методов.