Paginator
Avez-vous besoin de paginer l'affichage des données ? Parce que les mathématiques de pagination peuvent être délicates, Nette\Utils\Paginator vous aidera avec cela.
Installation :
composer require nette/utils
Nous créons un objet paginator et lui définissons les informations de base :
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // numéro de la page actuelle
$paginator->setItemsPerPage(30); // nombre d'éléments par page
$paginator->setItemCount(356); // nombre total d'éléments, si connu
Les pages sont numérotées à partir de 1. Nous pouvons changer cela en utilisant setBase() :
$paginator->setBase(0); // nous numérotons à partir de 0
L'objet fournit maintenant toutes les informations de base utiles lors de la création d'un paginateur. Vous pouvez par exemple le passer au template et l'utiliser là-bas.
$paginator->isFirst(); // sommes-nous sur la première page ?
$paginator->isLast(); // sommes-nous sur la dernière page ?
$paginator->getPage(); // numéro de la page actuelle
$paginator->getFirstPage(); // numéro de la première page
$paginator->getLastPage(); // numéro de la dernière page
$paginator->getFirstItemOnPage(); // numéro d'ordre du premier élément sur la page
$paginator->getLastItemOnPage(); // numéro d'ordre du dernier élément sur la page
$paginator->getBase(); // base de numérotation des pages (1 par défaut)
$paginator->getPageCount(); // nombre total de pages
$paginator->getItemsPerPage(); // nombre d'éléments par page
$paginator->getItemCount(); // nombre total d'éléments, si connu
Le paginateur aide à formuler les requêtes SQL. Les méthodes getLength() et getOffset() retournent
les valeurs à utiliser dans les clauses LIMIT et OFFSET :
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Si nous avons besoin de paginer dans l'ordre inverse, c'est-à-dire que la page n° 1 correspond à l'offset le plus élevé,
nous utiliserons getCountdownOffset() :
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Un exemple d'utilisation dans l'application se trouve dans le cookbook Pagination des résultats de la base de données.