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.

versão: 4.0