VerwendungSeitendarstellung von Datensammlungen
Um Elemente in Seiten darzustellen muß Zend_Paginator einen
generellen Weg des Zugriffs auf diese Daten haben. Für diesen Zweck, läuft jeder
Datenzugriff über Datenquellen Adapter. Verschiedene Adapter werden mit dem Zend
Framework standardmäßig ausgeliefert:
Adapter für Zend_PaginatorAdapterBeschreibungArrayVerwendet ein PHP ArrayDbSelect
Verwendet eine Instanz von Zend_Db_Select,
welche ein Array zurückgibt
DbTableSelect
Verwendet eine Instanz von Zend_Db_Table_Select,
welche eine Instanz von
Zend_Db_Table_Rowset_Abstract zurückgibt. Das
gibt zusätzliche Information pber das Ergebnisset, wie z.B. die Namen
der Spalten.
Iterator
Verwendet eine Instanz von IteratorNullZend_Paginator nicht für das Verwalten von
seitenweisen Daten verwenden. Man kann trotzdem die Vorteile des
Features der Seitenkontrolle verwenden.
Statt jede passende Zeile einer gegebenen Abfrage auszuwählen, empfangen die
DbSelect und DbTableSelect Adapter nur die kleinste Anzahl an Daten die für die
Darstellung der aktuellen Seite notwendig sind.
Deswegen wird dynamisch eine zweite Abfrage erzeugt um die komplette Anzahl an
passenden Zeilen festzustellen. Trotzdem ist es möglich die Anzahl oder die Abfrage
für die Anzahl selbst direkt zu übergeben. Siehe die
setRowCount() Methode im DbSelect Adapter für weitere
Informationen.
Um eine Instanz von Zend_Paginator zu erstellen, muß ein Adapter
an den Konstruktor übergeben werden:
Der Einfachheit halber kann man für die mit dem Zend Framework mitgelieferten Adapter
die statische factory() verwenden:
Im Falle des NULL Adapters, muß dem Konstruktor eine
Elementanzahl mitgegeben werden da keine Datensammlung vorliegt.
Auch wenn die Instanz in diesem Fall technische zu verwenden ist, muß in der Controller
Aktion der Seitendarstellung mitgeteilt werden welche Seitennummer der Benutzer
angefragt hat. Das erlaubt Ihm auf die seitenweisen Daten zuzugreifen.
setCurrentPageNumber($page);
]]>
Der einfachste Weg um diesen Wert zu verfolgen ist über eine URL.
Auch wenn wir empfehlen einen
Zend_Controller_Router_Interface-kompatiblen
Router zu verwenden um dies zu bewerkstelligen, ist das keine Notwendigkeit.
Das folgende ist eine Beispielroute die in einer INI
Konfigurationsdatei verwendet werden könnte:
Mit der obigen Route (und der Verwendung der Zend Framework MVC
Komponenten), kann die aktuelle Seitenzahl wie folgt gesetzt werden:
setCurrentPageNumber($this->_getParam('page'));
]]>
Es sind auch andere Optionen vorhanden; siehe
Konfiguration für zusätzliche
Informationen.
Schlußendlich muß die Paginator Instanz der View angehängt werden. Wenn
Zend_View mit dem ViewRenderer Action Helfer verwendet wird, dann
funktioniert das folgende:
view->paginator = $paginator;
]]>Die Adapter DbSelect und DbTableSelect
Die Verwendung der meisten Adapter ist recht zielgerichtet. Trotzdem benötigen die
Datenbank Adapter detailiertere Erklärungen betreffend dem Empfang und dem Zählen von
Daten aus der Datenbank.
Um die DbSelect und DbTableSelect Adapter zu verwenden muß man die Daten nicht direkt
von der Datenbank empfangen. Beide Adapter führen den Empfang selbst durch, und Zählen
auch die Anzahl der Seiten. Wenn zusätzliche Arbeit basieren auf den Ergebnissen des
Adapters getan werden soll, kann die getItems() Methode des
Adapters in der eigenen Anwendung erweitert werden.
Zusätzlich holen diese Adapter nicht alle Einträge von der
Datenbank um sie zu zählen. Stattdessen manipuliert der Adapter die originale Abfrage um
die entsprechende COUNT Abfrage zu erzeugen. Paginator führt dann diese COUNT Abfrage
aus um die Anzahl der Zeilen zu erhalten. Das erfordert eine zusätzliche Beanspruchung
der Datenbank, ist aber um ein vielfaches schneller als das komplette Ergebnisset zu
holen und count() zu verwenden. Speziell bei einer großen
Anzahl an Daten.
Der Datenbank Adapter versucht die effizienteste Abfrage zu erstellen die auf ziemlich
allen modernen Datenbanken ausgefürt wird. Trotzdem ist es möglich das, abhängig von
der eigenen Datenbank oder sogar dem Setup des eigenen Schemas, ein effizienterer Weg
existiert um die Anzahl der Zeilen zu erhalten. Für dieses Szenario erlaubt es der
Datenbank Adapter eine eigene COUNT Abfrage zu setzen. Wenn man zum Beispiel die
Anzahl der Blog Posts in einer eigenen Tabelle speichert, kann eine schnellere Abfrage
der Anzahl mit dem folgenden Setup erreicht werden:
select()->from('posts'));
$adapter->setRowCount(
$db->select()
->from(
'item_counts',
array(
Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'post_count'
)
)
);
$paginator = new Zend_Paginator($adapter);
]]>
Dieser Ansatz wird jetzt wahrscheinlich keine große Performance Verbesserung bei
kleinen Datemengen und oder einfachen Abfragen ergeben. Aber bei komplexen Abfragen
und großen Datenmengen kann ein ähnlicher Weg eine signifikante Performance
Verbesserung ergeben.
Seiten mit View Skripten darstellen
Das View Skript wird verwendet um die Seitenelemente darzustellen (wenn
Zend_Paginator verwendet wird um das zu tun) und die
Seitenkontrollen anzuzeigen.
Weil Zend_Paginator Das SPL Interface IteratorAggregate
integriert, ist das Durchlaufen von Elementen und deren Darstellung einfach.