--=REKLAMA=--

Dodatki w Twoim komponencie

Z Joomla!WikiPL


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.

Tło

Implementacja obserwatora

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.

Dlaczego warto zostać komunikatorem

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.

Implementacja

Jak zostać komunikatorem

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ń.

Wyzwalanie 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ę).

Uwagi

Definiowanie API

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.

Ładowanie odpowiedniej grupy wtyczek

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.

Dziękujemy za wkład

» Robertm,