Smarty Template Engine 16.díl - Funkce I.

Napsal (») 6. 6. 2009 v kategorii PHP/HTML, přečteno: 1271×
obrazky/smarty.gif

Smarty Template Engine 16.díl - Funkce I.


Jazyk Smarty nám mimo jiné také nabízí napsání vlastních funkcí a především také funkce vlastní. Funkcí je několik a my si dnes ukážeme ty nejdůležitější, jež většinou používáme k úpravě vstupních proměnných, či k zjednodušení HTML kódu. V případě, že si některé funkce pro svého programátora napíšete sami, tato možnost tu je taky. Často to může být příjemné zjednodušení práce kodéra v případě, že by šlo o složitejší implementaci na straně zdrojového kódu, ale i na straně prezenční logiky. V následujících dvou dílech si ale předvedeme především používání zabudovaných funkcí Smarty template engine.
Knihovny k vlastním fukncím se nahrávají do adresáře plugins, respektive do adresáře, jež si tak nastavíme direktivou $plugins_dir.
Funkce zabudované jsou přímo ve Smarty třídách. Slouží především ke vkládání PHP skriptů a zjednodušení práce s PHP přímo ve Smarty (čemuž se pravděpodobně nikdy nevyhnete). Nedoporučuje se funkce nějakým způsobem upravovat, ale pokud máte potřebu upravit je ke svému obrazu a víte jak na to, proč ne :). Knihovny se přeci dají kdykoliv přehrát do půdovních stavů.
Dále si dejte pozor na funkce stejně pojmenované. V rámci Smarty nahraného ve Vašem webovém uložišti by měla být každá funkce unikátní.

capture

Pomocí funkce capture vložíme jednoduše libovolný text, či příkazy, uzavřené v tazích {capture}{/capture} kdekoliv do šablony pomocí příkazu
$smarty.capture.name
Atribut name musí být v rámci VŠECH šablon unikátní. Pokud tedy budete zadávat capture už někde v útrobách includovaných šablon (pokud by jste uzavřený kód rádi používali v každé šabloně), musí být název unikátní a nikde v další šabloně by jste ho pak již používat neměli.
K čemu se dá capture použít?
Představte si např situaci vložení nového dočasného prvku do těla všech stránek (i dle příkladů na smarty.net, jde typicky např o banner). Samozřejmě existuje možnost odkázat se na daný soubor aplikačně, tedy použít programátora. Ne vždy to však může být možné. Tělo webu bohužel málokdy includujete jako jeden soubor. Řešením je uložení jakéhosi základního kódu někde do hlavičky šablony (z které např. Taháte hlavičku, patičku, či cokoliv jiného). Vše by pak kodér sám řešil poměrně příjemně takto:

{capture name=banner}
<b>Tento kód se vloží všude kde to jen bude možné.</b><br/>
Samozřejmě můžeme využít i odkázání na jakoukoliv proměnnou.<br/>
<i>Proto využijte naši skvělou nabídku<i>
{/capture}


např. index.tpl
{$smarty.capture.banner}


Druhou možností je následující drobná úprava, po které přířadíme hodnotu capture do námi nadefinované proměnné a to pomocí již známého příkazu „assign“. Svým způsobem jde pak o další možnost, jak přímo v šabloně plnit proměnné Smarty.


{capture name=banner assign=vystup}
<b>Tento kód se vloží všude kde to jen bude možné.</b><br/>
Samozřejmě můžeme využít i odkázání na jakoukoliv proměnnou.<br/>
<i>Proto využijte naši skvělou nabídku<i>
{/capture}

např. index.tpl
{$vystup}

Pokud si tedy vybavujete syntaxi přířazování proměnných přímo ve Smarty, logicky zde opět použijeme opět příkaz „assign“.

    • Name – povinný atribut: unikátní název capture pro šablonu

  • assign – nepovinný: přiřazuje hodnotu do speciální proměnné. Přistupovat ke capture pak můžeme jak přes {$smarty.capture.name}, tak přes {$nazev_assign}.

    config_load

    Jediným použitím je načtení námi nadefinovaného konfiguračního souboru nas_config.php do šablony. Konfigurační soubory se ukladání do adresáře, jež jsme nastavili direktivou „config_dir“. Defaultně jde o adresář config


      • file – cesta ke konfiguračnímu souboru (povinné)


      • section – možnost vytvoření proměnných jako pole, či asociativní pole a jejich následní přiřazení k vypsání pomocí příkazu section (nepovinný)

      • scope – jak má být capture zpřístupněna. Defaultní je hodnota „local“. Dále můžeme vyplnit – parent/global. Local umožňuje načtení pouze v lokální šabloně. Parent i v šablonách includovaných. Global pak ve všech. (nepovinná)

      • global – nastavujeme, zda bude capture proměnná viditelná i pro rodiče == parent. V případě, že, je scope nastaveno na globální, toto nastavení ignorováno. Defaultně nastaveno na false. (nepovinný)



    Příklad nejlépe vystihuje příklad podobný tomu z oficiálních stránek Smarty Template Engine. Pro příklad si musíme vytvořit soubor: muj_config.cnfg a umístíme ho do složky config

    muj_config.cnfg
    #this is config file comment

    # global variables
    text = "hahaha"
    pageTitle = "Smarty"
    textColor = #FF0000


    #customer variables section
    [Customer]
    pageTitle = "Customer Info"


    index.tpl
    {config_load file="./muj_config.cnfg"}
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-language" content="cs" />
    <title>
    {#pageTitle#}
    </title>
    </head>
    <body>
    <div>
    <p style="color:{#textColor#};">{#text#}
    </p>
    </div>
    </body>
    </html>


    Ačkoliv se může dané použití jevit nesmyslné, využití může často najít právě na místech, jež je třeba několikrát vypisovat, jako třeba práve Title stránky. Určitě by existovala i možnost předání proměnných odněkud z hlavičky php tak, abychom měli k proměnným všude přístup. Ale tento seriál je hlavně o Smarty, no není to pak elegantní?
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Gui89 z IP 85.207.5.*** | 10.5.2011 13:47
Poslední ukázka kódu, 11 řádek:
{config_load file="./muj_config.conf"} na konci je překlep, mělo by být, jsem dumal proč mi to nejede .)
{config_load file="./muj_config.cnfg"}
Gui89 z IP 85.207.5.*** | 10.5.2011 13:52
jo a ještě by to volání congifu mělo být před tím title, jinak mi to nejede
| 10.5.2011 13:58
Děkuji za upozornění, v obou případech máte samozřejmě pravdu, ukázku jsem dle toho upravil.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel devět a dvanáct