Šablonovací systémy mají své příznivce i odpůrce, v některých případech jsou postradatelné, někdy zase vyloženě nenahraditelné. Nutné jsou především tehdy, kdy na jednom projektu dělá více lidí. Šablony v takovém případě nejen pomohou oddělit aplikační a prezentační logiku, ale dají možnost upravovat každou vrstvu zvlášť HTML kodérovi a programátorovi.
Šablony je ovšem výhodné používat také v případě, kdy aplikaci vyvíjí jeden člověk. Představte si situaci, kdy tvoříte nějaký větší projekt, který budete někdy chtít použít znovu. Pokud máte důsledně oddělenou aplikační vrstvu (například jazyk PHP) od prezentační vrstvy (HTML), nebudou úpravy tolik složité. V ideálním případě stačí přepsat pouze HTML kód (v šabloně) a práce je hotová. Začínající programátor si možná řekne, že ten kód přeci může upravit stejně i když šablony nepoužívá. To je sice pravda, ale pokud jsou obě vrstvy promíchané, je třeba projít všechny soubory postupně a upravovat HTML kód mezi řádky PHP, což je o mnoho pracnější, náročnější a delší.
Šablon pro PHP je celá řada. Já se zaměřím na šablonovací jazyk Smarty. Dobře zpracovaný turtoriál v češtině naleznete na adrese smarty.ronnieweb.net. Bohužel autor již dlouho obsah neaktualizuje, přesto doporučuji stránky navštívit. Tento článek nepodává kompletní vysvětlení prací se šablonami, zaměřuje se spíše na výčet praktických postupů.
Instalace je poměrně jednoduchá, stačí si stáhnout balíček z www.smarty.net/download.php a rozbalit ho.
Doporučuji si v projektu vytvořit adresář smarty, do kterého se zkopíruje obsah složky libs z balíčku, a dále složku templates, do které se budou ukládat šablony. V hlavním souboru projektu poté vložíme třídu Smarty.class.php pomocí příkazu require_once 'smarty/Smarty.class.php';. Nyní již můžeme třídu použít a nakonfigurovat jí. To uděláme následujícím kódem:
$smarty = new Smarty;
$smarty->compile_check = true;
$smarty->debugging = false;
$smarty->template_dir = 'smarty/templates';
$smarty->compile_dir = 'smarty/templates_c';
$smarty->config_dir = 'smarty/configs';
$smarty->plugins_dir = array('smarty/plugins');
Pokud některé nastavení nepotřebujete, lze ho vynechat, v opačném případě je třeba se ujistit, že daná složka opravdu existuje (pokud nevíte, zda je pro vás některé nastavení potřebné, nechte ho beze změny a vytvořte příslušné adresáře. V budoucnu již nebudete muset nastavení měnit). Všechny proměnné nemusíme definovat takto, lze je konfigurovat přímo v souboru Smarty.class.php.
Tím je instalace hotová a Smarty by se měly dát použít.
Šabloně předáme data pomocí metody assign, jejíž použití je následující:
$smarty->assign('jmeno',$jmeno);
Často potřebujeme vybrat data z databáze a následně je předat šabloně. Na začátku je tedy SQL dotaz:
$result = mysql_query("SELECT nazev, titulek, text, cena FROM tabulka WHERE id='$id'");
Jak nyní předat data šabloně?
Nejjednodušší řešení je předat rovnou pole:
$smarty->assign('data',mysql_fetch_assoc($result));
Schválně jsem do vybíraných sloupců zahrnul cenu. Tu může být potřeba naformátovat, například vynásobit o DPH. Pro tento případ musíme náš kód malinko upravit:
$row = mysql_fetch_assoc($result);
$row['cena'] = $row['cena'] * 1,19;
$smarty->assign('data',$row);
Proč tento postup uvádím? Často jsou v kódu vidět následující konstrukce:
$row = mysql_fetch_assoc($result);
$nazev = $row['nazev'];
$smarty->assign('nazev',$nazev);
$titulek = $row['titulek'];
$smarty->assign('titulek',$titulek);
Jak je vidět na první pohled, tento způsob je pracnější, delší a logicky i pomalejší. Programátor musí kopírovat podobný kód a v případě, že do dotazu přidá další sloupec, musí ho opět přiřadit ručně. V prvních dvou případech stačí přidat sloupec do dotazu a následně je k dispozici i v šabloně.
Vypsat data v šabloně již není nic těžkého, ve Smarty se pro proměnnou používá, stejně jako v PHP, znak $. Zdrojový kód Smarty šablon se uzavírá do znaků {} (pokud nenastavíte jinak).
Zobrazení konkrétní proměnné jmeno tedy bude v šabloně vypadat takto:
{$jmeno}
V předchozím příkladě jsme naplnili proměnnou $data polem z databáze (v řeči PHP např. $data['titulek'], $data['cena']). I tyto proměnné jsou snadno dostupné, stačí použít syntaxi pro pole:
{$data.titulek}
{$data.cena}
Toto byl rychlý úvod do šablonovacího jazyka Smarty, v některém z příštích článků popíšu další užitečné postupy, například tvorbu univerzálního menu v PHP a jeho výpis v šabloně.
23.07.08 - Programování - 3427x -
Karma: 11.

Sorry, ale uváděné postupy jsou typické PHP bastly, které bys měl uvádět maximálně jako odstrašující příklady.
Fuj fuj fuj, jdu pryč... a tenhle článek přidám do seznamu příkladů, že PHP nutí lidi programovat jako prasata.
Odpověď na Ondra — #1 Můžeš tedy uvést lepší postup? Rád bych věděl, jaký existuje nebastlící způsob na předání dat šabloně. Nechám se poučit.
Njn sorry za ten ofenzivní styl, vzal jsem si osobně tu zmínku o špatném překladu.
Nebastlící styl spočívá v tom, že od sebe odděluješ vrstvy aplikace. Šablony jsou ta úplně nejvyšší, databáze ta úplně nejnižší. Obvykle je mezi tím ještě 1 až 3 vrstvy, u složitějších aplikací ještě víc.
Obvykle se tedy vkládá ještě bussiness vrstva, která provádí operace nad daty podle vybrané akce klienta, a vrstva datového modelu, která v podstatě modeluje data prostředky daného jazyka a plní je z databáze.
Asi se ti to teď zdá zbytečné a složité, ale věř - až budeš webové aplikace dělat nějaký ten pátek, pak od přímého spojování mysql_*() funkcí a šablon upustíš.
Odpověď na Ondra — #3 Tento model mi také není cizí. Hlavní myšlenkou zde ale mělo být ukázat způsoby předání dat šabloně. Myslím, že je celkem jedno, odkud se data získají, pro tento účel není důvod příklady zbytečně komplikovat.
Článek je zaměřen na méně zkušené lidi. Nepředpokládám, že člověk, který používá tebou popsanou architekturu, by neuměl předat data šabloně. Ovšem viděl jsem již hodně podobných způsobů psaní kódu, proto jsem o tom napsal. Těmto lidem toto podání bude jistě stačit.