Paginator

Müssen Sie eine Datenliste paginieren? Da die Mathematik hinter der Paginierung kompliziert sein kann, hilft Ihnen Nette\Utils\Paginator.

Installation:

composer require nette/utils

Erstellen wir ein Paging-Objekt und legen wir die grundlegenden Informationen dafür fest:

$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // die Nummer der aktuellen Seite (nummeriert ab 1)
$paginator->setItemsPerPage(30); // die Anzahl der Datensätze pro Seite
$paginator->setItemCount(356); // die Gesamtzahl der Datensätze (falls verfügbar)

Die Seiten sind von 1 an nummeriert. Wir können sie mit setBase() ändern:

$paginator->setBase(0); // nummeriert von 0

Das Objekt liefert nun alle grundlegenden Informationen, die für die Erstellung eines Paginators nützlich sind. Sie können es z. B. an eine Vorlage übergeben und dort verwenden.

$paginator->isFirst(); // ist dies die erste Seite?
$paginator->isLast(); // ist dies die letzte Seite?
$paginator->getPage(); // aktuelle Seitenzahl
$paginator->getFirstPage(); // die erste Seitennummer
$paginator->getLastPage(); // die letzte Seitenzahl
$paginator->getFirstItemOnPage(); // laufende Nummer des ersten Eintrags auf der Seite
$paginator->getLastItemOnPage(); // Laufende Nummer des letzten Eintrags auf der Seite
$paginator->getPageIndex(); // aktuelle Seitennummer, wenn von 0 an nummeriert
$paginator->getPageCount(); // die Gesamtzahl der Seiten
$paginator->getItemsPerPage(); // die Anzahl der Datensätze pro Seite
$paginator->getItemCount(); // Gesamtzahl der Datensätze (falls vorhanden)

Der Paginator wird Ihnen bei der Formulierung der SQL-Abfrage helfen. Die Methoden getLength() und getOffset() geben die Werte zurück, die Sie in den LIMIT- und OFFSET-Klauseln verwenden können:

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

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

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

Ein Beispiel für die Verwendung in der Anwendung finden Sie im Kochbuch Paginieren von Datenbankergebnissen.

Version: 4.0