Tworzysz aplikacje internetowe, zauważyłeś, że mieszanie kodu PHP z HTML-em zmniejsza czytelność skryptów, powodując problemy z ich pielęgnacją i wprowadzaniem choćby niewielkich modyfikacji? Nie wiesz jednak, jak temu zaradzić? Lekarstwem na twoje problemy może okazać się system szablonów Smarty.
Nie jest to jedyny system szablonów dla PHP, wiele osób uważa także, że nie jest najlepszy (chodzi głównie o to, że jest bardzo rozbudowany, może właśnie aż za bardzo), jednak nie ulega wątpliwości, że jest najpopularniejszy. Pozwoli skutecznie odseparować logikę twojej aplikacji – kod PHP – od warstwy prezentacji – kod HTML. Dzięki temu wiele dawnych problemów, które pojawiały się podczas przeplatania kodu PHP z HTML-em, znika. Kod staje się czytelny, a jego pielęgnacja nie sprawia już takich problemów.
Opisując Smarty, opierał się będę na bardzo prostym systemie newsów. Nie będziemy jednak przykładali tu wagi do kodu, który odpowiada za podstawowe operacje na newsach (jak ich dodawanie, usuwanie, oglądanie, dodawanie komentarzy), przyjrzymy się natomiast sposobowi zarządzania szablonami od strony kodu PHP oraz tworzenia tych szablonów.
Przygotowania: zakładamy katalogi
Smarty podczas pracy korzysta z szablonów, które są najczęściej stronami internetowymi napisanymi w HTML-u, zawierającymi jednak specjalne tagi. Pliki szablonów umieszcza się najczęściej na dysku w postaci plików (Smarty standardowo nie potrafi ich odczytać z innego źródła, jakim może być na przykład baza danych, jednak istnieje możliwość napisania w tym celu odpowiedniego plugina). W tym celu należy utworzyć odpowiednie katalogi. Na potrzeby naszej aplikacji proponuję układ katalogów taki jak zaprezentowany na rysunku 1.
Mamy więc katalog Templates, a w nim podkatalogi cache, templates oraz templates_c. Po co aż tyle? Szablony będą umieszczone w podkatalogu templates. Smarty podczas ich wyświetlania skompiluje je do kodu PHP (zastępując swoje tagi odpowiednimi konstrukcjami języka PHP), a następnie tak skompilowane szablony umieści w podkatalogu templates_c, dzięki temu aż do czasu zmiany szablonu będzie korzystał z wersji skompilowanych, co zaoszczędzi mu mnóstwo czasu.
W podkatalogu cache natomiast zostaną umieszczane wygenerowane już na podstawie szablonów strony. Taki czysty kod HTML jest używany przez Smarty do szybkiego wyświetlania strony, jeśli kiedyś wcześniej była już ona wyświetlona. Jak zobaczysz dalej, cache\’owanie stron pozwala także w wielu przypadkach wyeliminować mnóstwo pracy, jaką typowo wykonywałaby nasza aplikacja.
Zanim przystąpimy do dalszej pracy zauważ, że skoro Smarty zapisuje dane do katalogów tamplates_c oraz cache, to musisz nadać im odpowiednie prawa. Nie zapomnij o tym.
Konfigurowanie: piszemy kod PHP
Smarty jest biblioteką widoczną dla programisty jako obiekt. W celu korzystania z niej trzeba więc stworzyć ten obiekt. W tym celu dołączamy do naszego skryptu plik Smarty.class.php, a następnie tworzymy instancje klasy Smarty:
require_once(\'Smarty/Smarty.class.php\');
$objSmarty = new Smarty();
Tak stworzony obiekt posiada pewną standardową konfigurację. Między innymi do składowania wyżej opisanych plików korzysta z katalogów umieszczonych w katalogu, w którym znajduje się skrypt korzystający ze Smarty. Musisz więc mu powiedzieć, gdzie są katalogi, z których ma korzystać. W tym celu trzeba skorzystać z pól {stala}template_dir{/stala}, {stala}compile_dir{/stala} oraz {stala}cache_dir{/stala} klasy Smarty:
$objSmarty->template_dir = \'Templates\'.DIRECTORY_SEPARATOR.\'templates\'.DIRECTORY_SEPARATOR;
$objSmarty->compile_dir = \'Templates\'.DIRECTORY_SEPARATOR.\'templates_c\'.DIRECTORY_SEPARATOR;
$objSmarty->cache_dir = \'Templates\'.DIRECTORY_SEPARATOR.\'cache\'.DIRECTORY_SEPARATOR;
Twoje zakłopotanie może wywołać stała {stala}DIRECTORY_SEPARATOR{/stala}. Nie jest ona częścią Smarty, jest natomiast częścią samego PHP i przechowuje znak separatora katalogów używanego w systemie, na którym skrypt został uruchomiony – na systemach uniksowych będzie to /, a np. w Windowsach \\.
Tak skonfigurowana klasa nadal nie będzie jednak cache\’owała wygenerowanych stron. Aby to zmienić, powinieneś jeszcze ustawić pole {stala}caching{/stala} na wartość 1 lub 2 (wartość 0 wyłącza cache\’owanie).
Wartość 1 powoduje, że Smarty bierze pod uwagę aktualną wartość pola {stala}cache_lifetime{/stala} (pole to określa czas życia z cache\’owanej strony w sekundach – standardowo czas ten ustalony jest na 3600 sekund, czyli na jedną godzinę) podczas określania, czy cache jest ciągle aktualny. Jeśli natomiast do określania ważności cache\’u ma być brana wartość z momentu jego wygenerowania, należy polu {stala}caching{/stala} przypisać wartość 2:
$objSmarty->caching = 1;
Tak przygotowany, możesz zastosować szablon na swojej stronie.
Szablony: podstawowe tagi Smarty
Korzystając z takiego systemu szablonów, jakim jest Smarty, musisz pamiętać o tym, że w szablonach nie masz bezpośrednio dostępu do zmiennych używanych w skryptach PHP. Jeśli uważasz, że jakaś zmienna jest ci niezbędna w szablonie, gdyż powinna być w taki bądź inny sposób wyświetlona na stronie, musisz w kodzie PHP powiadomić Smarty że będzie ona ci tam potrzebna.
Służy do tego metoda {stala}assign(){/stala}. W systemie szablonów używana jest bardzo wiele razy. Możesz być pewien, że ty również często będziesz po nią sięgał. Oto przykład użycia tej metody, zaczerpnięty z pliku admin.php:
$objSmarty->assign(\'auth_3times\', $objLogin->getNextTry());
Linia ta mówi Smarty, że wartość zwrócona przez metodę {stala}getNextTry(){/stala} jest dostępna w szablonie pod nazwą {stala}auth_3times{/stala}. Tak więc jak widzisz metoda {stala}assing(){/stala} przyjmuje dwa parametry:
- nazwę, pod jaką dana wartość ma być dostępna z poziomu szablonu,
- wartość, jaka ma być przypisana do tej nazwy.
Istnieje jeszcze jedna postać tej metody, w naszym przykładzie niewykorzystana, jednak na tyle przydatna w pewnych sytuacjach, że warto o niej wspomnieć. Możesz mianowicie jako parametr metodzie {stala}assign(){/stala} przekazać jedynie tablicę asocjacyjną w postaci nazwa=>wartość:
$arrValues = array(
\'imie\' => \'Jan\',
\'nazwisko\' => \'Kowalski\',
\'wiek\' => 35
);
$objSmarty->assign($arrValues);
W ten sposób możesz szybko zdefiniować kilka wartości używanych następnie w szablonie.
Muszę tu zaznaczyć, że nie ma większych ograniczeń co do rodzaju wartości przypisywanej do nazwy poprzez metodę {stala}assign(){/stala}. Może to być zarówno napis, jak i cyfra, zmienna typu boolean, tablica czy nawet obiekty (w tym przypadku z poziomu szablonów będziesz miał dostęp jedynie do ich pól).
Masz już więc zdefiniowaną zmienną {stala}auth_3times{/stala}. Zastanawiasz się prawdopodobnie, jak użyć jej w szablonie i czym dokładniej są te szablony. Przyjrzyj się więc plikowi login_form.tpl umieszczonemu w katalogu Templates/templates. Jak zapewne zauważyłeś, jest to typowa strona internetowa. Poszukaj więc w niej nazwy naszej zmiennej. Występuje ona w takim oto kontekście:
Nastąpiły trzy nieudane próby logowania. Spróbuj ponownie za {$auth_3times} minut.
Czyli jest użyta w celu poinformowania użytkownika o zablokowaniu konta na pewien czas oraz o czasie, po jakim może on próbować się zalogować ponownie. Jak widzisz, zmienne w szablonach przyjmują nazwy podobne do tych z PHP – poprzedzone są znakiem dolara ($). Zauważ także, że zmienna ta jest objęta nawiasami klamrowymi. Właśnie w ten sposób zostają umieszczone w szablonie wszystkie polecenia Smarty.
Warunki: czas na inny komunikat
Przy próbie zalogowania się do panelu administracyjnego newsów użytkownik powinien w oknie logowania zobaczyć komunikat adekwatny do aktualnej sytuacji. Nie jest bowiem przecież pożądana sytuacja, gdy zawsze wyświetlana jest informacja o zablokowaniu konta i możliwości ponownej próby logowania za X minut.
Na szczęście Smarty posiada możliwość zastosowania instrukcji warunkowych. Wróćmy więc ponownie do szablonu login_form.tpl i przyjrzyjmy się nieco większemu fragmentowi strony w nim zawartej:
{if isset($auth_error)}
Niepoprawna nazwa użytkownika lub hasło.
{elseif isset($auth_3times)}
Nastąpiły trzy nieudane próby logowania. Spróbuj ponownie za {$auth_3times} minut.
{else}
Podaj nazwę użytkownika oraz hasło.
{/if}
Jak widzisz, Smarty posiada instrukcję {stala}{if}{/stala}, która pozwala dość dokładnie sterować wyświetlaniem poszczególnych fragmentów strony. Co więcej, instrukcja {stala}{if}{/stala} jest bardzo rozbudowana – posiada tak jak jej odpowiednik w PHP bloki {stala}{elseif}{/stala} oraz {stala}{else}{/stala}. Dodano w niej także kilka nowych operatorów, które stanowią bardziej złożone wyrażenia w PHP. W tabeli 1 zebrano wszystkie operatory obsługiwane przez Smarty.
Wyświetlanie: wysyłamy rezultat do przeglądarki
To, czego się dowiedziałeś z kilku poprzednich akapitów, powinno wystarczyć do budowy prostych stron. W naszym przykładzie wiedza ta okazała się w zupełności wystarczająca do zbudowania ekranu logowania do panelu administracyjnego. Chociaż… Tak, masz rację – ciągle nic nie jest wysyłane do przeglądarki.
Czas zapoznać się z metodą {stala}display(){/stala} klasy Smarty. Metoda ta powoduje odczytanie, przetworzenie oraz wysłanie na standardowe wyjście (najczęściej do przeglądarki klienta) wygenerowanego z szablonu dokumentu. Zanim opiszę dokładniej parametry, jakie ona przyjmuje, przyjrzyj się większemu fragmentowi skryptu admin.php (listing 1).
$strTemplateID = \'\';
if (isset($_SESSION[\'login\'])) { //zalogowany
header(\'Location: aindex.php\');
exit;
} elseif (isset($_POST[\'userName\']) && isset($_POST[\'password\'])) { //czy mamy sprawdzić uprawnienia?
require_once(\'Login.class.php\');
require_once(\'DBConnection.class.php\');
$resDBConnection = DBConnection::connect();
$objLogin = new Login($resDBConnection);
$mixResult = $objLogin->check($_POST[\'userName\'], $_POST[\'password\']);
switch ($mixResult) {
case Login::$AUTH_OK:
$_SESSION[\'login\'] = array (
\'name\' => $objLogin->getName(),
\'surename\' => $objLogin->getSurename(),
);
header(\'Location: aindex.php\');
exit;
break;
case Login::$AUTH_3TIMES_ERROR:
$intTime = $objLogin->getNextTry();
$objSmarty->assign(\'auth_3times\', $intTime);
$strTemplateID = \'3times\'.$intTime;
break;
case Login::$AUTH_FALSE:
$objSmarty->assign(\'auth_error\', true);
$strTemplateID = \'error\';
break;
}
}
$objSmarty->display(\'login_form.tpl\', $strTemplateID);
Większość konstrukcji Smarty użytych w tym skrypcie jest już ci znana. Jedynie użyta w ostatniej linii metoda display jest czymś nowym. Wiesz już, do czego ona służy, przyjrzyjmy się więc jej parametrom.
Pierwszy z nich jest nazwą pliku szablony do wyświetlenia (pamiętaj, że szablony szukane są w katalogu określonym w polu {stala}template_dir{/stala} – możesz użyć bardziej złożonej nazwy jak np. katalog/szablon.tpl, co będzie oznaczało, że szablon został umieszczony w katalogu {stala}template_dir{/stala} w podkatalogu katalog). Drugi natomiast jest identyfikatorem cache\’u.
I tu zatrzymamy się na chwilkę, abyś dobrze zrozumiał potęgę, jaka tkwi w identyfikatorach.
Szablon login_form.tpl znajduje się w jednym pliku, jednak na jego podstawie generowane są trzy różne strony. Jedna jest typową stroną zapraszającą do logowania, druga jest stroną z informacją o błędnej nazwie użytkownika bądź haśle, trzecia natomiast informacją o tym, że konto zostało zablokowane na pewien czas. Teraz gdyby Smarty wygenerowało tylko jeden plik cache, okazałoby się, że niezależnie od sytuacji, zawsze wyświetlana byłaby tylko jedna wersja strony – ta, która została wyświetlona jako pierwsza. Jeśli nie wierzysz, zmień ostatnia linię w pliku admin.php na:
$objSmarty->display(\'login_form.tpl\');
Teraz usuń ewentualne pliki z katalogu Templates/cache i zobacz, jak się zachowuje nasz skrypt (zobacz rysunek 2).
Usunięty właśnie parametr był nazwą pełniącą funkcję identyfikatora cache\’u szablonu, powodując, że dla każdego identyfikatora Smarty generował odrębny plik cache. W przypadku omawianego skryptu, dla szabonu login_form.tpl generowane były trzy pliki cache\’u – jeden bez identyfikatora dla strony z komunikatem zachęcającym do zalogowania się, drugi z komunikatem o błędnym loginie lub haśle oraz trzeci z informacją o zablokowaniu konta.
Jak zobaczysz w dalszej części artykułu, cache szablonów pozwala w wielu wypadkach ograniczyć część pracy typowo wykonywanej przez skrypt, powodując tym samym szybsze jego działanie.
W celu łatwiejszego zrozumienia zasady działania identyfikatorów przyjrzyj się rysunkowi 3.
Poza metodą {stala}display{/stala} istnieje jeszcze bardzo podobna do niej metoda {stala}featch(){/stala}. Przyjmuje ona dokładnie te same parametry co display, jednak po przetworzeniu szablonu nie wyświetla wyniku, a zwraca go w postaci napisu. Dzięki temu z szablonu możesz generować na przykład treść e-maili przed wysłaniem ich do użytkowników:
$strEmailBody = $objSmarty->display(\'email.tpl\', $strID);
Więcej o identyfikatorach cache\’u
Smarty pozwala na zastosowanie w jednym wywołaniu display() bądź featch() więcej niż jednego identyfikatora cache. Dzięki temu możesz grupować strony zależne od tych samych czynników oraz w wygodny sposób czyścić jednym poleceniem ich cache, gdy wystąpi taka potrzeba.
Jeśli chcesz użyć kilku identyfikatorów za jednym razem, musisz oddzielić je pionową kreską:
$objSmarty->display(\'blok_nowosci.tpl\', \'nowosci|strona1\');
$objSmarty->display(\'blok_nowosci.tpl\', \'nowosci\');
Teraz gdy dodasz newsa, możesz łatwo wyczyść cache szablonów wyświetlających newsy oraz ramkę \”Ostatnio dodano\”:
$objSmarty->clear_cache(null, \'nowosci\');
Jako pierwszy parametr podajemy null, gdyż nie interesuje nas żaden konkretny plik szablonu, a wszystkie, które zostały scachowane z użyciem identyfikatora nowości.
Tablice: jak wyświetlić newsy
Jeśli zastanawiałeś się już, jak wyświetlić newsy i przyszło ci do głowy wrzucenie kodu HTML z newsami do zmiennej, a następnie wyświetlenie ich na stronie w sposób podobny do tego: {stala}{$newsy}{/stala} to nie jest to najlepszy pomysł. Na szczęście Smarty posiada konstrukcje pozwalające na wyświetlenie zawartości tabel. Tak więc najpierw przygotujmy sobie stosowną tablicę. Oto fragment kodu ze skryptu index.php:
if (!$objSmarty->is_cached(\'index.tpl\')) {
$objNews = new News($resDBConnection);
$objN = $objNews->get();
$arrNewses = null;
foreach ($objN as $k=>$v) {
$v[\'date\'] = date(\'d.m.Y H:i:s\', $v[\'date\']);
$arrNewses[] = $v;
}
$objSmarty->assign(\'index_newses\', $arrNewses);
}
$objSmarty->display(\'index.tpl\');
Na podstawie danych zwróconych przez metodę {stala}get(){/stala} klasy News, wygenerowana została tabelka {stala}$arrNewses{/stala} o postaci zbliżonej do tej:
Array
(
[0] => Array
(
[ID] => 10
[title] => PHP 5.1.0 wydane
[date] => 30.01.2006 02:59:13
[content] => Ukazała się długo oczekiwana wersja PHP - 5.1.0. W tej wersji dodano 30 nowych funkcji ...
)
[1] => Array
(
[ID] => 11
[title] => Internet Maker - ukazał się pierwszy numer magazynu
[date] => 30.01.2006 02:59:30
[content] => Właśnie ukazał się pierwszy numer nowego magazynu Internet Maker. Magazyn ma być skierowany ...
)
[2] => ...
)
Następnie została ona przypisana za pomocą metody {stala}assign(){/stala} do zmiennej {stala}index_newses{/stala}, dzięki czemu można ją wykorzystać w szablonie. Przyjrzyj się więc teraz szablonowi index.tpl:
{section name=news loop=$index_newses}
{$index_newses[news].title|capitalize}
{$index_newses[news].date|quote:\"[\":\"]\"}
{$index_newses[news].content|truncate:350:\" . . . \"}
{/section}
Tutaj niemal całość kodu jest dla ciebie jeszcze obca. Do wyświetlenia zawartości tabeli wykorzystana została instrukcja section. Powoduje ona wielokrotne wyświetlenie treści zawartej pomiędzy {stala}{section}{/stala} a {stala}{/section}{/stala}, przechodząc jednocześnie przez kolejne rekordy tabeli. Instrukcja section jest bardzo złożona, ale w swej najprostszej postaci przyjmuje dwa parametry:
- {stala}name{/stala} – jest to nazwa sekcji – nie powinieneś używać w jednym szablonie dwóch sekcji o tej samej nazwie,
- {stala}loop{/stala} – jest to zmienna zawierająca tabelę, która cię interesuje.
Po odpowiednim zdeklarowaniu instrukcji, w treści zawartej pomiędzy tagiem otwierającym a zamykającym sekcję możesz odwoływać się do danych z tablicy. Odwołania takie są stosunkowo proste – tablicę podaną w parametrze {stala}loop{/stala} indeksujesz nazwą sekcji, natomiast do poszczególnych elementów podtablic odwołujesz się za pomocą kropki:
{$index_newses[news].title}
Dla każdej sekcji można dodatkowo ustalić dodatkowe parametry:
- {stala}start{/stala} – jest to indeks, od którego chcesz rozpocząć indeksowanie tabeli,
- {stala}step{/stala} – jest to krok, o jaki chcesz poruszać się pomiędzy indeksami tabeli,
- {stala}max{/stala} – jest to maksymalna liczba przebiegów pętli.
Dodatkowo w treści zawartej w sekcji można otrzymać wiele informacji o jej stanie. Jeśli chcesz jedną z tych informacji odczytać, powinieneś skorzystać ze zmiennej {stala}$smarty.section.nazwa_sekcji.nazwa_zmiennej{/stala}, gdzie {stala}nazwa_sekcji{/stala} jest nazwą podaną jako parametr name sekcji, natomiast {stala}nazwa_zmiennej{/stala} to jedna z nazw podanych w tabeli 2.
Rysunek 4 przedstawia sposób działania sekcji.
Sekcje są bardzo dobrą okazją do przedstawienia prostego sposobu na przyspieszenie twoich skryptów. Pamiętasz zapewne, że Smarty po wyświetleniu szablonu zapisuje wygenerowaną stronę w cache\’u. A co powiesz na to, żeby w razie, gdy strona została już scache\’owana, nie pobierać danych z bazy, nie generować, tabelki a zamiast tego wyświetlić starą stronę?
Właśnie do tego służy metoda {stala}is_cached(){/stala}. Przyjmuje ona takie same parametry jak {stala}display(){/stala} czy {stala}featch(){/stala}, z tym że zwraca wartość true, jeśli szablon podany w parametrze jest już scache\’owany lub false w przeciwnym wypadku.
Jeśli teraz dodam, że metody {stala}display(){/stala} i {stala}featch(){/stala} w przypadku istnienia szablonu w cache\’u korzystają z niego zamiast ponownie generować stronę, pojawia się rozwiązanie – spójrz jeszcze raz na fragment listingu generującego tabelkę newsów i przyjrzyj się warunkowi, jaki tam występuje.
Zastanawiasz się, co się stanie, gdy dodasz newsa? Strona nie zmieni swojej zawartości, chyba że skorzystasz z metody {stala}clear_cache(){/stala}, tak jak ja to zrobiłem w pliku aindex.php:
$objSmarty->clear_cache(\'index.tpl\');
Metoda ta przyjmuje te same parametry, co {stala}is_cached(){/stala}, w wyniku swojego działania natomiast usuwa cache odpowiednich szablonów.
Modyfikatory: jak zmodyfikować wyświetlane informacje
Dzięki Smarty możliwe jest proste zmodyfikowanie, przy pomocy odpowiednich modyfikatorów, wyświetlanych informacji (czyli zawartości zmiennych). Smarty oferuje bardzo wiele modyfikatorów oraz, co również istotne, pozwala w prosty sposób stworzyć własne. Niestety nie ma tu tyle miejsca, aby opisać wszystkie dostępne modyfikatory, omówię jedynie na przykładzie sposób, w jaki możesz z nich korzystać.
Przyjrzyj się teraz dokładniej sposobowi wyświetlania poszczególnych rekordów tabeli zawierających newsy – oto one pozbawione otaczających je tagów HTML-a:
{$index_newses[news].title|capitalize}
{$index_newses[news].date|quote:\"[\":\"]\"}
{$index_newses[news].content|truncate:350:\" . . . \"}
{$index_newses[news].ID}
Modyfikatory umieszcza się za zmienną, oddzielając je od niej pionową kreską (|). Jeśli modyfikator przyjmuje parametry – tak jak ma to miejsce w przypadku modyfikatorów quote czy truncate – podaje się je po nazwie modyfikatora, oddzielając je znakami dwukropka (:).
Jedną zmienną można poddać działaniu więcej niż jednego modyfikatora – poszczególne modyfikatory wystarczy oddzielić od siebie znakiem kreski (|):
{$zmienna|modyfikator:parametr1:parametr2:...|modyfikator2:parametr1:parametr2|...}
Użyty tu modyfikator {stala}capitalize{/stala} powoduje zmianę pierwszej litery wszystkich wyrazów z małej na wielką. Modyfikator {stala}truncate{/stala} jest bardziej złożony i powoduje obcięcie napisu znajdującego się w zmiennej do zadanej długości. Posiada on jednak szereg innych parametrów. Parametry te zostały zebrane w tabeli 3.
Pozostał jeszcze modyfikator {stala}quote{/stala}. Obejmuje on napis zawarty w zmiennej w tekst podany w parametrach. W pierwszym parametrze podajemy tekst, który ma zostać umieszczony po lewej stronie napisu, w drugim tekst do umieszczenia z prawej strony. Modyfikator {stala}quote{/stala}, mimo iż czasami przydatny, nie jest standardowo dostępny w Smarty. Został on utworzony przeze mnie w celu zademonstrowania sposobu tworzenia własnych modyfikatorów. A oto jego kod:
Proste, prawda? Ważne, abyś nazwy funkcji swoich modyfikatorów rozpoczynał od {stala}smarty_modifier_{/stala}, a następnie zapisywał każdy modyfikator w osobnym pliku, w podkatalogu plugins znajdującym się w katalogu Smarty. Plik z modyfikatorem musi mieć nazwę w postaci {stala}modyfier.nazwa_mody.katora.php{/stala}.
Kilka innych drobiazgów ułatwiających tworzenie szablonów
To, czego się już dowiedziałeś, z powodzeniem wystarcza do budowania nawet złożonych aplikacji internetowych z wykorzystaniem Smarty. Nie sposób co prawda w jednym artykule zaprezentować wszystkich możliwości tego systemu szablonów, jednak powinieneś jeszcze dowiedzieć się w jaki sposób umieszczać kod JavaScript na stronach. Jeśli wydaje ci się, że powinno to działać tak jak dotychczas, spróbuj.
Zobaczysz, że Smarty poinformował cię o błędzie w szablone. Spowodowane jest to tym, że Smarty wszystko, co rozpoczyna się nawiasem klamrowym, traktuje jako swój tag. Na szczęście istnieje proste rozwiązanie tego problemu. Kod taki jak JavaScript czy CSS umieszczaj pomiędzy tagami {stala}{literal}{/stala} a {stala}{/literal}{/stala}. Dzięki temu Smarty zignoruje wszystko, co umieściłeś między nimi, i zwróci to bez analizowania (czyli nawet jeśli umieścisz między tymi tagami konstrukcje Smarty, nie zostaną one wykonane, zamiast tego zostanie wyświetlony ich kod, tak jakby była to zwykła treść. A oto przykład z pliku news.tpl:
{literal}
function checkform() {
if (document.getElementById(\'Ltitle\').value.length<1 || document.getElementById(\'Lname\').value.length<1 || document.getElementById(\'Lcontent\').value.length<1) {
alert(\"Uzupełnij wszystkie pola\");
return false;
}
return true;
}
{/literal}
Czasami jednak chciałbyś po prostu w szablonie umieścić nawias klamrowy. Nie jest wówczas wygodnie stosować konstrukcję taką jak ta:
{literal} { {/literal}
Zamiast tego możesz skorzystać z tagów {stala}{ldelim}{/stala}, który zostanie zastąpiony znakiem { oraz {stala}{rdelim}{/stala}, który zostanie zastąpiony znakiem }.
Posumowanie
Wiesz już, w jaki sposób oddzielić warstwę prezentacji od logiki twojej aplikacji, zyskując jednocześnie na przejrzystości kodu oraz w wielu przypadkach na jego wydajności (szczególnie gdy do tej pory każde wyświetlenie rzadko nawet zmieniającej się strony powodowało konieczność odczytania wielu informacji z bazy danych).
Strona domowa Smarty
http://smarty.php.net
Znajdziesz tam najnowsze wersje Smarty, dokumentację oraz będziesz mógł zasięgnąć informacji z pierwszej ręki, korzystając z list mailngowych oraz forum.
Smarty sprawia, że tworzenie aplikacji internetowych staje się przyjemniejsze, a ich późniejsze dopieszczanie oraz rozwijanie łatwiejsze.
Artykuł ten nie wyczerpuje tematu, jest jedynie wprowadzeniem. Gdy przyswoisz sobie materiał tu zawarty oraz oswoisz się już z pracą w Smarty, zachęcam cię do spędzenia dłuższej chwilki z manualem do Smarty. Ten system szablonów jest bowiem potężny i drzemie w nim olbrzymi potencjał. Trzeba tylko wiedzieć, jak z niego skorzystać.
Inne systemy szablonów
Mimo że Smarty należy do najpopularniejszych systemów szablonów w świecie PHP, istnieje także wiele innych bibliotek tego typu. Każda z nich ma swoje wady i zalety. Jeśli z jakiegoś powodu uznasz, że Smarty nie spełnia twoich oczekiwań, zachęcamy do przyjrzenia się jego konkurencji:
- OPT:
http://opt.openpb.net/index.php
System szablonów polskiej produkcji, bardzo zbliżony do Smarty, jednak wykorzystujący potencjał PHP5. - YAST:
http://yats.sourceforge.net
System szablonów o zupełnie innym sposobie działania niż Smarty. - bTemplate:
http://www.massassi.com/bTemplate/
Mały i szybki system szablonów, jednak także o wiele mniejszych możliwościach. - Savant:
http://www.phpsavant.com
Twórcy tego systemu szablonów uznali, że PHP samo w sobie jest wystarczająco dobrym systemem szablonów i nie ma potrzeby tworzyć nowego języka.