AJAX descomplicado com PHP e Prototype, parte 1

Enviado por Alfred R. Baudisch em AJAX, PHP, Prototype.
Ir para os Comentários.

Apesar de eu ter criado a série de artigos sobre AJAX + CPAINT, estou criando essa nova, com artigos rápidos explicando o uso da Prototype. Segundo o site oficial: "Prototype is a JavaScript Framework that aims to ease development of dynamic web applications.". Melhor explicando:

  • É um framework JavaScript, contido em um pequeno e único .js;
  • Possui funções de DHTML, shortcuts (exemplo: em vez de document.getElementById(’elementoId’), simplesmente diga $(’elementoId’));
  • Uma das abstrações de AJAX mais completas e rápidas de implementar;
  • etc.

Bom, faça já o download.

Nesse primeiro artigo da série, uma busca muito, muito simples, com retorno em HTML, para você entender como é a interação da Prototype com o PHP. Na verdade não existe interação (a Prototype é apenas esse pequeno JS!), e sim, uma série de Chamadas (feita por ela) -> Respostas (pelo PHP ou qualquer outra linguagem do lado de servidor que você utilize). Vamos ao código:

busca.php

<?php

$Buscar = $_GET[’buscar’];

switch($Buscar)
{
    case ’cidade’:
        $Retorno = array(’Curitiba’, ’São Paulo’, ’New York’);
    break;

    case ’dinheiro’:
        $Retorno = array(’Milhão’, ’Bilhão’, ’Trilhão’);
    break;

    case ’desejos’:
        $Retorno = array(’Casamento’, ’Família’, ’Riqueza’);
    break;
}

if(sizeof($Retorno))
{
    foreach($Retorno as $R)
    {
        $HTML .= ’<li>’ . $R . ’</li>’;
    }

    $HTML = ’<ul>’ . $HTML . ’</ul>’;

    echo utf8_encode($HTML);
}

?>

formulario.html

<html>
<head>
    <title>PHP e Prototype - #1</title>
    <style type="text/css">
    <!–
    * {
        font-family: ’Trebuchet MS’;
        font-size: 11px;
    }

    .ativo {
        display: inline;
    }

    .oculto {
        display: none;
    }

    div {
        margin: 10px;
    }
    –>
    </style>
    
    <script type="text/javascript" src="prototype.js"></script>

    <script type="text/javascript">
    function Buscar()
    {
        // Ação que ocorre quando inicia a chamada,
        // e quando ela é finalizada
        Ajax.Responders.register({
          onCreate: function(){
            $(’loading’).className = ’ativo’;
          }, 
          onComplete: function(){
            $(’loading’).className = ’oculto’;
          }
        });

        // A chamada AJAX propriamente dita
        new Ajax.Request(’busca.php’,
        {
            method:’get’,
            parameters: $(’formBusca’).serialize(true),

            onSuccess: function(transport) {
              var response = transport.responseText || "Nada Encontrado";
              $(’retorno’).innerHTML = response;
            },
            onFailure: function(){ alert(’Something went wrong…’) }
        });
    }
    </script>
    </head>
<body>

<div id="busca"><form id="formBusca"><input type="text" name="buscar" onblur="Buscar();"/> <span id="loading" class="oculto"><img src="load.gif" border="0"/> Carregando…</span></form> </div>

<div id="retorno"></div>

</body>
</html>

