sábado, 26 de maio de 2012

Paginação com Zend Framework - Zend Pagination

Olá meus amigos tudo bem? Hoje é dia de eu falar sobre paginação no Zend Framework. Hoje vamos conhecer a classe Zend Paginator.
Talvez você esteja afirmando "Paginação no ZF é fácil"... e eu concordo mas eu preciso primeiro explicar como funciona a paginação no ZF usando DBTable para depois explicar a paginação utilizando o DOCTRINE ok? Uma coisa por vez amigo. Esse artigo será sem o DOCTRINE...


Mãos a "OBRA" jardineiros...

No controller vamos montar a consulta passando o select para o construtor do zend paginator veja;


  1. <?php  
  2.  public function indexAction() {
  3.         $noticia = new Application_Model_DbTable_Noticia();
  4.         $select1 = $noticia->select();
  5.         $select1->order('not_id desc');
  6.         $dados = $noticia->fetchAll($select1);
  7.        
  8.         $pagina = intval($this->_getParam('pagina', 1));
  9.                
  10.         $paginator = Zend_Paginator::factory($dados);
  11.         // Seta a quantidade de registros por página
  12.         $paginator->setItemCountPerPage(2);
  13.         // numero de paginas que serão exibidas
  14.         $paginator->setPageRange(7);
  15.         // Seta a página atual
  16.         $paginator->setCurrentPageNumber($pagina);
  17.         // Passa o paginator para a view
  18.         $this->view->resultado = $paginator;
  19. }
  20. ?>


ATENÇÃO! ESSE ARTIGO MOSTRA APENAS A PAGINAÇÃO, ESSA CONSULTA QUE EU FIZ DIRETAMENTE NO CONTROLLER EU NÃO RECOMENDO... O CERTO É EXISTIR UM MÉTODO NA MODEL QUE CONSULTE OK? 

Veja que fizemos uma consulta na tabela noticia e o adapter do resultado jogamos dentro do Zend_Paginator na linha 11, definimos o número de registros por páginas, o número de páginas de forma númerica, a pagina atual que é o parametro vindo da URL (Caso seja nulo a pagina um é setada) e ai passamos para a view...

Legal, mas e aqueles controles da pagina? igual esse aqui:


São criados automaticamente? Como um passo de mágica? Claro que não horas, nós que vamos criar, e é bem simples viu? Crie um arquivo chamado paginador.phtml no diretório views/scripts ...
Ficaria assim o caminho dele application/views/scripts/paginador.phtml e ai insira esse layout dos controles da paginação;
PS: Joguei um CSS meu para dar uma cor ai, só para dar uma ideia ok? (PS2: ideia n tem mais acento depois da reforma ortográfica)


  1. <style>
  2.     .pagination{
  3.         background-color: #0E3460;
  4.     }
  5.    
  6.     .pagination a{
  7.         margin: 3px;
  8.         border: 1px solid #0066cc;
  9.         background-color: #004276;
  10.         color:#FFF;        
  11.     }
  12.    
  13.     .pagination a:hover{
  14.         background-color: #525757;
  15.     }
  16. </style>
  17. <div class="pagination">
  18.     <!-- Link para a primeira página -->
  19.     <?php if (isset($this->previous)): ?>
  20.         <a title="Primeira Página" href="<?php echo $this->url(array('pagina' => $this->first)); ?>">&laquo; Primeira</a>
  21.     <?php else: ?>
  22.         <a class="current" title="Primeira Página" href="<?php echo $this->url(array('pagina' => $this->first)); ?>">&laquo; Primeira</a>
  23.     <?php endif; ?>
  24.     <!-- Link para a página anterior -->
  25.     <?php if (isset($this->previous)): ?>
  26.         <a title="Página Anterior" href="<?php echo $this->url(array('pagina' => $this->previous)); ?>">&laquo; Anterior</a>
  27.     <?php else: ?>
  28.         <a  class="current" title="Página Anterior" href="<?php echo $this->url(array('pagina' => $this->previous)); ?>">&laquo; Anterior</a>
  29.     <?php endif; ?>
  30.     <!-- Links numerados -->
  31.     <?php foreach ($this->pagesInRange as $page): ?>
  32.         <?php if ($page != $this->current): ?>
  33.             <a title="<?php echo $page; ?>" href="<?php echo $this->url(array('pagina' => $page)); ?>"><?php echo $page; ?></a>
  34.         <?php else: ?>
  35.             <a class="current" title="<?php echo $page; ?>" href="<?php echo $this->url(array('pagina'=> $page)); ?>"><?php echo $page; ?></a>
  36.         <?php endif; ?>
  37.     <?php endforeach; ?>
  38.     <!-- Link para a próxima página -->
  39.     <?php if (isset($this->next)): ?>
  40.         <a title="Próxima Página" href="<?php echo $this->url(array('pagina' => $this->next)); ?>">Próxima &raquo;</a>
  41.     <?php else: ?>
  42.         <a class="current" title="Próxima Página" href="<?php echo $this->url(array('pagina' => $this->next)); ?>">Próxima &raquo;</a>
  43.     <?php endif; ?>
  44.     <!-- última página -->
  45.     <?php if (isset($this->next)): ?>
  46.         <a title="Última Página" href="<?php echo $this->url(array('pagina' => $this->last)); ?>">Última &raquo;</a>
  47.     <?php else: ?>
  48.         <a class="current" title="Última Página" href="<?php echo $this->url(array('pagina' => $this->last)); ?>">Última &raquo;</a>
  49.     <?php endif; ?>
  50. </div>


E agora vamos em nossa view e colocamos esses carinhas assim:



  1.  <table class="listagem-de-novidades">
  2.                         <tr>
  3.                             <th width="150"><b>Titulo</b></th>
  4.                             <th width="110"><b>Ação</b></th>
  5.                             <th width="35"><b>Destaque</b></th>
  6.                         </tr>
  7.                         <?php foreach ($this->resultado as $i => $r) { ?>
  8.                             <tr>
  9.        <td height="40" width="143"><?php echo $r['not_titulo']; ?> &nbsp;</td>
  10.                                 <td width="110">
  11.                        <div class="clear" style="height:5px;"></div>

  12. <?php echo $r['not_id']; ?>Excluir 

  13.  <a href="<?php echo $r['not_id']; ?>" class="botao-editar">Editar</a>
  14.                                 </td>
  15.                                 <td align="center" width="40">
  16.                              
  17.                                 </td>
  18.                             </tr>
  19.                         <?php } ?>                            
  20.                     </table>  
  21.                     <center>
  22.  <?php echo $this->paginationControl($this->resultado,'Sliding','paginador.phtml');?>
  23.                     </center>


E pronto, dados PAGINADOS...

Claro que eu utilizei a paginação na minha view do meu jeito, normalmente eu envio um array de objetos para a view... mas já que fiz a consulta no controller então deixei do jeito mais simples ok?





E pronto.