Conteúdo dinâmico em Flash usando XML (AFAX?)

PHPActionScript
Enviado por macguyver em Ter, 22/11/2005 - 18:12.PHP | ActionScript

Primeiro post sobre ActionScript =)

Seguindo a aula do Gholias sobre AJAX , decidi fazer o mesmo script em Flash, pra demonstrar a utilização de uma técnica que batizei de AFAX (Asynchronous Flash And XML) - hey, se podem inventar a sigla AJAX eu também posso! ;)

Passo 1: A interface

Coisa simples, só lembre-se de nomear os itens de acordo:
Campo de texto do CEP: nome: "cep_txt", tipo: input
Campo de texto da Cidade: nome: "cidade_txt", tipo: dynamic
Campo de texto do Estado: nome: "estado_txt", tipo: dynamic
"Aguarde...": movieclip, nome: "progresso_mc"

Passo 2: ActionScript
(leia os comentários)

  1. // esconde o indicador de "aguarde"
  2. progresso_mc._visible = false;
  3.  
  4. // ignorar espaço em branco no XML é sempre uma boa =)
  5. XML.prototype.ignoreWhite = true;
  6.  
  7. // este vai ser o objeto que irá conter a resposta do servidor
  8. var respostaXML:XML = new XML();
  9.  
  10. // esta função será executada assim que o server enviar a resposta
  11. respostaXML.onLoad = function(sucesso:Boolean) {
  12.     // esconde novamente o indicador de "aguarde" - o resultado já chegou
  13.     progresso_mc._visible = false;
  14.    
  15.     if (sucesso) {
  16.         // servidor respondeu
  17.         cidade_txt.text = this.firstChild.attributes.cidade;
  18.         estado_txt.text = this.firstChild.attributes.estado;
  19.     } else {
  20.         // servidor nao respondeu, provavelmente está indisponível
  21.         cidade_txt.text = "Erro acessando servidor";
  22.         estado_txt.text = "XX";
  23.     }
  24. };
  25.  
  26. /* esta função será chamada quando o campo "cep" perder o foco, ou seja,
  27. quando o usuario "sair" do campo, dando enter, tab, clicando fora, etc... */
  28. cep_txt.onKillFocus = function() {
  29.     // mostra o indicador de "aguarde"
  30.     progresso_mc._visible = true;
  31.     // objeto que será enviado para o servidor
  32.     var enviaXML:XML = new XML();
  33.     // formata os dados a serem enviados no XML
  34.     var elemento:XMLNode = enviaXML.createElement("ceps");
  35.     elemento.attributes.cep = cep_txt.text;
  36.     // adiciona os dados ae objeto XML
  37.     enviaXML.appendChild(elemento);
  38.     /* precisa explicitamente definir isso, senão o XML vai para o servidor como
  39.     POST_DATA, e nao RAW_POST_DATA */
  40.     enviaXML.contentType = "text/xml";
  41.     /* envia o XML para o servidor, e passa como argumento o objeto que receberá
  42.     a resposta do servidor */
  43.     enviaXML.sendAndLoad("retorna_cep.php", respostaXML);
  44. };
  45.  

Passo 3: PHP
(leia os comentários)

  1. <?php
  2. // Arquivo: retorna_cep.php
  3.  
  4. // Este é o XML recebido pelo Flash
  5. $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
  6.  
  7. // lista com os CEPS válidos - idealmente isso deve ser substituido
  8. // por uma chamada a um banco de dados
  9. $lista = array(
  10.     "12345678" => array("cidade" => "Campinas", "estado" => "SP"),
  11.     "21598000" => array("cidade" => "New York", "estado" => "NY"),
  12.     "13450000" => array("cidade" => "Sta. Barbara", "estado" => "SP")
  13. );
  14.  
  15. // Função para "decifrar" o XML recebido
  16. function startElement($parser, $name, $attrs) {
  17.     global $cep;
  18.     if ("CEPS" == $name) {
  19.         $cep = $attrs["CEP"];
  20.     }
  21. }
  22.  
  23. function endElement($parser, $name) {}
  24.  
  25. // Rodando o "decifrador" =P
  26. $xml_parser = xml_parser_create();
  27. xml_set_element_handler($xml_parser, "startElement", "endElement");
  28.  
  29. xml_parse($xml_parser, $xml);
  30. xml_parser_free($xml_parser);
  31.  
  32. // Atribuindo variáveis para retorno
  33. if ($lista["$cep"]) {
  34.     $cidade = $lista["$cep"]["cidade"];
  35.     $estado = $lista["$cep"]["estado"];
  36. } else {
  37.     $cidade = "CEP Indisponivel";
  38.     $estado = "XX";
  39. }
  40.  
  41. // Envia o resultado de volta para o Flash
  42. // Como é somente uma linha, um simples print já basta pra montar o XML
  43. print "<cep cidade=\"" . $cidade . "\" estado=\"" . $estado . "\" />";
  44.  
  45. ?>

Pronto, coloque os arquivos em um servidor Web com PHP instalado e rode pelo navegador.
Nota: Necessário Flash Player 7. Roda no 6 com algumas alterações no código.