Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

7. 1. 2008 Zend Framework

Partial views

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.