Zend framework - view Smarty
Předchozí příspěvek na téma Zend framework se věnoval controllerům. Jednou z hlavních složek MVC patternu. Dnes se chci věnovat další složce a tou je View.
Zend View
Již minule jsem ukázal jak je možné dostat výstup z akce do návštěvníkova prohlížeče. Ale jistě sami uznáte, že to nebyl zrovna elegantní přístup. Přeci jen, použití příkazu echo v business logice by se vůbec nemělo objevovat.
Právě vrstvu prezentační logiky řeší v tomto frameworku třída Zend_View, která implementuje vlastnosti a metody z abstraktní třídy Zend_View_Abstract. Co mě však trošku překvapilo, že je to vlastně jen další php, starající se o zobrazení. Stále se musí přepínat kontext z html do php interpretu a zpět. Což působí poněkud zvláštně, ale uznávám, že to může být pouze můj dojem a phpčkarům tento přístup nevadí.
Proto jsem se poohlédl po nějakém template systému, který by byl vhodný pro prezentaci dat a přitom byl uživatelsky přívětivější. Jako jeden z nejpoužívanějších a dostatečně podporovaných je systém Smarty template, který jsem se rozhodl implementovat do mojí aplikace.
View Smarty
Jaké kroky je nutné provést, abychom mohli používat v naší aplikaci Smarty. Jako první krok je nahrání template systému do adresářové struktury aplikace. V adresáři library, ve kterém je také nahrán Zend framework vytvoříme adresář Smarty a nahrajeme do něj obsah adresáře libs z instalace Smarty. Tím máme první krok hotový.
Již v prvním příspěvku popisujícím instalaci, jsem se zmínil o třídě Zend_Loader a jejím chování. Jelikož budeme potřebovat vytvořit vlastní třídy, budou se nám tyto znalosti hodit. Vlastní třídy je dobré vytvářet v samostatném namespace (alespoň tak jsem si to pojmenoval já) tedy v terminologii Zend v novém adresáři. Já si vytvořil adresář JiravaNet v podadresáři library, kam budu umísťovat vlastní třídy. Tím jsem také určil, jaký název budou mít moje třídy, vyskytující se v aplikaci.
Při mém letmém procházení nápovědy k Zend frameworku jsem našel i vzor třídy, který implementoval potřebný interface Zend_View_Interface a zpřístupnil tak Smarty. Jelikož však tato třída obsahovala Zend namespace, přejmenoval jsem ji a umístil do vlastního adresáře. Tuto třídu jsem nazval JiravaNet_View_Smarty. (samozřejmě bylo třeba ještě vytvořit jeden podadresář s názvem View a do něj umístit soubor smarty.php s příslušnou implementací třídy.
Tím jsem si připravil možnost použití dalšího template enginu pro použití v Zend frameworku. Ještě však zbývá jeden krok, a to instancování - injection - této nové třídy do controlleru.
$this->initView()
Tak jako v asp.net doporučuji pro třídu Page vytvořit potomka a teprve pomocí něj vytvářet konkrétní stránky, stejný princip je vhodný i v případě abstraktní třídy Zend_Controller_Action. Pokud to provedeme mnou popsaným způsobem, nebudeme se muset u každého dalšího controlleru starat o opakované akce a v případě nutnosti provést změnu, tuto budeme dělat pouze na jednom místě a to s vědomím, že nebudeme muset zasahovat do tříd frameworku.
Jednou z opakovaných akcí je právě instancování enginu pro View, v tomto případě tedy instancování naší třídy JiravaNet_View_Smarty. To provedeme pomocí přepsání metody initView() a tak naplníme public proměnnou $view, která nám bude nadále sloužit v jednotlivých akcích controlleru, tak jak ji samotní tvůrci frameworku k tomuto účelu předurčili.
Ve vyvolané akci nám už zbývá jediné, naplnění proměnných, které bude využívat naše šablona, a na závěr akce zavoláme metodu render(), jenž se postará o vyrenderování obsahu a odeslání dat na klienta.
Tento příspěvek byl spíše teoretický a jistě si říkáte, že schází nějaký ten kód, který do toho vnese více světla. Ještě chvíli vás nechám napnuté, nebude to však již dlouho trvat, zbývá jeden den a hlavní kostra aplikace bude hotová a její zdrojové kódy dám k dispozici. Snad mi vyjde zveřejnění těchto kódů na dříve než stihne Ronnie uveřejnit svůj Hello world na intervalu (zatím jen příslib).
Opět zítra ve stejnou dobu se budu těšit.
1 Comment
said
<p>Jak jsem minule slíbil, blížíme se do finále. Vlastně by se dalo říct, že je to takové malé finále, protože</p>