Programmer's Reference Guide
| Einführung |
Verwendung
Seitendarstellung 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 | Beschreibung |
|---|---|
| Array | Verwendet ein PHP Array |
| DbSelect |
Verwendet eine Instanz von
Zend_Db_Select
|
| Iterator |
Verwendet eine Instanz von
» Iterator
|
| Null |
Zend_Paginator nicht für das Verwalten von seitenweisen Daten verwenden.
Man kann trotzdem die Vorteile des Features der Seitenkontrolle verwenden.
|
Um eine Instanz von Zend_Paginator zu erstellen, muß ein Adapter an den Konstruktor
übergeben werden:
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));
Der Einfachheit halber kann man für die mit dem Zend Framework mitgelieferten Adapter die
statische factory() verwenden:
$paginator = Zend_Paginator::factory($array);
Hinweis: 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ß der Seitendarstellung die Seitennummer die der Benutzer anfragt mitgeteilt werden um Ihm zu erlauben auf die seitenweisen Daten zuzugreifen:
$paginator->setCurrentPageNumber($pageNumber);
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:
routes.example.route = articles/:articleName/:pageNumber
routes.example.defaults.controller = articles
routes.example.defaults.action = view
routes.example.defaults.pageNumber = 1
routes.example.reqs.articleName = \w+
routes.example.reqs.pageNumber = \d+
Mit der obigen Route (und der Verwendung der Zend Framework MVC Komponenten), kann die aktuelle Seitenzahl wie folgt gesetzt werden:
$paginator->setCurrentPageNumber($this->_getParam('pageNumber'));
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:
$this->view->paginator = $paginator;
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.
<html>
<body>
<h1>Beispiel</h1>
<?php if (count($this->paginator)): ?>
<ul>
<?php foreach ($this->paginator as $item): ?>
<li><?= $item; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>
</body>
</html>
Der Aufruf des View Helfers fast am Ende ist zu beachten. PaginationControl nimmt die Paginator Instanz, einen optionalen Scroll Stil, und eine optionale teilweise View.
Auch wenn die letzteren zwei Parameter optional sind, sind Sie doch sehr wichtig. Wobei die partielle View verwendet wird um festzustellen wie die Seitenkontrollen aussehen sollten, und der Scrolling Stil verwendet wird um zu kontrollieren wie er sich verhalten sollte. Angenommen die partielle View ist im Stil einer Suchseiten Kontrolle, wie anbei:
Was passiert wenn der Benutzer den "next" Link ein paar Mal anklickt? Nun, viele Dinge könnten geschehen. Die aktuelle Seitennummer könnte in der Mitte stehen wärend man durchklickt (wie Sie es auf Yahoo macht!), oder Sie könnte bis zum Ende des Seitenbereichs ansteigen und dann auf der linken Seite erscheinen wenn der Benutzer ein weiteres Mal "next" klickt. Die Seitennummer könnte sogar größer und kleiner werden wärend der Benutzer auf sie zugreift (oder "scrollt). (wie es auf Google geschieht).
Es gibt view Scrolling Stile die mit dem Zend Framework geliefert werden:
| Scrolling Stil | Beschreibung |
|---|---|
| All | Gibt alle Seiten zurück. Das ist für Seitenkontrollen mit Dropdownmenüs nützlich wenn Sie relativ wenig Seiten haben. In diesen Fällen ist es oft gewünscht alle vorhandenen Seiten dem Benutzer auf einmal anzuzeigen. |
| Elastic | Eine Google-artiger Scrolling Stil der sich erweitert und verkleinert wenn ein Benutzer durch die Seiten scrollt. |
| Jumping | Wenn Benutzer scrollen, steigt die Seitenzahl bis zum Ende eines gegebenen Bereichs, und startet anschließend wieder beim Beginn eines neuen Bereichs. |
| Sliding | Ein Yahoo!-artiger Scrolling Stil der die aktuelle Seitenzahl in der Mitte des Seitenbereichs platziert, oder so nahe wie möglich. Das ist der Standardstil. |
Durch das Setzen des standard View Partials, den standard Scrolling Stils, und der View Instanz kann der Aufruf von PaginatingControl komplett entfallen:
Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');
$paginator->setView($view);
Wenn alle diese Werte gesetzt sind, kann die Seitenkontrolle im View Skript mit einem einfachen echo Statement dargestellt werden:
<?= $this->paginator; ?>
Beispiel der Seitenkontrolle
Das folgende Beispiel von Seitenkontrollen wird Ihnen hoffentlich helfen um erstmals anzufangen:
Such-Seitendarstellung
<!--
Siehe http://developer.yahoo.com/ypatterns/pattern.php?pattern=searchpagination
-->
<?php if ($this->pageCount): ?>
<div class="paginationControl">
<!-- Vorheriger Seitenlink -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->previous)); ?>">< Vorher</a> |
<?php else: ?>
<span class="disabled">< Vorher</span> |
<?php endif; ?>
<!-- Anzahl an Seitenlinks -->
<?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; ?>
<!-- Nächster Seitenlink -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">Nächster ></a>
<?php else: ?>
<span class="disabled">Nächster ></span>
<?php endif; ?>
</div>
<?php endif; ?>
Element Seitendarstellung
<!--
Siehe http://developer.yahoo.com/ypatterns/pattern.php?pattern=itempagination
-->
<?php if ($this->pageCount): ?>
<div class="paginationControl">
<?= $this->firstItemNumber; ?> - <?= $this->lastItemNumber; ?>
of <?= $this->totalItemCount; ?>
<!-- First page link -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->first)); ?>">First</a> |
<?php else: ?>
<span class="disabled">First</span> |
<?php endif; ?>
<!-- Vorheriger Seitenlink -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->previous)); ?>">< Vorheriger</a> |
<?php else: ?>
<span class="disabled">< Vorheriger</span> |
<?php endif; ?>
<!-- Next page link -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">Nächster ></a> |
<?php else: ?>
<span class="disabled">Nächster ></span> |
<?php endif; ?>
<!-- Last page link -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->last)); ?>">Last</a>
<?php else: ?>
<span class="disabled">Last</span>
<?php endif; ?>
</div>
<?php endif; ?>
Dropdown Seitendarstellung
<?php if ($this->pageCount): ?>
<select id="paginationControl" size="1">
<?php foreach ($this->pagesInRange as $page): ?>
<?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
<option value="<?= $this->url(array('page' => $page)); ?>"<?= $selected ?>><?= $page; ?></option>
<?php endforeach; ?>
</select>
<?php endif; ?>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
<script type="text/javascript">
$('paginationControl').observe('change', function() {
window.location = this.options[this.selectedIndex].value;
})
</script>
Tabelle von Eigenschaften
Die folgenden Optionen von für eine Seitenkontrolle bei View Partials vorhanden:
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| first | integer | Erste Seitennummer (z.B., 1) |
| firstItemNumber | integer | Absolute Nummer des ersten Elements auf dieser Seite |
| firstPageInRange | integer | Erste Seite des Bereichs der vom Scrolling Stil zurückgegeben wird |
| current | integer | Aktuelle Seitenzahl |
| currentItemCount | integer | Anzahl der Elemente auf dieser Seite |
| last | integer | Letzte Seitennummer |
| lastItemNumber | integer | Absolute Zahl des letzten Elements auf dieser Seite |
| lastPageInRange | integer | Letzte Seite im Bereich der vom Scrolling Stil zurückgegeben wird |
| next | integer | Nächste Seitenzahl |
| pageCount | integer | Anzahl an Seiten |
| pagesInRange | array | Array von Seiten das vom Scrolling Stil zurückgegeben wird |
| previous | integer | Vorherige Seitenzahl |
| totalItemCount | integer | Komplette Anzahl an Elementen |
| Einführung |
