Como fazer paginações

PHPPEAR
Enviado por Pedro Faria em Qua, 04/01/2006 - 14:49.PHP | PEAR

Sempre que se tem uma quantidade enorme de itens a serem listados e se colocar tudo em uma mesma página deixa o layout quebrado e uma leitura chata, usamos a paginação dos dados...

Imagine que a Ford queira listar, em seu site, os dados de TODOS os seus funcionários. Se fossemos colocar tudo em uma página só, além dos problemas citados acima teriamos uma péssima performance no sistema.

Bem, mãos à obra...

Vamos definir que a tabela EMPREGADOS tenha a seguinte estrutura:

CampoTipo
idINT
nomeVARCHAR
nascimentoDATE
admissaoDATE

Primeiramente precisamos definir os valores necessários para fazer a páginação... São eles: Página atual, Itens por página, Quantidade de registros e os registros (lembrando que eu vou usar o PEAR::DB e que o parametro p na url que define a página atual).

  1. //...
  2. // Definindo a pagina atual
  3. $pagina = (isset($_GET['p']) && (int) $_GET['p']) ? $_GET['p'] : 1;
  4.  
  5. // Definindo intens por pagina
  6. $itens_pp = 20;
  7.  
  8. // Definindo o registro inicial.
  9. $item_inical = $itens_pp * ($pagina - 1);
  10.  
  11. // Total de registros
  12. $total_regs = $db->getOne("SELECT COUNT(*) FROM EMPREGADOS");
  13. if (DB::isError($total_regs)) {
  14.     trigger_error("Erro ao tentar contar o total de empregados. ("
  15.         .$total_regs->toString().")", E_USER_ERROR);
  16. }
  17.  
  18. // Registros
  19. $empregados = $db->getAll(
  20.     'SELECT id, nome, nascimento, admissao
  21.      FROM EMPREGADOS ORDER BY nome LIMIT ?, ?',
  22.     array($item_inical, $itens_pp)
  23.     );
  24. if (DB::isError($empregados)) {
  25.     trigger_error("Erro ao selecionar os registros. ("
  26.         .$empregados->toString().")", E_USER_ERROR);
  27. }
  28.  
  29.  
  30. // Paginacao ..........
  31.  
  32. $total_pg = floor($total_pg / $itens_pp);
  33.  
  34. $primeira_pg = $anterior_pg = $proxima_pg = $ultima_pg = '';
  35. if ($pagina > 1) {
  36.     $primeira_pg = '<a href="?p=1">Primeira</a> | ';
  37.     $anterior_pg = '<a href="?p='.($pagina-1).'">Pr&oacute;xima</a> | ';
  38. }
  39. if ($pagina == $total_pg) {
  40.     $proxima_pg = '<a href="?p='.($pagina+1).'">Pr&oacute;xima</a> | ';
  41.     $ultima_pg = '<a href="?p='. $total_pg .'">&Uacute;ltima</a>';
  42. }
  43.  
  44. $meio = array();
  45. for ($i = 1; $i <= $total_pg; $i++) {
  46.     $meio[] = '<a href="?p='.$i.'">'.$i.'</a>';
  47. }
  48. $meio_pg = join(' | ', $meio);
  49.  
  50. $paginacao = "$primeira_pg $anterior_pg $meio_pg $proxima_pg $ultima_pg";
  51.  
  52. // ...
Bem, agora que ja temos todas as variáveis preenchidas perfeitamente, vamos ao html...
  1. <html>
  2. ...
  3.  
  4. <table>
  5. <tr>
  6.     <th>Nome<th>
  7.     <th>Data de Nascimento<th>
  8.     <th>Data de Admissão<th>
  9. </tr>
  10. <?php
  11.  
  12. foreach($empregados as $empreg) {
  13.     echo "<tr>";
  14.     echo "<td>{$empreg['nome']}</td>
  15.           <td>".date('d/m/Y', strtotime($empreg['nascimento']))."</td>
  16.           <td>".date('d/m/Y', strtotime($empreg['admissao']))."</td>";
  17.     echo "</tr>";
  18. }
  19.  
  20. ?>
  21. </table>
  22.  
  23. <div align="center">
  24.     <?php echo $paginacao ?>
  25. </div>
  26.  
  27. ...
  28. </html>

Agora é contigo... sua imaginação é o limite...

Como eu fiz todo esse código de cabeça sem testar, se alguem achar algum erro, avisa...

Outra coisa, quem não conhece o PEAR:DB, não sabe o que está perdendo... Clique aqui correndo e leia este artigo introdutório .

Até a próxima...



Enviado por MalconTato (não verificado(a)) em Ter, 08/08/2006 - 13:53.

Primeiramente parabéns por este excelente blog este que divulga o respositório de bibliotecas PEAR...

Sobre este post, gostaria de lembrar que há também uma biblioteca específica para paginação, que pode ser útil em casos que o resultado não seja tão grande (dezenas de milhares de registros)...

Procurem sobre o PAGER (http://pear.php.net/package/Pager) para ver o quanto é prático esse pack.

[]s