Paginador
Necessidade de uma listagem de dados? Como a matemática por trás da paginação pode ser complicada, Nette\Utils\Paginator o ajudará.
Instalação:
composer require nette/utils
Vamos criar um objeto de paginação e definir informações básicas para ele:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // o número da página atual (numerada a partir de 1)
$paginator->setItemsPerPage(30); // o número de registros por página
$paginator->setItemCount(356); // o número total de registros (se disponível)
As páginas são numeradas a partir de 1. Podemos mudá-las usando setBase()
:
$paginator->setBase(0); // numerada a partir de 0
O objeto fornecerá agora todas as informações básicas úteis para a criação de um paginador. Você pode, por exemplo, passá-lo para um modelo e usá-lo lá.
$paginator->isFirst(); // esta é a primeira página?
$paginator->isLast(); // esta é a última página?
$paginator->getPage(); // número da página atual
$paginator->getFirstPage(); // o número da primeira página
$paginator->getLastPage(); // o número da última página
$paginator->getFirstItemOnPage(); // número seqüencial do primeiro item da página
$paginator->getLastItemOnPage(); // número seqüencial do último item da página
$paginator->getPageIndex(); // número de página atual se numerado a partir de 0
$paginator->getPageCount(); // o número total de páginas
$paginator->getItemsPerPage(); // o número de registros por página
$paginator->getItemCount(); // o número total de registros (se disponível)
O paginador ajudará na formulação da consulta SQL. Os métodos getLength()
e getOffset()
retornam
os valores que você pode usar nas cláusulas LIMIT e OFFSET:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Se você precisar paginar em ordem inversa, ou seja, a página nº. 1 corresponde ao deslocamento mais alto, você pode usar
getCountdownOffset()
:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Um exemplo de uso na aplicação pode ser encontrado no livro de receitas Paginação de Resultados do Banco de Dados.