Než se budu věnovat hlavnímu tématu, tak nejdříve malá poznámka, je tu nová verze celé aplikace, už 1.0 protože všechno, co jsem chtěl do aplikace dostat, tam je a je to v takové podobě, jak jsem si představoval. Co se změnilo:
- Do INSTALL jsem dopsal požadavek na vypnuté short_tag :-), časem to nebude nutné, záhlaví a xml deklaraci nechám na Zend_Layout, pokud to bude podporovat.
- Dopsal jsem ajaxové hodnocení článků. Tím pádem přibyli třídy pro další databázovou tabulku v modelu a dao, view helper, trocha javascriptu, css a použití JSONu prostřednictvím Zend_Json.
- Lazy loading pro Dao u tříd pro domain model.
- Přesunul jsem actions, které obsluhují ajax volání v blogu do Blog modulu, kam patří.
- Nový view helper pro stránkování.
- Cookies pro informace z komentářů a pro hlasování.
- Parciální view, viz níže.
A teď zpět k parciálnímu view. Když se podíváte na to, jak vypadají stránky pro index blogu, archiv a kategorii, jsou v podstatě stejné, pokaždé je tam stejně vypadající seznam článků. Třeba view šablona pro index (index.phtml) před použitím parciálního view vypadala následovně:
<?php foreach($this->articles as $article):$this->appUrlEnum->setBlogEntryName($article->getTitleUrl())?>
<div class="post">
<h2><?php echo $this->anchor($this->appUrlEnum->blogEntry,$article->getTitle())?></h2>
<p class="info"><span class="date"><?php echo $this->commentDate($article->getPosted())?></span> |
<span class="author"><?php echo $article->getUsername()?></span> |
<?php echo $this->articleCategories($article->getCategories())?>
</p>
<?php echo Article::getFirstParagraph(article->getText())?>
<p class="info">
<a href="<?php echo $this->appUrlEnum->blogEntry?>"><?php echo $this->trans("Whole article")?></a> |
<a class="commentlink" href="<?php echo $this->appUrlEnum->blogEntry?>#comments"><?php echo $article->getCommentCount()." ".$this->trans("comments",$article->getCommentCount())?></a>
</p>
</div>
<?php endforeach?>
Téměř to samé bylo možné vidět u šablon pro výpisu kategorie, archivu a dokonce výsledků hledání. Jen jsem
občas použil jiný název proměnné v cyklu. Nabízí se tedy řešení ten vnitřek cyklu dát do
samostatného parciálního view a to pak zobrazovat pokaždé stejně přes metodu render()
. Naše parciální view
(třeba articleInList.phtml) pro zobrazení informací o jednom článku pak bude vypadat následovně:
<h2><?php echo $this->anchor($this->appUrlEnum->blogEntry,$this->article->getTitle())?></h2>
<p class="info"><span class="date"><?php echo $this->commentDate($this->article->getPosted())?></span> |
<span class="author"><?php echo $this->article->getAuthorName()?></span> |
<?php echo $this->articleCategories($this->article->getCategories())?>
</p>
<?php echo Article::getFirstParagraph($this->article->getText())?>
<p class="info">
<a href="<?php echo $this->appUrlEnum->blogEntry?>"><?php echo $this->trans("Whole article")?></a> |
<a class="commentlink" href="<?php echo $this->appUrlEnum->blogEntry?>#comments"><?php echo $this->article->getCommentCount()." ".$this->trans("comments",$this->article->getCommentCount())?></a>
</p>
Je to tedy vnitřek foreach s tím rozdílem, že místo $article
je všude $this->article
.
Musíme tedy zajistit nastavení proměnných article, appUrlEnum
do příslušného view, které nám bude
renderovat naše parciální view. A proč k tomu nevyužít view v hlavní šabloně (index.phtml), ze které budeme volat parciální view?
<?php foreach($this->articles as $this->article):$this->appUrlEnum->setBlogEntryName($this->article->getTitleUrl());?>
<?php echo $this->render("articleInList.phtml")?>
<?php endforeach?>
Je zde vidět, jak se pěkně využívá overloading a metody render třídy Zend_View. Na stejnou věc přišel i Pádraic Brady, zobecnil to do helperu a navrhl Zend_View_Helper_Partial jako součást Zend_View_Enhanced, který bude součástí nové verze ZF. V našem případě by to vypadalo s použitím helperu nějak takto:
<?php foreach($this->articles as $article):$this->appUrlEnum->setBlogEntryName($this->article->getTitleUrl());?>
<?php echo $this->partial("articleInList.phtml",array("article"=>$article))?>
<?php endforeach?>
Výhodu view helperu oproti jednodušší a asi i rychlejší variantě, kterou jsem použil já, vidím v možnosti nastavit parametry view pro partial šablonu nezávisle na na view, které helper volá. V dalším update blogu to ale stejně asi přepíšu na použití nového view helperu a layoutu, které jsou součástí přímo frameworku.
Komentáře (0)
Komentáře jsou uzavřeny.