V předešlých článcích jsme již prošli většinu důležitých aspektů šablonovacího systému SMARTY. Tentokrát si ukážeme jak pracovat s cache mechanismem, který je ve SMARTY zabudován, jak použít SMARTY pro tvorbu jiných typů dokumentů než je (X)HTML a popíšeme si ještě některé další vlastnosti a funkce tohoto systému, které stojí za připomenutí.

Cache paměť

Asi všichni čtenáři vědí, že cache slouží ke zrychlení načítání souborů (v našem případě šablon) tím způsobem, že do mezipaměti je uložen výsledek požadavku uživatele, který je použit při dalších požadavcích. V případě SMARTY jsou do cache paměti ukládány šablony, které již není nutné zpracovávat parserem a je možné je přímo uživateli zobrazit.

Zde je nutné upozornit na to, že je potřeba důkladně rozmyslet, co a hlavně jak dlouho se bude do dočasné paměti ukládat. Například stránky s informacemi o firmě můžeme s klidným svědomím uložit do cache-paměti na poměrně dlouhou dobu. Naopak stránky obsahující výpis databáze by nebylo vhodné ukládat, protože pak by uživatel při různých dotazech obdržel vždy stejný obsah.

Jak tedy nastavit SMARTY tak, abychom mohli cache použít? Prvním a nejdůležitějším krokem je správné nastavení proměnné $caching, třídy Smarty. Buď tak můžeme učinit přímo v souboru Smarty.class.php nebo až po vytvoření nového objektu této třídy. Pokud použijeme druhou možnost, pak by nastavení mělo vypadat následovně:

<?php
require(‚Smarty.class.php‘);
$smarty = new Smarty;
// nastaveni kesovani na true
$smarty->caching = true;
$smarty->display(‚index.tpl‘);
?>

Dále je nutné zkontrolovat nastavení proměnné $cache_dir stejné třídy, zda ukazuje do správného adresáře, kam mohou být šablony pro cache ukládány. Pokud vše funguje správně, bude po spuštění skriptu uložen do cache adresáře soubor s názvem šablony.

Životnost cache

Pokud máme spuštěn systém cache paměti, pak se můžeme věnovat nastavení doby, po kterou bude šablona v cache paměti uložena. Toto nastaveni můžeme upravit změnou hodnoty proměnné $cache_lifetime, která obsahuje v sekundách definovaný čas, po který bude načítána šablona uložená v cache. Po jeho uplynutí se soubor pro cache vygeneruje znovu. Standardní hodnotou této proměnné je jedna hodina, respektive 3600 sekund.

$smarty->cache_lifetime = 300;

Pokud použijeme výše uvedené nastavení, zjistíme, že hodnota $cache_lifetime, je aplikována na všechny šablony bez rozdílu. Jak ale vyřešit případ, kdy budeme chtít nastavit rozdílné hodnoty životnosti pro různé šablony? Řešení tohoto problému je poněkud komplikovanější. Především je nutné změnit nastavení proměnné $caching na hodnotu 2. Nyní musíme před zpracováním šablony pomocí příkazů display nebo fetch nastavit proměnou $cache_lifetime na požadovanou hodnotu.

<?php
require(‚Smarty.class.php‘);
$smarty = new Smarty;
// cache se bude pouzivat pro kazdou sablonu zvlast
$smarty->caching = 2;
// nastavime zivotnost pro sablonu index.tpl
$smarty->cache_lifetime = 300;
$smarty->display(‚index.tpl‘);
// a jinou pro home.tpl
$smarty->cache_lifetime = 3600;
$smarty->display(‚home.tpl‘);
?>

Kromě standardní podpory cache, tak jak jsme si ji ukázali, umožňuje SMARTY i komplexnější manipulaci s cache, jako je vytváření více cache souborů pro jednu šablonu nebo jejich seskupování do skupin různých úrovní. Jelikož se jedná o vlastnosti, které běžně nevyužijeme, uvedu zde pouze odkaz na oficiální dokumentaci systému SMARTY.

Na závěr si ještě krátce popíšeme jednu proměnou a dvě metody třídy Smarty, které při práci s cache pamětí využijeme. Proměná $compile_check obsahuje boolean hodnotu, na jejímž základě SMARTY při kompilaci šablony kontroluje, zda pro ni existuje novější verze a v kladném případě vygeneruje nový cache soubor bez ohledu na nastavení životnosti šablony v cache.

Dále SMARTY poskytuje metody clear_cache a is_cached. První metoda nedělá nic jiného, než že smaže dočasné soubory v závislosti na předaných parametrech (názvu šablony). Pokud nezadáme žádný parametr, pak budou vymazány všechny dočasné soubory umístěné v příslušném adresáři. Druhou metodu použijeme v případě, kdy budeme chtít zjistit, zda je určitá šablona (opět je její název parametrem funkce) již v dočasné paměti uložena.

