Aki készített már komolyabb webportált PHP segítségével, az tudja, mennyire könnyen bele lehet zavarodni abba, hogy HTML és a PHP kódok egy adott fájlon belül, keverve találhatóak.
Monte Ohrt és Andrei Zmievski ennek a problémának megoldására dolgozta ki a Smarty sablon-kezelőt (template-engine).
Telepítés
Maga az alkalmazás PHP nyelven íródott, használatához csak annyit kell tennünk, hogy letöltjük, a megfelelő helyre kicsomagoljuk, és elérhetővé tesszük a kódunkban egy include-al.
Ezután lehetőségünk van a Smarty osztály használatára. Mielőtt azonban lelkesen a sablon-készítésbe vetnénk magunkat, konfiguráljunk. Ez mindössze annyi, hogy megadjuk a Smarty-nak sablonok forrás könyvtárát (innen fogja a sablonokat venni a feldolgozáshoz) és a már összeállított fájlok könyvtárát (erre azért van szükség, mert a Smarty nem minden esetben generálja le a kimenetet újra, illetve, hogya legyen hova dolgoznia).
Ezt legegyszerűbben a következő pár sorral lehet elérni:
<?php
require_once( './smarty/Smarty.class.php' );
$smarty = new Smarty;
$smarty -> template_dir = './templates'; //itt vannak a sablonok
$smarty -> compile_dir = './templates_c'; //ide dolgozik
?>
Én jobban szeretem, ha eleve úgy származtatok osztályt a Smarty-ból, hogy megfelelően legyenek benne beállítva a könyvtárak.
<?php
class Smarty_Enyim extends Smarty {
function Smarty_Enyim() {
$this->Smarty();
$this->template_dir = './templates/';
$this->compile_dir = './templates_c/';
}
}
$smarty = new Smarty_Enyim;
?>
Erről ennyit, ha valaki többet szeretne tudni a Smarty konfigurálásáról, olvasson utánna. Egyszer én is megtettem, de mivel sohasem kellett használnom a három év alatt, kiment a fejemből...
Sablonkészítés és megjelenítés
A sablonunk (template) tulajdonképen egy HTML fájl, azon "extrákkal", amik megkönnyítük életünket. A neve bármi lehet, amit az adott operációs rendszer elbír, de kiterjesztésük konvencionálisan .tpl. Nézzük a csúcsra járatott példát:
<html>
<body>
Helló, világ. (Hogy én mennyire unom ezt a szöveget...)
</body>
</html>
Mentsük el hello.tpl néven a sablonok forrás könyvtárba. A PHP kódunkat pedig gazdagítsuk a következő sorral:
$smarty -> display( 'hello.tpl' ); //ez a Smarty egyik megjelenítő függvénye
Ha minden jól megy, akkor hello.tpl-be írt szöveget fogjuk látni a böngészőben.
Nagy cucc - lehet mondani - ezt egy sima HTML oldal is tudja, még PHP sem kell hozzá.
Oké, írjuk felül a hello.tpl-t, így:
<html>
<body>
{$szoveg}
</body>
</html>
A PHP kódba pedig már két sort:
$smarty -> assign( 'szoveg', 'Még mindig nem győztelek meg?' );
$smarty -> display( 'hello.tpl' );
Ahogy (remélem) várható volt, most a PHP kódban beírt szöveg jelent meg a böngészőben.
De mi is történt háttérben? Csak annyi, hogy a Smarty észrevette, hogy neki szóló utasítás van a sablonban. Ezt határolta a {...}, de akinek nem tetszik ez a jelölés, az a határolókat átállíthatja a $letf_delimiter és $right_delimiter objektum-változók segítségével.
Ezután kielemezte a neki szánt utasítást, jelen esetben ez egyszerű érték megjelenítés volt. Tehát a sablonban a megfelelő helyre beillesztette azt az értéket, amit az ő szoveg változójához rendeltünk a PHP kódban.
Tömbök kezelése
A Smarty egyik előnye, hogy nagyon jól támogatja a tömbök megjelenítését. Aki csinált már olyan weblapot, ami adatbázisból kinyert adatokat jelenít meg, az tudja mekkora segítség lehet ez.
Szerkesszünk egy ilyesmi sablont:
{$tombom.elsoeleme} {$tombom.masodikeleme}
Akkor a PHP a következő lesz:
$smarty -> assign( 'tombom', array( 'elsoeleme' => 'elsőelem', 'masodikeleme' => 'másoddikelem' ) );
$smarty -> display( 'hello.tpl' );
Gondolom, az eredmény sejthető volt. De ez a megoldás elég fapados. Írjuk át a sablonunkat:
{foreach from=$tombom item=elemem}{$elemem} {/foreach}
Itt a Smarty egyik beépített függvényét használjuk, ami feltűnően hasonlít a PHP foreach-ére.
Bonyolítsuk a dolgot! Képzeljünk el, bizonyos elemeket félkövéren kell megjelenítenünk a tömbből. Mondjuk azokat, amelyek páros szám hosszúak. Ekkor a sablon:
{foreach from=$tombom item=elemem}
{if $elem|count_characters is even}
<b>{$elemem}</b>
{else}
{$elemem}
{/if}
{/foreach}
Új elemként megjelenik a (már gondolom hiányolt) feltételes szerkezet és a kevésbé könnyen emészthető $elem|count_characters. Nos, az if és a foreach beépített Smarty függvény, a count_characters egy egyszerű függvény, amely plug-inként érhető el a Smarty-ból.
function smarty_modifier_count_characters($string, $include_spaces = false)
{
if ($include_spaces)
return(strlen($string));
return preg_match_all("/[^\s]/",$string, $match);
}
Ezekkel a plug-inekkel a smarty lehetőségei igen gyorsan bővíthetőek.
Látható, hogy egy elég összetett és jól bővíthető rendszerrel állunk szemben. Ez a kis szösszenet csak a felszínét súrolta, de remélem, kedvcsinálónak elég volt. Ha lesz rá igény, akkor folytatom a táblázatkezeléssel.