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->getPageIndex(); // numéro de la page actuelle numérotée à partir de 0
$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 lors de la formulation d'une requête SQL. Les méthodes getLength()
et
getOffset()
retournent des valeurs que nous utiliserons 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.