Palavra:   

Revista PHP / AJAX

Eliano Estevam

Desenvolvedor Web, trabalhando atualmente na empresa VTI, www.vti.com.br. Cursando o curso de Sistemas de Iinformação na Universidade Integrada do Ceará. Experiência de 2 anos no desenvolvimento de sistemas na linguagem PHP com OO.

Listando dados com Ajax usando Prototype e PHP – Aplicando a Paginação

Nessa artigo irei mostrar como aplicar a paginação na tabela criada no artigo Listando dados com Ajax usando Prototype e PHP.

Iremos realizar algumas alterações no código escrito no artigo anterior. Vamos alterar os arquivos:
    - Cliente.php
    - Cliente.js
    - Lista.php

REALIZANDO A ALTERAÇÃO DO ARQUIVO CLIENTE.PHP

No arquivo Cliente.php iremos alterar o SQL e incluir algumas variáveis. No MYSQL é usado o comando LIMIT para definir o início e a quantidade de registros por página de listagem. Por exemplo:
    Caso queira que seja listado os primeiros três registros da tabela do banco de dados você defini o comando LIMIT com o início igual a zero e a quantidade de páginas igual a 3, como mostra a linha abaixo.
PHP
  1. SELECT * FROM tbCliente LIMIT 0, 3
  2.  
  3. Para o nosso exemplo iremos incluir as linhas:
  4. // Defini o número de registros por pagina
  5. $quantPag = 3;
  6. // Recupera a página
  7. $pagina = $_POST['pagina'];
  8. // Se a página não for definida o valor assumido será 0
  9. if (empty($pagina)) {
  10. $pagina = 0;
  11. }
  12. // Defini o início da listagem
  13. $inicio = $pagina * $quantPag;
  14.  
www.revistaphp.com.br
No caso do nosso SQL iremos definir o início e quantidade por página do comando LIMIT como também o número total de registros da tabela, isso feito pelo subselect jogando o valor para o campo total.
PHP
  1. $sql = "SELECT *, (SELECT count(*) FROM tbCliente) as total FROM tbCliente WHERE nome LIKE '%" . $_POST['nome'] . "%' LIMIT ".$inicio.", ".$quantPag;
www.revistaphp.com.br
Temos que incluir na criação do XML os valores de TOTAL DE REGISTROS, QUANTIDADE DE REGISTROS POR PÁGINA e a PÁGINA corrente, isso dentro de uma tag nomeada como PAGINAÇÃO.
PHP
  1. $xml.="<paginacao>";
  2. $xml.="<item>".$total ."</item>";
  3. $xml.="<item>".$quantPag."</item>";
  4. $xml.="<item>".$pagina ."</item>";
  5. $xml.="</paginacao>";
www.revistaphp.com.br
Veja abaixo o código completo do arquivo Cliente.php com as alterações.
PHP
  1. <?php
  2. // Importando a classe de conexão
  3. require_once("db/db.php");
  4.  
  5. // Instanciando a classe de conexão
  6. $db = new db();
  7. // Abrindo o banco de dados
  8. $con = $db->open();
  9.  
  10. // Definindo o número de registros por pagina
  11. $quantPag = 3;
  12. // Recuperando a página
  13. $pagina = $_POST['pagina'];
  14. // Se a página não for definida o valor assumido será 0
  15. if (empty($pagina)) {
  16. $pagina = 0;
  17. }
  18. // Definindo o início da listagem
  19. $inicio = $pagina * $quantPag;
  20.  
  21. $sql = "SELECT *, (SELECT count(*) FROM tbCliente) as total FROM tbCliente WHERE nome LIKE '%" . $_POST['nome'] . "%' LIMIT ".$inicio.", ".$quantPag;
  22.  
  23. // Executa o sql
  24. $query = mysql_query($sql);
  25. // Verificando se há registros
  26. if(mysql_num_rows($query)){
  27.  
  28. // Montando o XML com os registros do banco
  29. header("Content-type: application/xml charset=iso-8859-1");
  30. $xml="<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>";
  31.  
  32. // Definindo as colunas da tabela de listagem dos registros
  33. $xml.="<dados>";
  34. $xml.= "<cabecalho>";
  35. $xml.= "<coluna>Código </coluna>";
  36. $xml.= "<coluna>Nome </coluna>";
  37. $xml.= "<coluna>email </coluna>";
  38. $xml.= "</cabecalho>";
  39.  
  40. // Montando o corpo da tabela
  41. while ($dados = mysql_fetch_array($query)){
  42. $xml.="<registro>";
  43. $xml.= "<item>".$dados['id']."</item>";
  44. $xml.= "<item>".$dados['nome']."</item>";
  45. $xml.= "<item>".$dados['email']."</item>";
  46. $xml.="</registro>";
  47.  
  48. // Setando o valor total de registros
  49. $total = $dados['total'];
  50. }
  51.  
  52. // Setando os valores necessários para a paginação
  53. $xml.="<paginacao>";
  54. $xml.="<item>".$total ."</item>";
  55. $xml.="<item>".$quantPag."</item>";
  56. $xml.="<item>".$pagina."</item>";
  57. $xml.="</paginacao>";
  58.  
  59. // Fim da tabela
  60. $xml.="</dados>";
  61. }else{
  62. header("Content-type: application/xml");
  63. $xml="<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>";
  64. }
  65. // Retornando o XML com os registros do banco
  66. echo $xml;
  67. // Fechando o banco
  68. $db->close($con);
  69. exit();
  70.  
  71. ?>
