--=REKLAMA=--
System zdarzeń w Joomla! udostępnia elastyczne metody pozwalające na komunikację komponentów, modułów i wtyczek z innymi dodatkami poprzez wzorzec projektowy Obserwator. Całość najprościej można opisać jako prosty system komunikacji. Podstawowym założeniem jest to, że zero lub więcej "obserwatorów" lub "słuchaczy" (czyli po prostu pluginów) rejestruje się w systemie do pewnego zdarzenia. W określonym momencie cyklu życia danej aplikacji, "komunikator" (w naszym przypadku komponent, moduł lub wtyczka) wyzwala zdarzenie, przekazując informacje do wszystkich obserwatorów. Obserwator może wtedy wykonać jakieś działanie na podstawie przekazanych do niego informacji i ewentualnie zwrócić rezultat swoich operacji do komunikatora.
Joomla! implementuje wzorzec obserwatora na poziomie globalnym poprzez klasy JPlugin (obserwator) i JEventDispatcher (obserwowany). Chcąc obserwować zdarzenia należy stworzyć plugin rozszerzający klasę JPlugin
. Podklasy JPlugin
automatycznie są logowane do globalnej klasy JEventDispatcher
, kiedy ich kategoria zostaje załadowana (o tym później). Klasa JEventDispatcher
jest używana jako mechanizm przekazujący, który odbiera zdarzenia z komunikatorów i przekazuje je dalej do załadowanych słuchaczy. Więcej informacji na ten temat znajdziesz w tym temacie Tworzenie dodatków - omówienie.
Kiedyś może nadejść moment, w którym stwierdzisz, że warto byłoby powiadomić innych, że w twoim komponencie doszło do jakichś zdarzeń. Za przykład może posłużyć komponent biblioteki płyt kompaktowych. Możesz stwierdzić, że dobrze by było powiadomić innych, że dodano nową płytę do biblioteki. W takim wypadku należy stworzyć nowe zdarzenia (na przykład onCdAddedToLibrary
) i w odpowiednim momencie wyzwolić zdarzenie, przekazując informacje o nowej płycie. Wszystkie pluginy, które podpięte są do tego zdarzenia (nasłuchują go), zostaną natychmiast powiadomione o dodaniu nowej płyty do biblioteki.
Ponieważ wszystkie dyspozycje są obsługiwane przez rdzeń Joomla!, łatwo można zostać zostać komunikatorem. Ogranicza się to do załadowania pewnego zestawu wtyczek, oraz wywołanie metody wyzwalającej klasy JEventDispatcher
.
Możesz się zastanawiać, skąd masz wiedzieć jaki zestaw wtyczek załadować? To zależy od Ciebie. Zarządzanie pluginami odbywa się na poziomie grupy, która została przez ciebie zdefiniowana w pliku XML wtyczki. Istnieje osiem predefiniowanych grup i każda przeznaczona jest do obsługi innego zestawu zdarzeń. Przykładowo mamy grupę wtyczek search, która przeznaczona jest do obsługi wyszukiwania oraz user, która przechwytuje zdarzenia związane z użytkownikami, takie jak dodawanie czy usuwanie użytkownika z Joomla! Grupy te ładowane są tylko wtedy gdy są potrzebne, a dzieje się to dzięki komunikatorowi. Jeśli stworzysz więc własną grupę, możesz ją załadować wszędzie tam, gdzie będziesz jej potrzebował. W każdym takim miejscu będą załadowani słuchacze (wtyczki), ze zdefiniowanej grypy, do obsługi konkretnych zdarzeń.
Mając już zarys teoretyczny można przejść do praktycznych zastosowań. Co zrobić, aby wyzwolić zdarzenia, tak by nasłuchujące wtyczki mogły je obsłużyć? Po pierwsze musimy załadować grupę wtyczek, z którą chcemy pracować. Robimy to poniższym kodem:
JPluginHelper::importPlugin( 'myplugingroup' );
Kod ten załaduje wszystkie aktywne wtyczki, które zostały przypisane do grupy myplugingroup. Następną rzeczą którą musisz zrobić, jest pobranie instancji klasy JEventDispatcher
:
$dispatcher = JEventDispatcher::getInstance();
Zwróć tutaj uwagę na pewną rzecz. Używamy metody getInstance()
, nie new
do utworzenia nowej instancji klasy. Jest tak ponieważ próbujemy uzyskać instancję singletonu globalnego obiektu JEventDispatcher, który zwiera listę wszystkich dostępnych wtyczek.
Następnie musimy wyzwolić nasze zdarzenia:
$results = $dispatcher->trigger( 'onCdAddedToLibrary', array( &$artist, &$title ) );
Tutaj wywołujemy zdarzenie onCdAddedToLibrary
i przekazujemy w nim imię artysty oraz tytuł utworu. Wybór liczby i typu parametrów zależy tylko od Ciebie. Przekazując parametry poprzez referencję (dodając &), pozwalasz pluginowi (słuchaczowi) na zmianę wartości parametru. Wszystkie wtyczki otrzymają te parametry, przetworzą je i ewentualnie zwrócą jakieś informacje. Kod wywołujący może uzyskać dostęp do tych informacji poprzez zmienną $results
, która jest tablicą (każdy element tablicy, jest wartością zwróconą przez jedną wtyczkę).
Tworząc zdarzenia dla wtyczek, tworzysz w praktyce API. Właściwe planowanie jest w tym wypadku bardzo ważne. Po udostępnieniu kodu inni developerzy będą zależni od nazw i parametrów zdefiniowanych przez Ciebie zdarzeń. Późniejsze zmiany w tym zakresie będą powodowały złamanie kompatybilności z ich pluginami.
Rzeczą o której należy pamiętać przy metodzie wyzwalania zdarzeń, jest fakt, że nic nie określa która grupa wtyczek powinna zostać powiadomiona o zdarzeniu. W rezultacie, wszystkie załadowane wtyczki są informowane o zdarzeniu, niezależnie do której grupy są przypisane. Dlatego ważne jest by nazwa twojego zdarzenia była unikalna i nie kolidowała z nazwami zdarzeń w innych grupach. Przez większość czasu nie stanowi to problemu, ponieważ twój komponent jest jedynym który ładuje grupy wtyczek, więc wiesz które aktualnie są aktywne. Należy jednak pamiętać, że grupa wtyczek systemowych jest ładowana na początku większości żądań, dlatego trzeba zapewnić ich bezkonfliktowe działanie ze zdefiniowanymi przez Ciebie zdarzaniami.
» Robertm,