Mostrando postagens com marcador paginação no doctrine. Mostrar todas as postagens
Mostrando postagens com marcador paginação no doctrine. Mostrar todas as postagens

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.