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 ab 1 nummeriert. Dies können wir mit setBase() ändern:

$paginator->setBase(0); // wir nummerieren ab 0

Das Objekt liefert nun alle grundlegenden Informationen, die bei der Erstellung eines Paginators nützlich sind. Sie können es z.B. 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(); // Ordnungszahl des ersten Elements auf der Seite
$paginator->getLastItemOnPage(); // Ordnungszahl des letzten Elements auf der Seite
$paginator->getPageIndex(); // Nummer der aktuellen Seite, nummeriert ab 0
$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 Werte zurück, die wir in den Klauseln LIMIT und OFFSET verwenden:

$result = $database->query(
	'SELECT * FROM items LIMIT ? OFFSET ?',
	$paginator->getLength(),
	$paginator->getOffset(),
);

Wenn wir in umgekehrter Reihenfolge paginieren müssen, d.h. Seite Nr. 1 entspricht dem höchsten Offset, verwenden wir getCountdownOffset():

$result = $database->query(
	'SELECT * FROM items LIMIT ? OFFSET ?',
	$paginator->getLength(),
	$paginator->getCountdownOffset(),
);

Ein Anwendungsbeispiel finden Sie im Kochbuch Paginierung von Datenbankergebnissen.

Version: 4.0