30 ago2011

Exibindo resultados paginados com Zend Paginator

por Matias Rezende

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.

Trackbacks & Pings

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>