Vzhledem k blížícímu se vydání Zend Frameworku 1.6.0 GA bych rád probral některé významných změn v nové verzi.
Zend_Paginator
Zend_Paginator je komponenta, která zjednodušuje výpis stránkovaných dat na nejjednodušší možnou míru.
- umí stránkovat jakákoliv data, ne jen výsledek z databáze
- při použití databáze se načítá jen nezbytné množství výsledků (na #zftalk někdo mluvil o bezproblémovém použití i s 2 miliony záznamů v tabulce)
- umožňuje libovolný výpis ovládání stránkování (pomocí partials)
Stránkování dat z různých zdrojů je zajištěno pomocí různých adaptérů. V distribuci ZF jsou přítomny tyto:
- Array – použití PHP pole
- DbSelect – použití instance Zend_Db_Select
- Iterator – použití instance Iterator
- Null – nepoužívá Zend_Paginator pro správu dat, ale stále umožňuje využití výhod funkce pro výpis stránkpování
Při vytváření instance Zend_Paginator je nutné konstruktoru předat adaptér:
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($data));
$data je PHP pole, které chceme stránkovat.
Případně je možné použít factory metodu, která rozpozná typ předaných dat:
$paginator = Zend_Paginator::factory($data);
Pokud chceme využít jako zdroj dat databázi, tak je to možné tímto způsobem:
$select = new Zend_Db_Select($db);
$select->from('test');
//tady může být složité nastavení Selectu, spoustu joinů atd.
$paginator = Zend_Paginator::factory($select);
Poté už je komponenta připravena k použití, ale pro plnou funkčnost je ještě potřebat umožnit postup pro stránkách. Je vhodné použít nějakou routu, abychom získali lepší SEO url. V tomto příkladu se spokojíme jen s použitím parametru page.
$paginator->setCurrentPageNumber($this->_getParam('page'));
Nyní už máme vše připravené a můžeme paginator předat do view:
$this->view->paginator = $paginator;
View script
Protože Zend_Paginator implementuje SPL interface IteratorAggregate, je možné snadno procházet jednotlivé prvky pole. Pokud budeme stránkovat vícerozměrné pole, není problém použít $item[].
<?php if (count($this->paginator)): ?>
<ul>
<?php foreach ($this->paginator as $item): ?>
<li><?= $item; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
Ovládání stránkování je vypisováno pomocí view helperu paginationControl.
<?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>
- Prvním parametrem je naše instance Zend_Paginator.
- Druhým parametrem určujeme způsob posuvu číslování.
- Pokud použijeme ‚All‘, tak dostaneme výpis všech stránek, což je vhodné například při stránkování pomocí rozbalovacího menu.
- ‚Elastic‘ označuje styl stránkování který používá Google – jak postupujeme dál, přibývají nám následující čísla stránek (příklad).
- Při použití ‚Jumping‘ vidíme rozsah stránek a když dojdeme například na 10, která je úplně vpravo a postoupíme na další stránku, tak se nám vypíší stránky od 11 do 20.
- Defaultním stylem je ‚Sliding‘, kdy vybraná stránka je vypsána vprostřed.
- Třetím parametrem určujeme jaký partial script použijeme pro vypsání ovladače stránkování. V manuálu najdeme několik příkladů, následuje výpis ‚Search pagination‘, která mi vyhovuje nejvíce.
<?php if ($this->pageCount): ?>
<div id="paginationControl">
<!-- Previous page link -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->previous)); ?>">< Previous</a> |
<?php else: ?>
<span class="disabled">< Previous</span> |
<?php endif; ?>
<!-- Numbered page links -->
<?php foreach ($this->pagesInRange as $page): ?>
<?php if ($page != $this->current): ?>
<a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> |
<?php else: ?>
<?= $page; ?> |
<?php endif; ?>
<?php endforeach; ?>
<!-- Next page link -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">Next ></a>
<?php else: ?>
<span class="disabled">Next ></span>
<?php endif; ?>
</div>
<?php endif; ?>
Výpis je naprosto zřejmý – pokud existuje předchozí stránka, tak ji vypíšeme jako odkaz, jinak jen jako text. Poté vypíšeme čísla stránek a nakonec odkaz na následující stránku.
Pokročilé použití
Pokud v controlleru nastavíme styl stránkování i použitý partial script:
Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');
$paginator->setView($view);
tak můžeme ovladač stránkování vypsat pomocí pouhého
<?= $this->paginator; ?>
V manuálu je popsáno jak vytvořit vlastní adaptér pro zdrojová data i jak vytvořit vlastní styl stránkování.
Download
Příště bych rád popsal komponentu Zend_Log_Writer_Firebug a Zend_Db_Profiler_Firebug.
vyborne vysvetlene, skvely tutorial
zaujimalo by ma, akym sposobom najlepsie vyriesim situaciu, ked vo view helperi potrebujem vypisat este pre korektnu URL pri strankovani premennu ‚nickname‘, neviem ju tam ‚prepasovat‘:
$this->url(array(‚page‘ ⇒ $this->next, ‚nickname ⇒ ???), 'moja_routa‘);
dakujem
Upravíš si partial script:
A dál už záleží jak si nastavíš routu href=„http://framework.zend.com/manual/en/zend.controller.router.html“ rel=„nofollow“>http://framework.zend.com/manual/en/zend.controller.router.html
Pingback: Zend Framework CZ » Archiv » Zend Framework 1.6 je tady!
to musím mít partial script pro každý controller zvlášť ? pokud budu pomocí url helperu vkladat adresu do těch linku tak musim mit pokaždé jinou routu když budu chtít použít jiný controller nebo akci, nedá se to vyřešit nějak jinak ?
makky: do šablony pro výpis stránkování který se volá v šabloně s výpisem hodnot:
paginationControl($this->paginator, ‚Sliding‘, ‚my_pagination_control.phtml‘); ?>
lze přidat vlastní proměnné, které dáš v poli jako čtvrtý parametr, tedy když budeš mít pole
$params = array(‚jemno‘ ⇒ ‚franta‘);
a přídš to na konec:
paginationControl($this->paginator, ‚Sliding‘, ‚my_pagination_control.phtml‘, $params); ?>
lze pak v šabloně pro výpis kontroleru stránkování kdekoli použít:
jmeno; // vypise ‚franta‘ >