Smarty- najpopularniejszy system szablonów dla języka PHP – wprowadza do kodu szereg własnych instrukcji, znaczników i funkcji. Przy odrobinie pomysłowości znaczniki Smarty można wyeliminować. Otrzymamy w ten sposób skrypt, który stosuje technikę oddzielenia prezentacji od przetwarzania w oparciu o wbudowane możliwości języka PHP. Rozwiązanie takie nazywam surowymi szablonami PHP.
Zadania szablonów
Stosowanie szablonów Smarty wymaga umiejętności:
- przekazywania zmiennych do szablonu,
- posługiwania się modyfikatorami zmiennych,
- iteracyjnego przetwarzania tablic,
- operowania instrukcją if,
- przechwytywania kodu generowanej strony.
Oto skrypty prezentujące realizację pięciu
powyższych zadań przy użyciu biblioteki Smarty
oraz wbudowanych możliwości języka PHP.
Każdy z przykładów składa się z dwóch plików:
index.php (plik, w którym zachodzi przetwarzanie)
oraz index.tpl (plik odpowiedzialny
za prezentację wyników).
Przekazywanie zmiennych do szablonu
Smarty
W skrypcie index.php dołączamy bibliotekę
Smarty, tworzymy nowy obiekt {stala}$s{/stala}, przekazujemy
do szablonu zmienną {stala}$zawartosc{/stala} (metoda
{stala}assign(){/stala}), po czym przetwarzamy szablon (metoda
{stala}display(){/stala}).
Drukowanie zmiennej wykorzystuje specjalny
znacznik {stala}{$zawartosc}{/stala}. Rozwiązanie jest przedstawione
na listingu 1.
index.php
---------
require_once \'Smarty.class.php\';
$s = new Smarty;
$zawartosc = \'...tekst...\';
$s->assign(\'zawartosc\', $zawartosc);
$s->display(\'index.tpl\');
index.tpl
---------
{$zawartosc}
Surowe szablony PHP
Rozwiązanie, które stosuje wbudowane możliwości
języka PHP jest krótsze. W skrypcie definiujemy
zmienną {stala}$zawartosc{/stala}. Przetworzenie szablonu
realizuje instrukcję include, która dołącza
plik index.tpl.
Plik index.tpl jest plikiem HTML-owym. Występują
w nim (podobnie jak w szablonie Smarty)
specjalne instrukcje drukujące wartości zmiennych.
Do wydruku zmiennych stosujemy znaczniki
PHP w połączeniu z instrukcją echo. Ilustruje
to listing 2.
index.php
---------
$zawartosc = \'...tekst...\';
include \'index.tpl\';
index.tpl
---------
W rozwiązaniu tym znika wywołanie metody
{stala}assign(){/stala}: wszystkie zmienne zdefiniowane
w skrypcie index.php są automatycznie dostępne
w skrypcie dołączanym instrukcją include.
Modyfikatory zmiennych
Smarty
Modyfikatory zmiennych szablonów Smarty stosują
składnię zbliżoną do strumieni uniksowego
shella. Wartość zmiennej jest przekazywana operatorem
| do modyfikatora. Ilustruje to listing 3.
index.php
--------
$tekst = \'
raz
dwa
trzy
\';
$s->assign(\'tekst\', $tekst);
$s->display(\'index.tpl\');
index.tpl
--------
{$tekst|nl2br}
Modyfikatory można łączyć. Jedna zmienna
może być poddana przed wydrukowaniem szeregowi
przekształceń:
{$tekst|nl2br|upper}
Surowe szablony PHP
W surowych szablonach rolę modyfikatorów pełnią
funkcje PHP. Jak widać na listingu 4,
zmienna {stala}$tekst{/stala} przed wydrukowaniem jest poddawana
działaniu funkcji {stala}nl2br(){/stala}.
index.php
---------
$tekst = \'
raz
dwa
trzy
\';
include \'index.tpl\';
index.tpl
---------
W celu wykonania kilku przekształceń, należy
wywołania funkcji złożyć:
Iteracyjne przetwarzanie tablic
Smarty
Do iteracyjnego przetwarzania tablic służy funkcja
{section}. Dwoma obowiązkowymi parametrami
są name oraz loop. Atrybut loop ustala nazwę
przetwarzanej tablicy, zaś name definiuje nazwę
zmiennej, stosowanej przy odwołaniach do
elementów w kolejnych obrotach pętli.
Użycie funkcji {section} jest przedstawione
na listingu 5. Funkcja {section} zawiera
znacznik zamykający {/section}. Definiuje on
obszar szablonu objęty iteracją.
index.php
---------
$kolory = array(
\'red\', \'green\', \'blue\',
\'white\', \'black\', \'pink\'
);
$s->assign(\'kolory\', $kolory);
$s->display(\'index.tpl\');
index.tpl
---------
{section name=i loop=$kolory}
- {$kolory[i]}
{/section}
Surowe szablony PHP
Szablony surowe do przetwarzania tablicy stosują
instrukcje foreach lub for. Ilustruje to listing
6.
index.php
---------
$kolory = array(
\'red\', \'green\', \'blue\',
\'white\', \'black\', \'pink\'
);
include \'index.tpl\';
index.tpl
---------
Przetwarzanie tablicy rozpoczynamy od
\”znacznika\” otwierającego:
a kończymy znacznikiem zamykającym:
W kolejnych obrotach pętli odwołujemy się do
elementów tablicy {stala}$kolory{/stala}. Służy do tego zmienna
{stala}$kolor{/stala} (instrukcja foreach) lub {stala}$kolory[$i]{/stala} (instrukcja
for).
Instrukcja IF
Smarty
W szablonie Smarty instrukcja if przyjmuje postać
funkcji o znacznikach: otwierającym {if} oraz
zamykającym {/if}. Ilustruje to listing 7 ( ).
index.php
---------
$liczba = rand(1, 57);
$s->assign(\'liczba\', $liczba);
$s->display(\'index.tpl\');
index.php
---------
{if $liczba > 30}
Liczba większa od 30;
{else}
Liczba mniejsza od 30;
{/if}
W warunku instrukcji if mogą pojawić się dowolne
zmienne przekazane do szablonu. Zakres instrukcji
(czyli obszar szablonu, którego ona dotyczy)
jest zdefiniowany przez znaczniki: otwierający
{if} oraz zamykający {/if}.
Surowe szablony PHP
Instrukcja if szablonów surowych jest zwykłą instrukcją
PHP ujętą w znaczniki .
W związku z tym w warunku możemy stosować
dowolne zmienne, które pojawiły się w skrypcie
index.php. Zasięg instrukcji definiują \”znaczniki\”
otwierający:
oraz zamykający:
Pełny przykład jest przedstawiony na listingu 8.
index.php
---------
$liczba = rand(1, 57);
include \'index.tpl\';
index.tpl
---------
30) {?>
Liczba większa od 30;
Liczba mniejsza od 30;
Przechwycenie generowanej strony
Smarty
Przechwytywanie kodu HTML przetworzonego
skryptu realizuje metoda {stala}fetch(){/stala} widoczna na listingu
9.
$zawartosc = \'...tekst...\';
$s->assign(\'zawartosc\', $zawartosc);
$strona = $s->fetch(\'index.tpl\');
echo $strona;
Surowe szablony PHP
W celu przechwycenia wyników generowanych
przez surowe szablony można wykorzystać buforowanie
wyników. Ilustruje to listing 10.
Po włączeniu buforowania wyników (funkcja ob_
{stala}start(){/stala}) przetwarzamy szablon (instrukcja include).
$zawartosc = \'...tekst...\';
ob_start();
include \'index.tpl\';
$strona = ob_get_contents();
ob_end_clean();
echo $strona;
Wynik przetwarzania jest dostępny po wywołaniu
funkcji {stala}ob_get_contents(){/stala}.
Przykład: piosenki zespołu ABBA
Jako przykład praktyczny ilustrujący obie metody
przeanalizujmy witrynę prezentującą piosenki
zespołu ABBA. Gotowa witryna jest przedstawiona
na ilustracji.
Smarty
Rozwiązanie stosujące Smarty jest przedstawione
na listingu 11.
index.php
---------
$tytul = ...
$wybrana = ...
$piosenki = ...
$s = new Smarty;
$s->assign(\'tytul\', $tytul);
$s->assign(\'wybrana\', $wybrana);
$s->assign(\'piosenki\', $piosenki);
$strona = $s->fetch(\'index.tpl\');
echo $strona;
index.tpl
---------
{section name=i loop=$piosenki}
-
{$piosenki[i].tytul|replace:\" \":\" \"}
{/section}
{$tytul}
{$wybrana|nl2br}
W skrypcie index.php następuje
przygotowanie trzech zmiennych: {stala}$tytul{/stala},
{stala}$wybrana{/stala}, {stala}$piosenki{/stala}. Zmienne te są przekazane
do szablonu {stala}$s{/stala} (metoda {stala}assign(){/stala}), po czym szablon
jest przetworzony (metoda {stala}fetch(){/stala}), a wyniki
wydrukowane (instrukcja echo {stala}$strona{/stala}).
W szablonie index.tpl iteracja {stala}{section}{/stala} generuje
– na podstawie zmiennej {stala}$piosenki {/stala}- menu
witryny. Poniżej menu wyświetlamy tytuł wybranej
piosenki (zmienna {stala}{$ytytul}{/stala}) oraz jej tekst
(zmienna {stala}{$tekst}{/stala} przekształcona modyfikatorem nl2br).
Surowe szablony PHP
Początkowy fragment skryptu index.php odpowiedzialny
za przetwarzanie (czyli za ustalenie
wartości zmiennych {stala}$tytul{/stala}, {stala}$wybrana{/stala} oraz {stala}$piosenki{/stala}
jest identyczny jak w poprzednim przykładzie.
W dalszej części (patrz listing 12 ) następuje
przetworzenie szablonu.
index.php
---------
$tytul = ...
$wybrana = ...
$piosenki = ...
ob_start();
include \'templates/index.tpl\';
$strona = ob_get_contents();
ob_end_clean();
echo strona;
index.tpl
---------
Dane automatycznie trafiają do szablonu index.tpl, gdyż skrypty
dołączane instrukcją include mają dostęp do
wszystkich zmiennych skryptu głównego. W celu
ustalenia kodu HTML powstałego po przetworzeniu
szablonu wykorzystujemy buforowanie
wydruku.
W szablonie index.tpl pojawia się iteracja odpowiedzialna
za drukowanie menu. W tym celu
wykorzystano instrukcję foreach.
Poniżej menu pojawia się tytuł i tekst wybranego
utworu. Rolę modyfikatora nl2br pełni
wywołanie funkcji {stala}nl2br(){/stala}.
Podsumowanie
Przedstawione rozwiązania różnią się kilkoma
cechami. Po pierwsze stosując surowe szablony
nie musimy poznawać nowego języka. Odbywa
się to jednak kosztem dużej dyscypliny pracy,
której musi pilnować sam programista. Po drugie
w razie konieczności, w surowym szablonie
.tpl możemy pisać goły kod PHP w sposób
bardziej wygodny, niż to ma miejsce w szablonach
Smarty.
Należy jednak pamiętać, że w ten
sposób można łatwo zakłócić separację przetwarzania
od prezentacji. Po trzecie wydruk wartości
zmiennych w surowych szablonach nie jest
niczym ograniczony. W przypadku właściwości
będących obiektami operator -> możemy stosować
wielokrotnie:
echo $autor->getKsiazka()->getTytul();
Smarty nie przyjmie takiego zapisu:
PRZYKŁAD NIEPOPRAWNY
{$autor->getKsiazka()->getTytul()}
Po czwarte kompilacja szablonów Smarty pochłania
znacznie więcej zasobów niż szablony surowe
PHP. Jednak dzięki kompilacji możliwe jest
cache\’owanie, czego nie umożliwiają (w prosty
sposób) szablony surowe.