"Nejbohatší život má ten, kdo žije s minimem nároků." --Platón

Partial views

7.1.2008 | koubel | Zend Framework

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.

  • Currently 98.571/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
aktuální hodnocení 3.29/5 (hlasovalo: 35)
viewpic 2601x
1 trackback - url pro trackback
1.   Mirin blog - Nová feature partial… - 27.2.2008 23:14
[…] Jak jsem již před nedávnem psal, v novém Zend Frameworku (včera vyšel update stabilní řady 1.0.4 a také release candidate 1 verze 1.5.0) je kromě jiného i nová řada view helperů a jedním z nich je i P […]
0 komentářů - Přidej komentář
Přidej komentář