Joomla@jogger.pl

 

18

sierpnia

2010

Operacje na kompletnej sekcji head szablonu

Proces renderowania szablonu w Joomla! składa się generalnie z dwóch etapów. Zrozumienie jak on przebiega ma często kluczowe znaczenie dla działania niektórych skryptów. W dzisiejszym wpisie opiszę dość ciekawy i sądzę, że ciekawy przypadek, kiedy to potrzebujemy uzyskać dostęp do finalnej (powstałej po wszystkich operacjach) wersji sekcji head naszego szablonu.

Problem na jaki się ostatnio natknąłem, polegał na tym, że potrzebowałem zmienić kolejność kilku plików CSS dodawanych przez niektóre moduły do sekcji head szablonu.

Niestety - ze względu na ideę parsowania szablonów w Joomla! nie da się tego zrobić tworząc zwykły kod operujący na sekcji head dokumentu - w czasie gdy będzie się on wykonywał, pliki CSS/JS dodawane przez moduły/komponenty nie będą jeszcze w niej dostępne. Dlaczego ? Joomla! parsuje szablon w dwóch etapach - najpierw parsowany jest kod szablonu wraz z towarzyszącym mu kodem PHP, a dopiero w drugim etapie następuje podmiana wstawek jdoc na właściwie im fragmenty strony. Co za tym idzie dopiero wtedy wykonywany jest kod modułów i komponentów.

W wielkim skrócie proces ten wygląda następująco:

  1. Pierwsze parsowanie szablonu i kodu PHP w nim zawartego
  2. Wystąpienie zdarzenia onAfterDispatch
  3. Drugie parsowanie szablonu: podmiana wstawek jdoc i wykonanie kodu modułów/komponentów
  4. Wystąpienie zdarzenia onAfterRender
  5. Zwrócenie do przeglądarki finalnego kodu strony z bufora

Jeżeli w naszym szablonie wykonujemy jakiś kod operujący na sekcji head to występuje on na etapie pierwszym. Natomiast część danych w sekcji head pojawia się dopiero na etapie trzecim. Co za tym idzie jedyne miejsce w którym możemy operować na kompletnej sekcji head jest etap czwarty.

I w tym momencie mamy dwa wyjścia:

I na tym drugim rozwiązaniu się skupimy gdyż wymaga ono aż 2 linii kodu ;) Musimy mianowicie stworzyć obiekt klasy JDispatcher, który odpowiada za generowanie zdarzeń i rejestrację funkcji obsługi zdarzeń, a następnie musimy zarejestrować dodatkową funkcję dla zdarzenia onAfterRender. Cały kod to:


$dispatcher = JDispatcher::getInstance();
$dispatcher->register('onAfterRender', 'NASZA_FUNKCJA');

Oczywiście NASZA_FUNKCJA to nazwa funkcji, która ma zostać podczas zdarzenia wywołana. W ten oto sposób część kodu naszego szablonu wykona się znacznie później w procesie renderowania szablonu.

Pora na złą wiadomość - po drugim etapie renderowania szablonu nie jesteśmy już w stanie modyfikować sekcji head z użyciem standardowych metod API - po tym etapie jedyne co możemy modyfikować to zawartość bufora, która ma zostać zwrócona do przeglądarki. Aby dostać się do rzeczonego bufora korzystamy z klasy JResponse:


$buf = JResponse::getBody();

Aby zapisać efekty naszej pracy na zmiennej $buf korzystamy z metody setBody:


JResponse::setBody($buf);

I w ten oto sposób mamy zapisane modyfikacje pełnej sekcji head naszego szablonu.

 
 

Komentarze

 
 
 

№ 1

20 sierpnia 2010, 18:51:41

Sun Pietro

Jestem pod wrażeniem. Kiedyś myślałem o tym jak dobrać się do sekcji head strony i musiałem manipulować za pomocą pluginów.
Ten przykład jest zdecydowanie lepszy.

 
 
 

Dodaj komentarz

 

Podpis

 

URL

 

Treść

 
 
 
 

Miniblog