www.revistaphp.com.br
REALIZANDO A ALTERAÇÃO DO ARQUIVO CLIENTE.JS

No arquivo Cliente.js iremos alterar as funções CreatGrid() e escreve(). Iremos fazer a inclusão da função paginação(), onde será responsável pela criação da paginação.

A alteração da função CreatGrid() é feita pela inclusão do parâmetro PAGINA.
JS
  1. function createGrid(nome, pagina)
  2. {
  3. if(nome == null)
  4. nome = "";
  5.  
  6. if(pagina == null)
  7. pagina = "";
  8.  
  9. var url = 'cliente.php';
  10. var parametros = 'nome='+nome+'&pagina='+pagina;
  11. var myAjax = new Ajax.Request( url, { method: 'post', parameters: parametros, onLoading: carregando, onComplete: imprime});
  12. }
www.revistaphp.com.br
A alteração da função escreve() é feita pela inclusão dos dados da tag PAGINACAO vinda do XML, onde será passado como parâmetro para a função paginação() os valores de TOTAL DE REGISTROS, QUANTIDADE DE REGISTROS POR PÁGINA e a PÁGINA CORRENTE.
JS
  1. var pagin = xmldoc.getElementsByTagName('paginacao');
  2. for(i=0;i<pagin.length;i++){
  3. var itensT = pagin[i].getElementsByTagName('item');
  4. var totalRegistros = itensT[0].firstChild.data;
  5. var quantPag = itensT[1].firstChild.data;
  6. var pagina = itensT[2].firstChild.data;
  7. tabela+= paginacao(totalRegistros, quantPag, pagina);
  8. }
www.revistaphp.com.br
A última alteração do arquivo Cliente.js e a inclusão da função paginação().
JS
  1. function paginacao(totalRegistros, quantPag, pagina){
  2. var totalPaginas = eval(totalRegistros) / eval(quantPag);
  3. var tabela = "";
  4. tabela = "<div align='right'>";
  5.  
  6. // Se a página corrente for maior que 0 é mostrado a imagem de VOLTAR
  7. if(pagina > 0){
  8. var voltar = eval(pagina) - 1;
  9. tabela+="<a href='#' onClick='createGrid(\"\", " + voltar + ")'><img src='voltar.gif' border='0'></a>&nbsp;";
  10. }
  11.  
  12. // Mostrando os números das páginas
  13. for(u=0;u<totalPaginas;u++)
  14. {
  15. if(u == pagina)
  16. tabela+="<strong>(&nbsp;";
  17. tabela+="<a href='javascript:createGrid(\"\", " + u + ");' onClick='createGrid(\"\", " + u + ")'>" + (eval(u)+1) + "</a>&nbsp;";
  18. if(u == pagina)
  19. tabela+=")</strong>";
  20. }
  21.  
  22. // Se a página corrente for menor que total de páginas menos o valor 1 é mostrado a imagem de AVANÇAR
  23. if(pagina < (eval(totalPaginas - 1))){
  24. var avancar = eval(pagina) + 1;
  25. tabela+="<a href='#' onClick='createGrid(\"\", " + avancar + ")'><img src='avancar.gif' border='0'></a>&nbsp;";
  26. }
  27.  
  28. tabela+="Total de Registros: " + totalRegistros;
  29. tabela+="</div>";
  30.  
  31. return tabela;
  32. }
