Exibindo resultados paginados com Zend Paginator
Fala galera!!!
Mais um post sobre o Zend Framework, mostrando um recurso muito utilizado, que é a paginação. Para isto, utilizaremos o Zend Paginator.
Como quase tudo no Zend Framework, é possível fazer esta paginação de diversas formas. Vou mostrar a que eu tenho utilizado, que acho a mais simples.
Model (uma ideia bem simples, só para demonstrar):
<?php
class Model_NoticiaMapper {
private $_dbTable;
/**
* @return Model_DbTable_Noticia
*/
public function getDbTable() {
if (!$this->_dbTable instanceof Model_DbTable_Noticia) {
$this->_dbTable = new Model_DbTable_Noticia();
}
return $this->_dbTable;
}
/**
* @return Zend_Db_Table_Select
*/
public function findAllNews() {
return $this->getDbTable()->select();
}
}
O que é importante perceber? O método findAllNews() retorna um Zend_Db_Table_Select e não um resultado depois de feito o fetch(all/row). Isto é fundamental, pois este objeto select será utilizado pelo Zend_Paginator.
No seu Controller:
$model = new Model_NoticiaMapper ();
$noticias = Zend_Paginator::factory ( $model->findAllNews () );
$noticias->setCurrentPageNumber ( $this->_getParam( 'pagina', 1 ) )
->setItemCountPerPage ( 10 );
$this->view->noticias = $noticias;
Veja que o factory recebe o objeto Zend_Db_Table_Select e retorna o objeto responsável pela paginação. Nós adicionamos algumas configurações básicas ao objeto:
- setCurrentPageNumber( int $pageNumber ) define qual é a página atual em que os resultados estão sendo exibidos. No nosso caso, recebemos o parâmetro pagina, que será passado pela URL que será montada mais abaixo.
- setItemCountPerPage( int $countPerPage ) define a quantidade de resultados por página. No caso colocamos 10, mas pode ser o valor que você escolher (inclusive um valor definido de forma dinâmica).
Como ele implementa Fluent Interface, podemos usar os métodos encadeados como demonstrados.
Passamos o objeto da paginação para a view em $this->view->noticias, que então estará disponível na view em $this->noticias;
Exibindo os resultados na View:
<?php foreach ($this->noticias as $noticia): ?> <h2><?php echo $noticia->titulo?></h2> <p><?php echo $noticia->noticia?></p> <?php endforeach; ?> <?php echo $this->paginationControl($this->noticias,null,'paginator.phtml'); ?>
A única coisa que precisa de explicação é a utilização do viewHelper paginationControl():
paginationControl(Zend_Paginator $paginator = null, $scrollingStyle = null, $partial = null, $params = null), onde:
- $paginator é o objeto da paginação ($this->noticias no nosso caso)
-
$scroolingStyle é o tipo de demonstração de página que será utilizado. O Zend Framework tem 4 opções definidas:
- All => Retorna todas as páginas.
- Elastic => Uma paginação no estilo Google, onde a quantidade e as páginas exibidas modificam de acordo com a página atual.
- Jumping => Só aparecem novas páginas quando você chega no final das páginas exibidas, criando uma nova série.
- Sliding => Formato padrão. A página atual é o centro da série de páginas a serem exibidas. Por exemplo, se estamos na página 10, aparece da página 5 até a página 15.
- $partial o nome do arquivo que vai renderizar o controle da paginação (exemplo abaixo)
- $params parâmetros a serem passados para o viewPartial que vai renderizar o controle da paginação
Arquivo paginator.phtml (que deve ficar dentro de views/scripts/paginator.phtml):
<?php if ($this->pageCount): ?>
<div id="paginator">
<?php if (isset($this->previous)): ?>
<a href="<?php echo $this->url(array('pagina' => $this->previous)); ?>">Anterior </a>
<?php endif; ?>
<?php foreach ($this->pagesInRange as $page): ?>
<?php if ($page != $this->current): ?>
<a href="<?php echo $this->url(array('pagina' => $page)); ?>"><?php echo $page; ?></a>
<?php else: ?>
<span class="currentPage"><?php echo $page; ?></span>
<?php endif; ?> |
<?php endforeach; ?>
<?php if (isset($this->next)): ?>
<a href="<?php echo $this->url(array('pagina' => $this->next)); ?>">Próxima </a>
<?php endif; ?>
</div>
<?php endif; ?>
Acho que este não precisa explicar muita coisa, né? Como neste caso só quero que seja mostrada a div#paginator SE houver mais de uma página, fazemos a verificação com o if($this->pageCount). Para montar a URL das páginas, usamos o viewHelper url(). Ele, no formato que está, mantém os parâmetros atuais (rota, controller, action, modulo, parâmetros existentes…). Basicamente ele pega a URL atual e adiciona o número da página (parâmetro pagina, que recebemos no controller, lembra?).
E agora… NADA!!! Prontinho… Só isto. Simples, né?
Esta foi uma forma de paginar resultados do banco de dados, mas o Zend Paginator permite a paginação de diversos tipos de dados. Por hoje é só, mas fique ligado que em breve teremos mais artigos sobre o Zend Paginator, mostrando mais deste poderoso recurso.



[...] http://matiasrezende.com.br/blog/zend-framework/exibindo-resultados-paginados-com-zend-paginator/ Share this:TwitterFacebookLike this:LikeBe the first to like this post. [...]