Passo-a-passo

  1. Como é de se esperar, sempre inclua a prototype: <script type="text/javascript" src="prototype.js"></script>.
  2. A função $ é um atalho para document.getElementById. Agora acostume-se. Use e abuse!
  3. Não é necessário declarar nem instanciar nada. Você só chama a prototype quando for utilizá-la. No nosso caso, ela é chamada dentro da função Buscar. A chamada AJAX é simplesmente feita pelo comando: new Ajax.Request e, assim inserindo os variados parâmetros. São dezenas deles, que tentarei explicar no decorrer de toda a série. Você pode ver a lista completa na documentação oficial.
  4. Primeiro defino o modo de envio: method:‘get’, (pode ser ‘post’) .
  5. Os dados que envio: parameters: $(‘formBusca’).serialize(true), . Nesse caso eu envio todos os campos do formulário. No PHP eles são recebidos simplesmente dentro da variável $_GET (ou $_POST). Exemplo: se no formulário há um campo nome e email, o PHP receberá: $_GET[’email’] e $_GET[’nome’].
  6. Defino como o retorno será tratado:
    onSuccess: function(transport) {
      var 
    response transport.responseText || "Nada Encontrado";
      $(
    ‘retorno’).innerHTML response;
    },
    . Nesse exemplo o PHP imprime texto com "echo", logo a resposta vem como texto puro, dentro de response.Text. Caso não venha nada, o || é tratado, e a resposta fica "Nada encontrado". O que quer que seja a resposta, eu passo para o div retorno.
  7. E defino um tratamento de erro (caso ocorra perda de conexão, por exemplo): onFailure: function(){ alert(‘Something went wrong…’).
  8. Logo acima do Request, temos a criação de "Responders". O que fazem? Eles executam uma ação quando um Request é criado e outra quando o Request é destruído. Através dos Responders você pode criar mensagens de "loading" por exemplo, ou alguma outra interação necessária.
    Ajax.Responders.register({
      
    onCreate: function(){
         $(
    ‘loading’).className ‘ativo’;
      }, 
      
    onComplete: function(){
         $(
    ‘loading’).className ‘oculto’;
      }
    });

    Veja que na criação, ele exibe o div de loading, e na destruição do objeto, ele oculta.
  9. Simples, não? Veja o PHP como fica limpo. E o JavaScript mais limpo ainda.

Veja esse exemplo em funcionamento. Digite "dinheiro" e aperte TAB, digite "cidade", e depois qualquer coisa.

Referências

  1. Documentação da API do objeto AJAX: http://www.prototypejs.org/api/ajax
  2. Introdução ao objeto AJAX, com exemplos: http://www.prototypejs.org/learn/introduction-to-ajax

11 Respostas para “AJAX descomplicado com PHP e Prototype, parte 1”

  1. Adair Escreveu:

    o arquivo busca.php de exemplo, não funciona..

  2. Alfred R. Baudisch Escreveu:

    Olá Adair, se ver o exemplo em funcionamento, tudo está ok. Acontece que no código aqui no artigo, as aspas na verdade estão com acentos ` e não aspa. Copie o código, procure por ` e substitua por aspa simples ‘, que tudo funciona.

    O exemplo inclusive é o mesmo código.

    Abraços.

  3. Rafael Escreveu:

    No exemplo o arquivo se chama buscar.php e dentro da função vc está chamando busca.php. Acho que por isso que o Adair não conseguiu fazer funcionar.

  4. Alfred R. Baudisch Escreveu:

    Obrigado Rafael, bem notado. Eu não havia percebido essa mistura dos nomes.

    Corrigido.

    Abraços!

  5. ricardo Escreveu:

    opa,

    como vc faz para tratar quando acontece um erro no PHP, ou seja, para mostrar a mensagem que o apache retorna com o erro php?

    se puder dah um toque no email

    valew

  6. Rubens S Leme Escreveu:

    Boa tarde, Alfred

    Muito bom! Realmente gostei do seu blog
    se precisar de algo conta comigo

    abraço

  7. Francisco Escreveu:

    tá muito bom e fácil de perceber, já agora pode dizer-me para que serve o ajax.update do prototype?

  8. ricardofpmartins Escreveu:

    Eu frequento o 12º do Liceu e ando em informática, contudo agora no ultimo ano tenho que apresentar uma PAT (Prova de Aptidão Tecnológica), o meu assunto incide no ajax, se me puder dar conselhos, agradecia.

    Gostei do seu Web Site.
    Da-me um aviso no meu email, agradecia.

    Sem outro assunto .

  9. Thiago Chaves Escreveu:

    Parabens, muito bom o artigo.

  10. Renato Escreveu:

    Olá, estou pesquisando para usar o ajax. mas não sei com quem usar
    CPAINT OU PROTOTYPE O QUE ACHA??

  11. Júlio Escreveu:

    Mesmo com os ajustes indicados, não funciona este exemplo.

Comente!