WAP, WML, XML…

SMARTY je sice primárně určeno pro vytváření (X)HTML stránek, ale nijak neomezuje použití i s jinými formáty šablon. Asi nejčastěji se setkáme s využitím tohoto systému při vytváření WAPových stránek. Jediný rozdíl v použití systému SMARTY tímto způsobem je v tom, že před odesláním WML stránky odpovídajícímu prohlížeči je nutné pomocí nativní PHP funkce header vytvořit a odeslat hlavičku Content-Type s následujícím obsahem:

// hlavicka
Content-Type: text/vnd.wap.wml
// php prikaz
header( „Content-Type: text/vnd.wap.wml“ );

Jedním z možných řešení může být použití funkce PHP hned na začátku šablony:

{php}
   header( „Content-Type: text/vnd.wap.wml“ );
{/php}
<?xml version=“1.0″?>
<!DOCTYPE wml PUBLIC „-//WAPFORUM//DTD WML 1.1//EN“ „http://www.wapforum.org/DTD/wml_1.1.xml“>

V projektech velkých vnitrofiremních portálů se můžete setkat s požadavkem na dynamické vytváření PDF souborů (smluv, faktur a podobně). I k tomuto účelu lze SMARTY použít. Pomocí SMARTY a šablon napsaných v XML vygenerujeme XML soubor, který se předá XSL procesoru a ten jej pomocí transformace převede do podoby PDF souboru.

Bezpečnost šablon

Jak jsme si vysvětlili v úvodním článku o SMARTY, jsou šablony nejdříve zkompilovány a poté uloženy do zvláštního adresáře (ten je dán nastavením proměnné $compile_dir třídy Smarty), odkud jsou při dalších volání znovu načítány. Právě požadavek na uložení zkompilované šablony může být jedním z bezpečnostních problémů při použití systému SMARTY.

Při ukládání výsledných stránek a šablon na produkční server je nutné zajistit, aby měl systém SMARTY přístup do adresáře se zkompilovanými šablonami nejen pro čtení, ale také pro zápis. A jelikož je SMARTY spouštěn webovým serverem, je nutné nastavit práva na zápis do dotyčného adresáře odpovídajícím způsobem také pro uživatele, pod kterým je webový server spuštěn.

V případě, že se nejedná o rozsáhlý projekt, je z praktického hlediska asi nejvhodnější povolit přístup do adresáře se zkompilovanými šablonami jen dočasně, dokud nebudou zkompilovány všechny použité šablony. Tím zajistíme, že po spuštění stránek nikdo nepovolaný nevyužije možné chyby ve webovém serveru a nepřepíše námi vytvořené soubory.

Samotný SMARTY obsahuje několik bezpečnostních funkcí, které umožňují zabránit vložení PHP skriptů do šablon. Tento způsob je vhodný zejména tam, kde má více lidí přístup k adresáři do kterého jsou ukládány ještě nezkompilované šablony a mohl by tak do šablony vložit nebezpečný PHP kód. Následujících pět proměnných třídy Smarty ovlivňuje využití interního zabezpečovacího mechanismu:

Název proměnné Hodnota Popis proměnné
$security true/false určuje, zda bude interní zabezpečovací mechanismus používán
$security_dir pole obsahuje adresáře, které jsou považovány za bezpečné pro funkce {include} a {fetch}
$security_settings asociativní pole obsahuje několik nastavení, které se týkají bezpečnosti (například seznam povolených PHP funkcí a další)
$trusted_dir pole obsahuje adresáře, které jsou považovány za bezpečné při vkládání PHP skriptů do šablony pomocí příkazu {include_php}
$php_handling jedna z povolených hodnot obsahuje jednu z povolených hodnot, definující, jakým způsobem se bude zacházet s vkládaným PHP kódem

Závěr

Tímto tématem jsme uzavřeli problematiku šablonovacího systému SMARTY. Cílem seriálu nebylo detailně popsat všechny vlastnosti tohoto systému, ale zaměřit se především na ty, které jej od podobných systémů odlišují.

Pokud budete využívat SMARTY ve svých projektech, určitě se časem dostanete za hranice tohoto seriálu a neobejdete se bez oficiální, i když anglicky psané dokumentace. I těm angličtiny méně znalým bych ji však vřele doporučil, protože vyniká nejen vysokou kvalitou, ale obsahuje také velký počet příkladů, ze kterých se daná problematika snadno pochopí.

Pokud vám SMARTY nevyhovuje a chcete použít jiný systém, případně si vytvořit svůj vlastní, může vám tento seriál posloužit jako ucelený seznam vlastností, které byste měli od opravdu kvalitního systému šablon očekávat.

Odkazy, zdroje

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět