Pokud chcete mít možnost jednoduše měnit design svých stránek, chcete mít přehledný kód s oddělenou aplikační a zobrazovací logikou, Smarty je pro Vás určitě správná volba.

Na Smarty jsem narazil prakticky náhodou, když jsem se prokousával jednou diskuzí. Na první pohled mě to velice zaujalo, a tak jsem se o nějaký ten den později této knihovně podíval na zoubek.

Princip a hlavní výhody Smarty

O co se tedy jedná a jak to vlastně funguje ? V klasické PHP stránce je vše v jednom - jak HTML tagy, tak samotný vyhodnocovací skript. Se Smarty tomu tak ale není.

<vsuvka>

Jak jistě víte, PHP spadá do skupiny jazyků zvané interpreti. Interpret postupuje tak, že řádek po řádku čte zdrojový kód a okamžitě ho přeloží a provede. Dalším typem programovacích jazyků je kompiler. Kompilátor postupuje tak, že nejdříve celý zdrojoý kód přeloží a to jestli bude spuštěn nebo ne už nechává na uživateli, programátorovi. Klasickým příkladem zkompilovaných souborů jsou klasické windowsácké exe soubory.

</vsuvka>

Díky Smarty se z PHP stane v uvozovkách kompiler. Pokud budete používat Smarty, celkem radikálně změníte způsob, jakým tvoříte webové stránky. Zatímco dříve jste otevřeli editor a začali psát php soubor ve kterém bylo i HTML, teď tomu tak nebude. Nejdříve si vytvoříte soubor s koncovkou tpl, ve kterém bude (X)HTML šablona s tím že na místa s dynamickým obsahem, kde byste za normálních okolností měli vyhodnocovací skripty, umístíte pouze název proměnné, které později přiřadíte požadovanou hodnotu. To už se ale bude provádět v samotném PHP skriptu. Potom vytvoříte PHP soubor, kde bude veškerá vyhodnocovací část, s tím že tento dynamický obsah přiřadíte proměnným uvedeným ve Smarty šabloně. Nakonec jí necháte zkrátka zobrazit.

Hlavní výhodou Smarty je, že odděluje aplikační logiku od zobrazovací. Díky tomu jsou skripty velice přehledné, velkou výhodu to také přináší velkým projektům, kde si díky Smarty webdesigneři a programátoři navzájem nelezou do zelí.icon_smile.gif

Říkal jsem, že Smarty dělá z PHP v uvozovkách kompilera. Jak jsem to tedy myslel ? Totiž když spustíte php skript - dejme tomu index.php, kde je spuštěna instance Smarty, provede se následující. Vezme se soubor se šablonou a soubor s php skripty, celé se to prožene knihovnou Smarty a zkompiluje se úplně nový soubor, který už bude obsahovat obě dvě části - tento soubor se teprve interpretuje prohlížeči.

Možná teď úplně nechápete, takže se raději ještě podíváme na jednoduchý příklad. Dejme tomu, že by jsme chtěli vytvořit stránku, která na základě hodnoty proměnné clanek v URL načte příslušný článek a zobrazí jej.

Bez Smarty

soubor.php

<html>
<head>
<title></title>
</head>

<body>

<?php
if(isset($_GET[clanek]))
{

$dotaz ="SELECT * FROM clanky WHERE adresa="$_GET[clanek]"";
$query = mysql_query($dotaz) or die("SQL dotaz nešlo provést");
$row=mysql_fetch_array($query);

}
 ?> 

<div id="nadpis"> 

 <?php 
echo $row[nadpis];
?>

</div>

<div id="perex">

<?php
echo $row[perex];
?>

</div>

<div id="clanek">

<?php
echo $row[clanek];
?>

</div>
</body>
</html>

S použitím Smarty

sablona.tpl

<html>
<head>
<title></title>
</head>

<body>

<div id="nadpis"> 
{$nadpis} 
</div>

<div id="perex">
{$perex} 
</div>

<div id="clanek">
{$clanek} 
</div>

</body>
</html>

skripty.php

<?php

require_once 'moje-smarty.php5';
$smarty = new MojeSmarty;

if(isset($_GET[clanek])){

$dotaz ="SELECT * FROM clanky WHERE adresa="$_GET[clanek]"";
$query = mysql_query($dotaz) or die("SQL dotaz nešlo provést");
$row=mysql_fetch_array($query);

}

$smarty->assign('nadpis',$row[nadpis]);
$smarty->assign('perex',$row[perex]);
$smarty->assign('clanek',$row[clanek]);

$smarty->display('sablona.tpl');

?>

Co všechno Smarty umí ?

Umí toho hodně, ale já používám v podstatě jenom tří funkce. Jinak jsou tu i podmínky a includy php souborů atd. ale řekl bych, že pokud byste je používali na straně Smarty, tak vlastně popřete hlavní funkci Smarty (oddělit aplikační a zobrazovací logiku).

  • {$proměnná} - Viz. příklad, na toto místo budou dosazeny příslušná data.
  • {literal}Obsah mezi těmito značkami nebude kompilován, je nutné použít např. v případě, že máte v šabloně JavaScript nebo CSS.{/literal}
  • {section name=a loop=$promenna} {$promenna[a]} {/section} Z PHP můžete proměnným v šabloně odesílat i celá pole, takto potom pole projdete.

Závěrem

Smarty dokonce získal vlastní subdoménu pod php.net, takže pokud Vás zajímá více, podívejte se sem: http://smarty.php.net/.
Pokud chcete Smarty začít používat, velice doporučuji tuto stránku: http://smarty.ronnieweb.net/, kde se dozvíte jak Smarty uvést do provozu a hlavně získáte daleko rozsáhlejší informace o jeho funkcích.

Pokud máte takto vytvořený web, změna designu je pak jen otázkou změny šablony. Nejlépe to je vidět, pokud se rozhodnete svojí stránku napasovat do nějakého free designu, kterých se po internetu válí nespočet. Najít je můžete např. zde: http://www.openwebdesign.org/.
Změna vzhledu pak spočívá v nalezení příhodné šablony, která se bude hodit pro Vaše data (tzn. hlavně počtem informačních oken) a poté vložení proměnných na příslušná místa. Dá se tak kompletně překopat web během jedné hodiny.

icon_exclaim.gifDůležitou informací je, že Smarty je objektově napsaná knihovna, takže je nutné mít server s PHP5.icon_exclaim.gif

9 komentářů

Neváhejte napsat k článku komentář

