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.
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
26.04.2007 13:36