--=REKLAMA=--
JEventDispatcher
nie jest używana w Joomla 2.5. W tym przypadku należy zamienić klasę JEventDispatcher
na klasę JDispatcher
. Wykorzystywanie klasy JDispatcher
jest możliwe w Joomla 3.x lecz będzie generować uwagę o przestarzałości takiego rozwiązania.Joomla! 1.5 wprowadziła klasę JPlugin
. Celem stworzenia z Joomla! bardziej wydajnego, zorientowanego obiektowo środowiska przygotowano nowy system tworzenia dodatków uwzględniający wzorzec projektowy Obserwator. Dodatki to klasy typu Obserwator powiązane w jądrze Joomla! z obiektem odpowiedzialnym za globalne wyzwalanie zdarzeń. Co to "po ludzku" znaczy? Znaczy to tyle, że albo jądro Joomla! albo niezależny komponent lub moduł mogą uruchomić wykonanie kodu przez jeden lub kilka dodatków.
Wdrożenie systemu dodatków to wdrożenie wzorca projektowego Obserwator. Składa się on z dwóch części, klasy obserwatora JPlugin
, oraz klasy obserwowanej JEventDispatcher
.
/** * JPlugin Class * * @package Joomla.Platform * @subpackage Plugin * @since 11.1 */ class JPlugin extends JEvent { /** * Constructor * * @param object &$subject The object to observe * @param array $config An optional associative array of configuration settings. * Recognized key values include 'name', 'group', 'params', 'language' * (this list is not meant to be comprehensive). * * @since 11.1 */ public function __construct(&$subject, $config = array()) { // Get the parameters. if (isset($config['params'])) { if ($config['params'] instanceof JRegistry) { $this->params = $config['params']; } else { $this->params = new JRegistry; $this->params->loadString($config['params']); } } // Get the plugin name. if (isset($config['name'])) { $this->_name = $config['name']; } // Get the plugin type. if (isset($config['type'])) { $this->_type = $config['type']; } // Load the language files if needed. Note whilst this method is in the // JPlugin class it has been left out of the docs for code clarity. if ($this->autoloadLanguage) { $this->loadLanguage(); } parent::__construct($subject); } }
Dwie ważne rzeczy składają się na to że klasa działa.
Jedną jest konstruktor, który zostaje wywołany przez klasę nadrzędną (rodzica) klasy JEvent
.
Poniżej ilustracja działania konstruktora:
// Register the observer ($this) so we can be notified $subject->attach($this); // Set the subject to observe $this->_subject = &$subject;
Prowadzi to do dołącznia klasy JPlugin
do obserwowanego obiektu. W przypadku wtyczek obserwują one obiekt JEventDispatcher
.
Druga ważna rzecz, którą należy odnotować, to metoda update
w klasie JEvent
. Metoda update
otrzymuje tablicę od obiektu wywołującego. Tablica zawiera dwa elementy: rodzaj zdarzenia i argumenty. W chwili otrzymania tablicy metoda update
odczytuje rodzaj zdarzenia i oddziela go od argumentów. Następnie wywołuje metodę o nazwie event
(przekazując tablicę z argumentami) i zwraca odpowiedź tej metody.
<?php /** * @version $Id: $ * @package * @subpackage * @copyright * @license */ jimport('joomla.plugin'); /** * Example Plugin * * @author * @package * @subpackage * @since */ class ExamplePlugin extends JPlugin { /** * This method handles the onIncrement fictional event. It takes an integer input and * increments its value. * * @param integer $input An integer to increment * * @return integer Incremented integer * * @since 3.x * @access public */ function onIncrement($input) { return $input++; } } ?>
Jak widać stworzenie klasy JPlugin
jest dość proste. Jest to tak proste jak utworzenie klasy dziedziczącej po klasie JPlugin
i utworzenie metody dla każdego zdarzenia przetwarzanego przez dodatek.