Programmierer-Blog

PHP, Java, AJAX und Frameworks

Seitenzahlen mit Zend_Paginator

17. November 2008 geschrieben von Stefan

In diesem Artikel möchte ich zusätzlich zur deutschen Dokumentation ein kleines simples Beispiel veröffentlichen wie man seitenweise Daten mittels Zend_Paginator realisiert. Das Beispiel ist mit einem assoziativem Array umgesetzt. In einem demnächst folgendem Beispiel werde ich dies direkt mit einem Zend_Db_Select Ergebnis veröffentlichen.

Zuerst sollte man sich entscheiden wie Zend_Paginator die Seitenzahlen darstellen soll. Hierzu legt man ein View-Script mit der entsprechenden Formatierung an:

< ?php if ($this->pageCount): ?>
<div class="paginationControl">
< ?= $this->firstItemNumber; ?> - < ?= $this->lastItemNumber; ?> von < ?= $this->totalItemCount; ?>
 
<!-- First page link -->
< ?php if (isset($this->previous)): ?>
  <a href="<?= $this->url(array('page' => $this->first)); ?>">Erste</a> |
< ?php else: ?>
  <span class="disabled">Erste</span> |
< ?php endif; ?>
 
<!-- Vorheriger Seitenlink -->
< ?php if (isset($this->previous)): ?>
  <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Vorheriger</a> |
< ?php else: ?>
  <span class="disabled">&lt; Vorheriger</span> |
< ?php endif; ?>
 
< ?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)); ?>">Nächster &gt;</a> |
< ?php else: ?>
  <span class="disabled">Nächster &gt;</span> |
< ?php endif; ?>
 
<!-- Last page link -->
< ?php if (isset($this->next)): ?>
  <a href="<?= $this->url(array('page' => $this->last)); ?>">Letzte</a>
< ?php else: ?>
  <span class="disabled">Letzte</span>
< ?php endif; ?>
 
</div>
< ?php endif; ?>

Das mittels CSS anpassbare Ergebnis sieht ähnlich wie folgend aus:

Damit Zend_Paginator arbeiten kann brauchts selbstverständlich noch Daten, in dem dieser iterieren kann. Die einfachste Weise ist ein Array an Zend_Paginator zu übergeben über dem dann seitenweise iteriert werden kann. Im Controller übergeben wir deshalb das Array mit den Daten an dem Paginator, übergeben Zend_Paginator die aktuelle Seitenzahl und weisen das fertige Objekt der View zu:

public function indexAction()
{
	$data= $this->getData(); // Gibt ein assoziatives Array mit Daten zurueck
        $paginator = Zend_Paginator::factory($data);
        $page = (int) $this->_request->getParam('page');
        $page = ($page > 1) ? $page : 1;
        $paginator->setCurrentPageNumber($page);
        $this->view->paginator = $paginator;
}

Zum Schluss benötigt man lediglich noch das View-Script zur Darstellung der Daten aus dem Array inklusive der von Zend_Paginator erzeugten Links mit den Seitenzahlen:

< ?php if (count($this->paginator)): foreach($this->paginator as $data): ?>
<div style="float:left;width:100px;">< ?= $data['key1'] ?></div>
<div style="width:220px;">< ?= $data['key2'] ?></div>
<br style="clear:left;" />
< ?php endforeach; ?>
<div style="border-top:1px solid #000;">< ?= $this->paginationControl($this->paginator, 'Sliding', 'paginate.phtml'); ?></div>

Selbstverständlich gibt es noch einige andere Features die Zend_Paginator bietet und natürlich kann der Zend_Paginator auch direkt mit einem Zend_Db_Select-Objekt iterieren ohne dass man erst die Zeilen sich zurückgeben lassen muss. Hiermit möchte ich direkt auf die Dokumentation von Zend_Paginator verweisen.


Hinterlasse ein Kommentar


Du musst eingeloggt sein um ein Kommentar zu hinterlassen.