Zend_Paginator

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)); ?>">&lt; Previous</a> |
<?php else: ?>
  <span class="disabled">&lt; 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 &gt;</a>
<?php else: ?>
  <span class="disabled">Next &gt;</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

Zend_Paginator DEMO

Příště bych rád popsal komponentu Zend_Log_Writer_Fi­rebug a Zend_Db_Profi­ler_Firebug.

6 thoughts on “Zend_Paginator

  1. 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

  2. Upravíš si partial script:

    //Next
    <?= $this->url(array('page' => $this->next, 'nickname' => $nick), 'moja_routa'); ?>

    A dál už záleží jak si nastavíš routu href=„http://­framework.zen­d.com/manual/en/zen­d.controller.rou­ter.html“ rel=„nofollow“>http:/­/framework.zen­d.com/manual/en/zen­d.controller.rou­ter.html

  3. Pingback: Zend Framework CZ » Archiv » Zend Framework 1.6 je tady!

  4. 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 ?

  5. makky: do šablony pro výpis stránkování který se volá v šabloně s výpisem hodnot:


    paginationCon­trol($this->paginator, ‚Sliding‘, ‚my_pagination_con­trol.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:


    paginationCon­trol($this->paginator, ‚Sliding‘, ‚my_pagination_con­trol.phtml‘, $params); ?>

    lze pak v šabloně pro výpis kontroleru stránkování kdekoli použít:


    jmeno; // vypise ‚franta‘ >

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>