www.revistaphp.com.br
Veja abaixo o código completo do arquivo Cliente.js com as alterações.
JS
  1. // Função de crição da tabela de listagem de clientes
  2. function createGrid(nome, pagina)
  3. {
  4. if(nome == null)
  5. nome = "";
  6.  
  7. if(pagina == null)
  8. pagina = "";
  9.  
  10. var url = 'Cliente.php';
  11. var parametros = 'nome='+nome+'&pagina='+pagina;
  12. var myAjax = new Ajax.Request( url, { method: 'post', parameters: parametros, onLoading: carregando, onComplete: escreve});
  13. }
  14. // Função de pesquisa
  15. function pesquisar() {
  16. // Passando como parâmetro o valor do campo pesq_nome do formulário de pesquisa
  17. createGrid( $("pesq_nome").value );
  18. }
  19. // Função de exibição de imagem de processamento
  20. function carregando()
  21. {
  22. $("msg").style.display="block";
  23. $("msg").innerHTML="<img src='ajax-loader.gif'>";
  24. }
  25. // Escreve a tabela de listagem de clientes
  26. function escreve(request)
  27. {
  28. $("msg").style.display="none";
  29.  
  30. var xmldoc=request.responseXML;
  31. var cabecalho = xmldoc.getElementsByTagName('cabecalho')[0];
  32.  
  33. if(cabecalho!=null) {
  34.  
  35. var coluna = cabecalho.getElementsByTagName('coluna');
  36. var tabela="<table width='100%' border='0'><tr bgcolor='#666666'>"
  37.  
  38. //cabecalho da tabela
  39. for(i=0;i<coluna.length;i++){
  40. tabela+="<td><b><font color='#FFFFFF'>"+coluna[i].firstChild.data+"</font></b></td>";
  41. }
  42. tabela+="</tr>"
  43. //corpo da tabela
  44. var registros = xmldoc.getElementsByTagName('registro');
  45.  
  46. for(i=0;i<registros.length;i++){
  47. var itens = registros[i].getElementsByTagName('item');
  48. tabela+="<tr id=linha"+i+" bgcolor='#DDDDDD'>";
  49. for(j=0;j<itens.length;j++){
  50. if(itens[j].firstChild==null){
  51. tabela+="<td></td>";
  52. }else{
  53. tabela+="<td>" + itens[j].firstChild.data + "</td>";
  54. }
  55. }
  56. tabela+="</tr>";
  57. }
  58. tabela+="</table>";
  59.  
  60. var pagin = xmldoc.getElementsByTagName('paginacao');
  61. for(i=0;i<pagin.length;i++){
  62. var itensT = pagin[i].getElementsByTagName('item');
  63. var totalRegistros = itensT[0].firstChild.data;
  64. var quantPag = itensT[1].firstChild.data;
  65. var pagina = itensT[2].firstChild.data;
  66. tabela+= paginacao(totalRegistros, quantPag, pagina);
  67. }
  68.  
  69.  
  70. $("listagem").innerHTML=tabela;
  71. tabela=null;
  72. }else{
  73. $("listagem").innerHTML="<div align='center'>Não há registros...</div>";
  74. }
  75. }
  76.  
  77. function paginacao(totalRegistros, quantPag, pagina){
  78. var totalPaginas = eval(totalRegistros) / eval(quantPag);
  79. var tabela = "";
  80. tabela = "<div align='right'>";
  81.  
  82. if(pagina > 0){
  83. var voltar = eval(pagina) - 1;
  84. tabela+="<a href='#' onClick='createGrid(\"\", " + voltar + ")'><img src='voltar.gif' border='0'></a>&nbsp;";
  85. }
  86.  
  87. for(u=0;u<totalPaginas;u++)
  88. {
  89. if(u == pagina)
  90. tabela+="<strong>(&nbsp;";
  91. tabela+="<a href='javascript:createGrid(\"\", " + u + ");' onClick='createGrid(\"\", " + u + ")'>" + (eval(u)+1) + "</a>&nbsp;";
  92. if(u == pagina)
  93. tabela+=")</strong>";
  94. }
  95.  
  96. if(pagina < (eval(totalPaginas - 1))){
  97. var avancar = eval(pagina) + 1;
  98. tabela+="<a href='#' onClick='createGrid(\"\", " + avancar + ")'><img src='avancar.gif' border='0'></a>&nbsp;";
  99. }
  100.  
  101. tabela+="Total de Registros: " + totalRegistros;
  102. tabela+="</div>";
  103.  
  104. return tabela;
  105. }
www.revistaphp.com.br
REALIZANDO A ALTERAÇÃO DO ARQUIVO LISTA.PHP

