SMARTY znamená chytrý, elegantní, pohotový. A přesně takový je i stejnojmenný systém šablon pro PHP, který umožňuje vkládat do HTML kódu speciální znaky a příkazy a oddělit tak aplikační logiku od prezentace dat. V následující sérii článků se vám pokusím přiblížit všechny základní i pokročilé vlastnosti, které dává SMARTY designérům a programátorům k dispozici, od jednoduchého předávání proměnných, začlenění prezentační logiky do HTML šablon, vytváření vlastních funkci nebo modifikátorů, až po spolupráci s XML a WML.

SMARTY, jak si ještě ukážeme, má sice mnoho vlastností, které z něj tvoří jeden z nejlepších systémů šablon v současné době, nelze o něm ale říci, že se jedná o univerzálně nejlepší systém. Například rychlost není zrovna tím, v čem by SMARTY vynikal. Při výběru nejvhodnějšího systému pro jakýkoli projekt je však nutné brát v úvahu nejen rychlost, ale i funkčnost, rozšiřitelnost, komplexnost, dokumentaci, velikost vytvářeného projektu a další vlastnosti, v nichž SMARTY vyniká.

Možná jste se již s nějakým podobným systémem šablon setkali. V čem se tedy SMARTY od ostatních liší? Především je to způsob, jakým jsou šablony zpracovávány. Při prvním volání (tzn. při prvním spuštění skriptu, který pro svůj výstup šablonu používá) jsou převedeny (zkompilovány) do podoby PHP skriptu, který je následně spuštěn a výsledek odeslán prohlížeči. Při dalším volání je pak spuštěna jen zkompilovaná verze šablony.

Následující kód ukazuje jednoduchou šablonu a její zkompilovanou podobu:

<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.01//EN“ „http://www.w3.org/TR/html4/strict.dtd“>
<html>
<head>
    <title>SMARTY</title>
</head>
<body>
<strong>SMARTY Template Engine</strong><br>
Dnes je: {$smarty.now|date_format:“%d.%m.%Y“}
</body>
</html>
<?php /* Smarty version 2.5.0, created on 2003-08-19 19:42:42
        compiled from example1.tpl */ ?>
<?php $this->_load_plugins(array(
array(‚modifier‘, ‚date_format‘, ‚example1.tpl‘, 9, false),)); ?><!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.01//EN“ „http://www.w3.org/TR/html4/strict.dtd“>
<html>
<head>
    <title>SMARTY</title>
</head>
<body>
<strong>SMARTY Template Engine</strong><br>
Dnes je: <?php echo $this->_run_mod_handler(‚date_format‘, true, time(), „%d.%m.%Y“); ?>
</body>
</html>

Využití kompilace výrazně zrychluje odezvu serveru při opakovaném volání skriptů. Kromě toho má SMARTY také vestavěnu podporu cache paměti, což při použití PHP akcelerátorů umožňuje dosáhnout velmi zajímavých výsledků.

Další výhodou systému SMARTY je komplexnost a robustnost. Distribuce obsahuje kromě základních tříd cca 40 předdefinovaných modifikátorů, filtrů a uživatelských funkcí (v dalších článcích si tyto pojmy přesně vysvětlíme), přičemž není problémem vytvořit další funkce, které pro svůj projekt potřebujete.

Aplikační vs. prezentační logika

Velkou výhodou je jednoduché oddělení aplikační a prezentační logiky. Pod aplikační logikou si představme programový kód, který se například stará o získání dat z databáze, výpočty, vytváření session a podobně. Z názvu je patrné, že tento kód by neměl mít nic společného s prezentací dat.

Naopak prezentační logika se týká jen a pouze prezentování dat. Jedná se například o vytvoření tabulky v závislosti na počtu pracovníků, alternativního textu v případě, že žádní zaměstnanci v daném oddělení momentálně nepracují a podobně.

Nyní si položme otázku proč, pokud máme k dispozici šablony, prezentační logiku vyčleňovat z kódu HTML stránky, když je můžeme stejně efektivně a přehledně začlenit do šablony stránek? SMARTY umožňuje zařadit do HTML kódu stránky příkazy a řídící struktury známé z PHP (if, foreach, else, atd.), které se o prezentační logiku postarají.

Nevýhody

Výše uvedené přednosti však v sobě skrývají jeden problém. Tím je velikost třídy Smarty. Samotný soubor Smarty.class.php má 87 Kb. Další knihovny, potřebné pro používání systému SMARTY, mají dohromady 73 Kb. Autoři, jak vidno, upřednostnili funkční rozsah před rychlostí zpracování.

Rychlost některých systémů šablon může přiblížit následující benchmark. Ve všech uvedených testech se SMARTY (v testu byla použita verze 2.1) umisťuje na posledních místech. Záleží tedy na vás, zda je pro váš projekt rozhodující rychlost nebo nějakou tu desetinu sekundy oželíte.

