Navigace

Hlavnφ menu

 

SMARTY - chytrΘ Üablony pro PHP

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:

SouborPopis
Smarty.class.phphlavnφ t°φda, kterou budeme volat ze sv²ch skript∙
Smarty_Compiler.class.phpinternφ t°φda pro kompilovßnφ Üablon
Config_File.class.phpinternφ 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ß°PopisP°φklad
configsnepovinn², bude obsahovat konfiguraΦnφ soubory pro Üablony/home/web/auto-mobily/configs
templatesbude obsahovat jednotlivΘ Üablony/home/web/auto-mobily/templates
templates_cbude 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

Kouba, èt∞pßn (15.9. 2003)