Paginateur

Vous avez besoin de paginer une liste de données ? Parce que les mathématiques derrière la pagination peuvent être délicates, Nette\Utils\Paginator vous aidera.

Installation :

composer require nette/utils

Nous allons créer un objet de pagination et définir les informations de base pour celui-ci :

$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // le numéro de la page actuelle (numéroté à partir de 1)
$paginator->setItemsPerPage(30); // le nombre d'enregistrements par page
$paginator->setItemCount(356); // le nombre total d'enregistrements (si disponible)

Les pages sont numérotées à partir de 1. Nous pouvons les modifier en utilisant setBase():

$paginator->setBase(0); // numéroté à partir de 0

L'objet va maintenant fournir toutes les informations de base utiles à la création d'un paginateur. Vous pouvez, par exemple, le passer à un modèle et l'y utiliser.

$paginator->isFirst(); // s'agit-il de la première page ?
$paginator->isLast(); // s'agit-il de la dernière page ?
$paginator->getPage(); // numéro de la page actuelle
$paginator->getFirstPage(); // le numéro de la première page
$paginator->getLastPage(); // le numéro de la dernière page
$paginator->getFirstItemOnPage(); // numéro d'ordre du premier élément de la page
$paginator->getLastItemOnPage(); // numéro de séquence du dernier élément de la page
$paginator->getPageIndex(); // numéro de la page actuelle si elle est numérotée à partir de 0
$paginator->getPageCount(); // le nombre total de pages
$paginator->getItemsPerPage(); // le nombre d'enregistrements par page
$paginator->getItemCount(); // le nombre total d'enregistrements (si disponible)

Le paginateur vous aidera à formuler la requête SQL. Les méthodes getLength() et getOffset() renvoient les valeurs que vous pouvez utiliser dans les clauses LIMIT et OFFSET :

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

Si vous avez besoin de paginer dans l'ordre inverse, c'est-à-dire que la page no. 1 correspond au décalage le plus élevé, vous pouvez utiliser getCountdownOffset():

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

Un exemple d'utilisation dans l'application se trouve dans le livre de recettes Pagination des résultats de la base de données.

version: 4.0