Nevyplňujte:

  1. 1
    bs

    v tom článku je úplně všechno špatně:

    "Jak jistě víte, PHP spadá do skupiny jazyků zvané interpreti. Interpret postupuje tak, že řádek po řádku čte zdrojový kód a okamžitě ho přeloží a provede. Dalším typem programovacích jazyků je kompiler. Kompilátor postupuje tak, že nejdříve celý zdrojoý kód přeloží a to jestli bude spuštěn nebo ne už nechává na uživateli, programátorovi. Klasickým příkladem zkompilovaných souborů jsou klasické windowsácké exe soubory."

    - ne, PHP není interpret, PHP je interpretovaný jazyk. interpret je php[n]isapi.dll ([n]=verze)
    - kompiler není programovací jazyk ale překladač do nižší úrovně
    - nemáš pravdu, že win32 exe je typický příklad kompilovaného souboru, ba naopak ... většina win32 exe je částečně kompilovaná částečně interpretovaná (jsou to exe od visual basicu nebo exe závislá na frameworku)

    "Díky Smarty se z PHP stane v uvozovkách kompiler."

    - to nejde ani v uvozovkách

    "celé se to prožene knihovnou Smarty a zkompiluje se úplně nový soubor, který už bude obsahovat obě dvě části - tento soubor se teprve interpretuje prohlížeči."

    - ten soubor se NEzkompiluje, protože kompilace je překlad do jazyka nižší úrovně
    - zkompilovaný soubor se interpretuje? když vezmu fakt, že na úrovni OS se kód kompiluje do strojového kódu, který už je z našeho pohledu spustitelná binárka, jak může prohlížeč interpretovat strojový kód? to by musel být nějaký emulátor mikroprocesoru.

    • Na komentář odpověděl(a) Antonín Daněk v komentáři #2
  2. 2
    Antonín Daněk

    danek<zavináč>antonindanektečkacz

    Toto je odpověď na příspěvek: 1#

    Úplně všechno špatně ? Tohle mi připomíná mého profesora na měření, kterému když člověk řekně místo ,,pořád stejný" ,,konstantní" a on na to reaguje stejným způsobem. icon_evil.gif

    php[n]isapi.dll je interpret - zkráceně PHP.

    Sorry, ale když už slovíčkaříš, tak překladač je kompilátor. icon_neutral.gif

    S tim exe nevim jak to je, možná máš pravdu. Ale stojim si za tím, už jen proto, že nám to říkal maestro Štěrbík - tvůj idol icon_lol.gificon_wink.gif.

    Co sem pleteš strojový kód proboha ? Teď mam pocit, že vůbec nevíš co to kompilace je.
    Výňatek z wiki:
    Překladač (též kompilátor, anglicky compiler z to compile – sestavit, zpracovat) je všeobecně stroj, respektive program, provádějící překlad z nějakého vstupního jazyka do jazyka výstupního.

    Napsal kompiler jen v uvozovkách. Se Smarty se sice vezme napsaný kód, prožene se to knihovnou a vznikne úplně nový soubor (prvky kompileru), akorát že nově vzniklý kód není v jiném jazyce ale zase v PHP - proto ty uvozovky.

    • Tento komentář je reakcí na příspěvek #1, který napsal(a) bs
    • Na komentář odpověděl(a) bs v komentáři #3
  3. 3
    bs

    Toto je odpověď na příspěvek: 2#
    no kdyz to neni jinej jazyk ale zase PHP tak to popira princip kompileru, takze to neni kompiler ani v uvozovkach.

    "php[n]isapi.dll je interpret - zkráceně PHP."
    pak si teda napsal ze "php4isapi.dll spada do skupiny jazyku"

    ja se nechci hadat, dej to neajkymu leetovi co ti na to rekne :)

    • Tento komentář je reakcí na příspěvek #2, který napsal(a) Antonín Daněk
    • Na komentář odpověděl(a) Antonín Daněk v komentáři #4
  4. 4
    Antonín Daněk

    danek<zavináč>antonindanektečkacz

    Toto je odpověď na příspěvek: 3#

    Sorry ale tohle fakt nemá cenu, kecáš kraviny a když budu reagovat tak to tady pěkně zaprasim. Jestli chceš ještě řešit co je kompiler a jaký význam maji uvozovky, tak mi napiš na ICQ.
    Jestli si někdo přečte komentáře ještě před článkem, tak se ani k samotnýmu článku nedostane, protože si bude myslet, že sem chodí samí debilové. Takže díky za super komentáře. icon_arrow.gificon_confused.gificon_arrowl.gif

    • Tento komentář je reakcí na příspěvek #3, který napsal(a) bs
  5. 5
    bs

    vzdyt ani neumis postavit bubble sort ... tvoje myslenky jsou pozadu ...

  6. 6
    Alcator

    alcator<zavináč>seznamtečkacz

    No, jak to teda je:

    1) Nejprve zdroják PHPčkového skriptu prochází syntaktickou analýzou; je-li v něm chyba (chybějící středník apod.), skript se vůbec nespustí.

    2) Teprve po syntaktické analýze, která pro prováděcí jádro převede často značně "obohacený zdroják" (komentáře apod.) do formy, se kterou se vykonavač nemusí tolik otravovat, začne vykonavač provádět jednotlivé kroky skriptu. Pokud v průběhu tohoto procesu narazí na něco, čemu nerozumí (volání neexistující funkce apod.), zahlásí chybu a skončí.

  7. 7
    Petr

    Cituji oficiální zdroj:

    Smarty requires a web server running PHP 4.0.6 or greater.

    Hádej kde je ve tvém článku chyba! Nezapomeň, že PHP4 umí objekty také.

    • Na komentář odpověděl(a) Antonín Daněk v komentáři #8
  8. 8
    Antonín Daněk

    danek<zavináč>antonindanektečkacz

    Toto je odpověď na příspěvek: 7#
    ,,Umí", ale dost úděsně. Abych řekl pravdu, tak v praxi se mi - pokud mě paměť neklame - Smarty na PHP 4 rozchodit nepodařilo..

    • Tento komentář je reakcí na příspěvek #7, který napsal(a) Petr
    • Na komentář odpověděl(a) Jirin v komentáři #9
  9. 9
    Jirin

    Me se je podarilo na PHP4 rozejit hend na poprve a v pohode:-)

    • Tento komentář je reakcí na příspěvek #8, který napsal(a) Antonín Daněk