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.