Para finalizar iremos realizar a alteração do código do arquivo Lista.php que consiste na alteração da função createGrid(), onde passaremos como parâmetros valores padrões. Procure pela linha onde possui a tag BODY e faça a inclusão dos parâmetros: “” e '0', como mostra a linha abaixo.
HTML
  1. <body onLoad="javascript:createGrid('','0');">
www.revistaphp.com.br
Veja abaixo o código completo do arquivo Lista.php com as alterações.
PHP
  1. <title>Listagem de Clientes</title>
  2. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  3. <!-- Importando a biblioteca javascript de clientes -->
  4. <script language="javascript" src="Cliente.js"></script>
  5. <!-- Importando a biblioteca javascript Prototype -->
  6. <script language="javascript" src="prototype.js"></script>
  7. </head>
  8.  
  9. <!-- Na inicialização da página é executada a função createGrid. Essa função cria a tabela de listagem com os dados do banco -->
  10. <body onLoad="javascript:createGrid(‘’, ‘0’);">
  11. <!-- Imagem de animação do processamento -->
  12. <div id='msg' style='display:none; position:absolute; left: 274px; top: 13px; width: 109px; height: 27px;'></div>
  13. <table width="100%" border="0">
  14. <!-- Formulário de pesquisa -->
  15. <form action="" method="post">
  16. Nome: <input type="text" id="pesq_nome" onKeyUp=”javascript: pesquisar (this.value);”>
  17. <input type="button" name="Button" value="Buscar" onClick="javascript:pesquisar();">
  18. </form>
  19. </td>
  20. </tr>
  21. <!-- Camada onde será mostrada a tabela de listagem com a paginação -->
  22. <div id="listagem"></div>
  23. </td>
  24. </tr>
  25. </table>
  26. </body>
  27. </html>
www.revistaphp.com.br
Acesse os endereços abaixo para baixar as imagens de AVANÇAR e VOLTAR. Salve as imagens na mesma pasta dos arquivos.
    - http://www.fortalveiculos.com.br/avancar.gif
    - http://www.fortalveiculos.com.br/voltar.gif

Pronto, finalizamos. Acesse o endereço local, http://localhost/cliente/Lista.php, pelo browser e veja o resultado.


Visualize a demonstração no endereço:
http://www.fortalveiculos.com.br/Cliente/Lista.php

Abraços, e até o próximo artigo.

Opções de Interação

Comentários

Campo Data
Por: Cleimar, 31/03/2009   14:15:41
bom eu inseri um campo a mais na tabela so que no myslq ele vai com o formato em ingles.> 2009/03/31 e ae tb retorna assim qndo eh gerado a lista, teria como fazer ela aparecer no formato BR 31/03/2009 na listagem ? poderia me ensinar o modo.
Obrigado.
Pagina nao existe
Por: Cleimar, 30/03/2009   22:06:46
Visualize a demonstração no endereço:
http://www.fortalveiculos.com.br/Cliente/Lista.php

ate agora nao consegui ver o exemplo rodando ou mesmo este site ae funcionando.
Codigo fonte
Por: Cleimar, 30/03/2009   22:03:53
Gostaria de receber o codigo fonte funcionando, pois fiz tudo que tem aki e continua dando erros se der mande o fonte completo. obrigado.
cleimar@hotmail.com
Código fonte
Por: Luis, 26/01/2009   13:34:35
Alguém poderia me enviar o
código fonte desta aplicação?

meu e-mail: luis@hipcom.com.br
Código Fonte
Por: Luis, 31/05/2008   21:41:42
Olá amigo... poderia postar aqui o código fonte ou me enviar por e-mail, lapamaral@gmail.com
Fonte
Por: Meire, 26/04/2008   16:25:04
Algem tem o codigo fonte e pode me passar??
Desde já agradeço...
Muito bom
Por: Felipe, 29/03/2008   12:38:24
Cara eu cadastrei nesse site só pra comentar sobre seu código de páginação em ajax, ficou muito bom, meus parabéns.
Grande programador.
Valeu
Alterar Registro
Por: José, 02/02/2008   11:47:16
Boa Tarde. Muito bom o artigo. Seria possivel, sem muito trabalho, adicionar um "link dinâmico", tipo "Alterar", onde ao clicar neste link, ele enviasse o ID do registro "Clicado"??
Fontes
Por: Eliano, 20/12/2007   08:38:49
Olá André,
envie para o seu email os fontes do sistema.
Fonte
Por: Andre, 20/12/2007   08:30:25
Teria como me enviar as fontes pois nao consegui ... nao tah montando a tabela. me envie para andrecabofrossard@hotmail.com Agradeço desde ja