Печать

Введение в плагины Joomla, принцип работы

В 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 и описать обработку событий в виде методов.

Интересная статья? Поделись ей с другими: