Paginação dos resultados do banco de dados
Ao desenvolver aplicações web, você frequentemente atende à exigência de imprimir um número restrito de registros em uma página.
Saímos do estado quando listamos todos os dados sem paginação. Para selecionar os dados do banco de dados, temos a classe
ArticleRepository, que contém o construtor e o método findPublishedArticles
, que retorna todos os artigos
publicados ordenados em ordem decrescente de data de publicação.
No Apresentador injetamos então a classe do modelo e no método de renderização pediremos os artigos publicados que passamos para o modelo:
O modelo default.latte
se encarregará de listar os artigos:
Desta forma, podemos escrever todos os artigos, mas isto causará problemas quando o número de artigos crescer. Nesse momento, será útil implementar o mecanismo de paginação.
Isto garantirá que todos os artigos sejam divididos em várias páginas e mostraremos apenas os artigos de uma página atual. O número total de páginas e a distribuição dos artigos é calculada pelo próprio paginador, dependendo de quantos artigos temos no total e quantos artigos queremos exibir na página.
No primeiro passo, modificaremos o método para obter artigos na classe de repositório para devolver apenas artigos de uma página. Também acrescentaremos um novo método para obter o número total de artigos no banco de dados, que precisaremos definir um Paginador:
O próximo passo é editar o apresentador. Nós encaminharemos o número da página atualmente exibida para o método de renderização. Caso este número não seja parte da URL, precisamos definir o valor padrão para a primeira página.
Também expandimos o método de renderização para obter a instância Paginator, configurando-a e selecionando os artigos corretos a serem exibidos no modelo. Home PagePresenter terá este aspecto:
O modelo já itera sobre artigos em uma página, basta adicionar links de paginação:
Foi assim que adicionamos a paginação usando o Paginador. Se for usado o Nette Database Explorer em vez do Nette Database Core como camada de banco de dados, podemos implementar
paginação mesmo sem o Paginator. A classe Nette\Database\Table\Selection
contém o método de paginação com lógica de paginação
extraída do Paginator.
O repositório terá este aspecto:
Não temos que criar o Paginador no Apresentador, em vez disso usaremos o método do objeto Selection
devolvido
pelo repositório:
Como não usamos o Paginador, precisamos editar a seção que mostra os links de paginação:
Desta forma, implementamos um mecanismo de paginação sem utilizar um Paginador.