Paginator
Müssen Sie die Ausgabe von Daten paginieren? Da die Paginierungsmathematik knifflig sein kann, hilft Ihnen Nette\Utils\Paginator dabei.
Installation:
composer require nette/utils
Wir erstellen ein Paginator-Objekt und legen die grundlegenden Informationen fest:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // Nummer der aktuellen Seite
$paginator->setItemsPerPage(30); // Anzahl der Elemente pro Seite
$paginator->setItemCount(356); // Gesamtzahl der Elemente, falls bekannt
Die Seiten werden standardmäßig ab 1 nummeriert. Dies kann mit setBase()
geändert werden:
$paginator->setBase(0); // wir nummerieren ab 0
Das Objekt liefert nun alle grundlegenden Informationen, die für die Erstellung der Paginierung nützlich sind. Sie können es beispielsweise an eine Vorlage übergeben und dort verwenden.
$paginator->isFirst(); // Sind wir auf der ersten Seite?
$paginator->isLast(); // Sind wir auf der letzten Seite?
$paginator->getPage(); // Nummer der aktuellen Seite
$paginator->getFirstPage(); // Nummer der ersten Seite
$paginator->getLastPage(); // Nummer der letzten Seite
$paginator->getFirstItemOnPage(); // Nummer des ersten Elements auf der Seite (1-basiert)
$paginator->getLastItemOnPage(); // Nummer des letzten Elements auf der Seite (1-basiert)
$paginator->getPageIndex(); // Index der aktuellen Seite (0-basiert)
$paginator->getPageCount(); // Gesamtzahl der Seiten
$paginator->getItemsPerPage(); // Anzahl der Elemente pro Seite
$paginator->getItemCount(); // Gesamtzahl der Elemente (falls bekannt)
Der Paginator hilft bei der Formulierung von SQL-Abfragen. Die Methoden getLength()
und getOffset()
geben die Werte zurück, die für die LIMIT
- und OFFSET
-Klauseln benötigt werden:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Wenn die Paginierung in umgekehrter Reihenfolge erfolgen soll (d.h. Seite 1 entspricht dem höchsten Offset), verwenden Sie
getCountdownOffset()
:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Ein Anwendungsbeispiel finden Sie im Rezept Datenbankergebnisse paginieren.