Pro zajímavost mohu uvést, že svého času (přibližně před rokem) používala SMARTY na svých stránkách i Česká spořitelna. O kvalitách tohoto systému však především svědčí to, že jej pod svá křídla vzala komunita vývojářů PHP. Jeho domovskou stránku najdete na adrese smarty.php.net, kde si také můžete stáhnout aktuální verzi.

Dříve než se pustíme do instalace a nastavení SMARTY upozorňuji, že se napříště budu věnovat verzi 2.5, která je momentálně nejnovější.

Instalace

Pro spuštění SMARTY budeme potřebovat kromě základního balíku také PHP minimálně ve verzi 4.0.6. Jako příklad instalace použijeme server auto-mobily.cz, který je umístěn v adresáři /home/web/auto-mobily.

Po rozbalení archivu najdete v adresáři libs všechny potřebné soubory. Kromě podadresáře plugins (obsahuje předdefinované funkce, modifikátory a filtry) zde naleznete také čtyři soubory:

Soubor Popis
Smarty.class.php hlavní třída, kterou budeme volat ze svých skriptů
Smarty_Compiler.class.php interní třída pro kompilování šablon
Config_File.class.php interní třída pro čtení konfiguračních souborů
debug.tpl šablona integrovaného debuggeru

Nejprve překopírujeme obsah adresáře libs do adresáře, ve kterém bude v rámci vašeho projektu SMARTY umístěno (např. /home/web/auto-mobily/smarty). Druhým krokem je vytvoření následujících adresářů:

Adresář Popis Příklad
configs nepovinný, bude obsahovat konfigurační soubory pro šablony /home/web/auto-mobily/configs
templates bude obsahovat jednotlivé šablony /home/web/auto-mobily/templates
templates_c bude obsahovat zkompilované šablony /home/web/auto-mobily/templates_c

Adresáře nemusí být umístěny ve stejném adresáři jako třídy SMARTY (v našem případě /home/web/auto-mobily/smarty). Volné ruce máte také při pojmenovávání adresářů. Je pouze důležité pamatovat na to, aby webový server měl práva zápisu do adresáře obsahujícího zkompilované šablony.

Posledním krokem instalace je úprava nastavení třídy Smarty. Jedná se o proměnné, určující umístění výše vytvořených adresářů vůči souboru Smarty.class.php. Toto nastavení je možné provést jednorázově editací souboru Smarty.class.php, nebo při každém použití třídy Smarty. Následující část kódu ukazuje, jak by vypadalo nastavení těchto proměnných v našem případě:


    /**
     * The name of the directory where templates are located.
     *
     * @var string
     */
    var $template_dir = ‚./templates‘;
    /**
     * The directory where compiled templates are located.
     *
     * @var string
     */
    var $compile_dir = ‚./templates_c‘;
    /**
     * The directory where config files are located.
     *
     * @var string
     */
    var $config_dir = ‚./configs‘;
    /**
     * An array of directories searched for plugins.
     *
     * @var array
     */
    var $plugins_dir = array(‚plugins‘);

Všimněte si, že proměnná $plugins_dir je pole a může tak obsahovat více adresářů s uživatelskými funkcemi. K této proměnné se ještě vrátíme v článku věnovaném vytváření vlastních funkcí.

Před použitím Smarty ve skriptu je vhodné nastavit konstantu SMARTY_DIR na kompletní cestu k adresáři, který obsahuje celý systém SMARTY. V našem případě by hodnota této konstanty měla být /home/web/auto-mobily/smarty/ (nezapomeňte na poslední lomítko). Není-li tato konstanta určena, pokusí se ji SMARTY vytvořit automaticky.

Tím máme hotovu základní instalaci systému SMARTY. Na závěr článku si ukážeme jednoduchý způsob použití šablon. Po spuštění skriptu by se mělo zobrazit aktuální datum.

PHP skript:

<?php
    require_once( „classes/Smarty.class.php“ );
    $smarty = new Smarty();
    $smarty->display( „example1.tpl“ );
?>

Šablona:

<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.01//EN“ „http://www.w3.org/TR/html4/strict.dtd“>
<html>
<head>
    <title>SMARTY</title>
</head>
<body>
<strong>SMARTY Template Engine</strong><br>
Dnes je: {$smarty.now|date_format:“%d.%m.%Y“}
</body>
</html>

Odkazy

Některé další systémy šablon

1 Příspěvěk v diskuzi

  1. Těšil jsem se že mě něco naučí smarty, ale nepodařilo se mi je ani nainstalovat, ten odstavec o nastavený třídy smarty se opravdu nedá pochopit, vůbec mi není jasné kam mám ten kod napsat nebo skopírovat.

Odpovědět