Szablony w dzisiejszym Å›wiecie programowania sÄ… czymÅ› niezbÄ™dnym - przekonywać do tego nie trzeba chyba nikogo. DostÄ™pne sÄ… potężne narzÄ™dzia typu SMARTY które wspaniale radzÄ… sobie z zadaniem oddzielenia treÅ›ci od wyglÄ…du oraz dajÄ… twórcom oprogramowania sporÄ… dowolność jeÅ›li chodzi o koÅ„cowy wyglÄ…d projektu. Jednak czy kombajn pokroju SMARTY podchodzÄ…cy bardziej pod "nowy jÄ™zyk" niż prosty "system szablonów" jest najlepszym wyjÅ›ciem?
Postaram się wyjaśnić dlaczego na powyższe pytanie nie da się jednoznacznie odpowiedzieć i zaproponować prostą alternatywę.
OczywiÅ›cie porzÄ…dny system szablonów sprawdza siÄ™ wszÄ™dzie tam, gdzie wyglÄ…d strony może ulec zmianie, użytkownik powinien mieć w dzisiejszych czasach możliwość "przebrania" swojej treÅ›ci w zupeÅ‚nie nowe szaty, jednak czasem zdaża siÄ™, że zaprzÄ™gniÄ™cie do tego rozbudowanego systemu szablonów mija siÄ™ z celem.
Kiedy użyć alternatywy? Jak zawsze należy podsumować kożyÅ›ci wynikajÄ…ce z użycia danego rozwiÄ…zania, porównać z nakÅ‚adami pracy, czasem poÅ›wiÄ™conym na wdrożenie i rozważyć wszelkie inne za i przeciw danego rozwiÄ…zania. JeÅ›li piszesz małą stronkÄ™ a'la wizytówka firmy, to może siÄ™ okazać, że biblioteka obsÅ‚ugujÄ…ca szablony bÄ™dzie wiÄ™ksza od caÅ‚ego projektu (objÄ™toÅ›ciowo, ilość klass i funkcji - dowolne kryterium, które przyjdzie Ci do gÅ‚owy. Wtedy warto pomyÅ›leć nad alternatywnym rozwiÄ…zaniem. może użytkownik dostanie jednÄ… lub dwie opcje mniej, ale przypominam maÅ‚y projekt -> klient chce niewiele i czasem coÅ› sobie pozmienia. jeÅ›li zyski przewyższajÄ… straty myÅ›limy o alternatywie.
Alternatywa:
zakładamy, że użytkownik robi sobie szablon wyglądający mniej więcej tak:
body.inc.tpl
<html>
<head>
<title>{$TITLE$}</title>
</head>
<body>
<ul id="nav">{$MENU$}</ul>
<div id="header"><h1>{$COMPANYNAME$}</h1><p>{$SLOGAN$}</p></div>
<div id="foot">{$FOOTERLINKS$}</div>
<div id="content">{$SITEBODY$}</div>
</body>
</html>
Prosty, czysty i czytelny - w rzeczywistości trochę trzeba by to dopracować, ale dla potrzeb tego artykułu wystarczy. To czego potrzebujemy to zamienić nasze {$COSIE$} na treść generowaną przez skrypt. W tym wypadku {$TITLE$}, {$MENU$}, {$COMPANYNAME$}, {$SLOGAN$}, {$FOOTERLINKS$} i {$SITEBODY$}.
te dane możemy pobrać z bazy czy pliku i stworzyć tablicę:
$dane=array(
'title' => 'Prosta strona',
'companyname' => 'Firma',
'slogan' => najlepsza firma w Twoim mieście',
'sitebody' =>'Hello world!',
'menu' => '',
'footerlinks' => ''
);
Zwróć uwagÄ™, że nie mamy jeszcze $dane['menu'] oraz $dane['footerlinks']. To co wyciÄ…gamy z bazy trzeba "obrobić" tak, by nasz szablon Å‚adnie wyglÄ…daÅ‚. dodajmy zatem kolejne dwa maÅ‚e szablony: dla każdego elementu menu i dla każdego linku w stopce:
menu_item.inc.tpl
<li><a href="{$HREF$}">{$MENUITEM$}</a></li>
foot_item.inc.tpl
<a href="{$HREF$}">{$FOOTLINK$}</a>
może niezbyt wyszukany przykład, ale obrazuje nasz problem. teraz wystarczy pobrać z bazy odpowiednie dane i "stworzyć" brakujące zmienne:
foreach($dane_o_menu as $data) {
$dane['menu'].= template($data,'menu_item','mystyle');
}
foreach($dane_o_stopce as $data) {
$dane['menu'].= template($data,'foot_item','mystyle');
}
Użyłem w kodzie funkcji template, jej kod w listingu.
całość przepuścimy teraz przez nasz template i wyrzucimy wynik:
echo template($dane,'body','mystyle');
i tyle, cały "skrypt obsługi szablonu" mamy z głowy, proste, nieprawdaż. każdą "zmienną" w szablonie możemy przepuścić przez inny szablon pamiętając, że w odpowiedzi dostajemy już kod HTML.
Teraz conieco o strukturze katalogów. by byÅ‚o "profesjonalnie" tworzymy katalog:
./templates/
i do niego wrzucamy nasze style z rozszerzeniem .inc.tpl, np:
./templates/default/*.inc.tpl
./templates/mystyle/*.inc.tpl
poniżej kod funkcji template pobierajÄ…cej tablicÄ™ z "zamiennikami", nazwÄ™ pliku szablonu (bez rozszerzenia) oraz nieobowiÄ…zkowo nazwÄ™ katalogu z szablonem i Å›cieżkÄ™ do zbioru szablonów.
Listing
function template($array, $template, $style="default", $path="./templates/"){
/*
Funkcja ta wczytuje szablon $template, a następnie podmienia dane przy pomocy tablicy
asocjacyjnej $array, gdzie indexem jest nazwa zmiennej
Następnie na podstawie listy, oczyszcza nieprzypisane zmienne
*/
$array['template_path']=$path.$style."/";
$tpl=file_get_contents($path.$style."/".$template.".inc.tpl"); //pobiera plik szablonu ze zmiennymi
foreach($array as $t => $content){
$tpl=str_replace("{\$".strtoupper($t)."\$}", $content, $tpl); //podmienia zmienne na wartości
}
$tpl=preg_replace('({\$(.*?)\$})', "", $tpl); //czyszczenie pozostałości
return $tpl; //zwraca gotowy kod html
}

