Quando a Macromedia lançou o Flash MX, deu um importante passo na evolução das aplicações para web incorporando ao Flash e ao ActionScript, recursos que deixavam o desenvolvedor ainda mais livre para criar aplicativos de grande porte para internet. Foi aí que o crescimento das Rich Internet Applications (R.I.A.) explodiu de uma vez.
Tudo começou com o Flash 5, onde já existiam recursos que permitiam a criação de interfaces dinâmicas, exibindo dados que vinham de um banco de dados ou de qualquer outra fonte dinâmica como documentos XML, TXT etc ...
Foi aí que a Macromedia, ainda analisando algumas limitações das aplicações para web, criou o FlashRemoting (www.macromedia.com/software/flashremoting).
O FlashRemoting chegou como uma solução que tornava ainda mais simples a criação de aplicações R.I.A., permitindo uma comunicação direta entre o Flash e o servidor, transmitindo dados nativos e complexos por meio de um gateway que serializa os dados nas duas direções (cliente - servidor / servidor - cliente) .
Até o surgimento do FlashRemoting, só era possível a comunicação com o servidor a partir de texto. Somente texto era possível ser enviado a partir do cliente e somente texto vinha do servidor. Então era necessário um trabalho dobrado do servidor para consultar os dados num banco de dados, e depois transformar em algo que o Flash entenda (XML ou Texto URL). Dados complexos como Array e Query ou até mesmo simples como Number ou Boolean não podiam transitar entre o cliente e o servidor.
O funcionamento do FlashRemoting é bastante simples, porém tem uma limitação: Servidor
O servidor DEVE ter suporte à tecnologia Remoting, o que torna o serviço de hospedagem para páginas Remoting escasso e caro.
O FlashRemoting, criado pela Macromedia, pode ser usado somente em servidores que suportam SOAP (.NET, ColdFusion, Java...) No caso do ColdFusion MX, o FlashRemoting já está incluso na instalação. J á os demais servidores necessitam da aquisição do FlashRemoting separadamente.
A questão da limitação de servidores Remoting, tornou a propagação do Remoting um tanto lenta pois os desenvolvedores não se sentiam encorajados a aprender uma tecnologia que será difícil de ser implementada no mercado nacional atual.
Foi aí que surgiu o AMFPHP (www.amfphp.org). O AMFPHP é uma alternativa Open-Source que permite o uso da tecnologia FlashRemoting em servidores PHP sem a necessidade da instalação de nenhum recurso adicional ao servidor além do próprio servidor PHP.
O AMFPHP é totalmente grátis e acessível a qualquer desenvolvedor.
O AMFPHP permite que você crie objetos em PHP e torne-os em Objetos ActionScript sem a menor dificuldade! Parece mágica, não?
Funciona basicamente assim:
01. Primeiro você deve baixar a versão mais atualizada do AMFPHP (Atualmente 0.9.0 beta)
02. Crie um gateway usando as classes do AMFPHP (veja exemplo mais adiante)
03. Conecte-se à esse gateway usando o NetServices com ActionScript (exemplo mais adiante)
04. Consuma o serviço no servidor que será uma classe criada em PHP
05. Enjoy!
Preparei um exemplo usando o AMFPHP de uma simples consulta à base de dados.
Com o pacote do AMFPHP que baixamos do site oficial www.amfphp.org, vem uma série de arquivos úteis aos desenvolvedores. Porém, uma pasta é essencial: flashservices. Essa pasta contém as classes de serialização do AMFPHP e é de vital importância para o funcionamento do projeto.
Para usar o AMFPHP, você deverá pôr esta pasta juntamente com seus arquivos do projeto.
O meu exemplo está estruturado da seguinte forma:
<raiz>
<flashservices>
<classes>
usuarios.php
gateway.php
usuarios.fla
Criei uma base de dados em MySql chamada "exemplo", que você pode baixar aqui com uma tabela chamada "usuarios", com a seguinte estrutura:

O Arquivo gateway.php tem a função de instanciar a classe Gateway definida no arquivo flashservices/app/Gateway.php. Esse arquivo é importante para a aplicação Remoting.
Abaixo segue o conteúdo do mesmo:
arquivo "gateway.php"
<?php
include "flashservices/app/Gateway.php";
$gateway = new Gateway();
$gateway->setBaseClassPath("./classes/");
$gateway->service();
?>
Basicamente ele instancia o Gateway, define o diretório onde se localizam as classes PHP que serão usadas na aplicação e inicia o serviço do AMF.
O próximo passo é criar a classe PHP que fará o papel de consulta no servidor :
arquivo "classes/Usuarios.php"
<?php
//Função auxiliar para converter Query em Array
function query2array($query){
$_res = array();
$i = 0;
while($l = mysql_fetch_array($query)) {
$_res[$i] = array();
foreach($l as $campo => $valor) $_res[$i][strtolower($campo)] = $valor;
$i++;
}
return $_res;
}
class Usuarios{
//método construtor da classe
function Usuarios(){
$this->methodTable = array(
"getUsuarios" => array(
"description" => "Retorna a lista de usuários",
"access" => "remote"
)
);
//Cria a conexão persistente
$this->conexao = mysql_pconnect("seuservidor","usuario", "senha");
//Seleciona a base de dados
mysql_select_db("exemplo");
}
function getUsuarios(){
return query2array(mysql_query("select * from usuarios", $this->conexao));
}
}
?>
Note que no método construtor da classe Usuarios, é necessário a definição da propriedade "methodTable". Isso acontece por que o Gatewaysimulará uma serialização semelhante à do WSDL (WebService Description Language) e o ActionScript necessita da methodTable para identificar os métodos disponíveis na classe no servidor. Também é importante para a definição do encapsulamento dos métodos através da chave "access" (vista com valor "remote").
Como aqui usei o FlashMX 2004, necessitei buscar recursos externos para conseguir conectar-me ao gateway usando ActionScript 2.0. Isso por que a Macromedia não criou ainda as classes do FlashRemoting para AS2. Mas se quiser usar AS2, baixe as classes em: http://www.person13.com/flashremoting/index.php e descompacte o arquivo baixado no ClassPath do Flash dentro do pacote "mx".
O único problema que encontrei nas classes do Person13, é em relação à transmissão do RecordSet a partir do mysql_query. Os dados não chegavam corretamente no cliente e por isso criei a função "query2array". Mas acredito que com ActionScript 1.0 deva funcionar normalmente.
Agora vamos ao ActionScript:
Montei esse exemplo somente com um componente List no palco com o InstanceName "lstUsuarios"
arquivo "usuarios.fla"
//Importando as classes do Remoting baixadas do Person13
import mx.remoting.*;
//Definindo a Url do gateway.php
NetServices.setDefaultGatewayUrl("http://seuservidor/amfphp_example/gateway.php");
//Criando a conexão
conexao_conn = NetServices.createGatewayConnection();
//Conectando-se com a classe Usuarios.php (instanciando a mesma no cliente)
servUsuarios = conexao_conn.getService("Usuarios", this);
//Executando o método no servidor
servUsuarios.getUsuarios();
//Recebendo a resposta do método no cliente
function getUsuarios_Result(resultado_array:Array):Void{
var dados:Array = [];
for(var i in resultado_array){
//Preenchando o array dataProvider
dados.push({label: resultado_array[i].nome, data: resultado_array[i].cod});
}
//Definindo o dataProvider do List
lstUsuarios.dataProvider = dados;
}
Note que no SWF precisamos de uma função com o nome "nomeDoMetodoNoServidor_Result" para receber a resposta da execução do método no servidor.
Essa função deverá estar definida no objeto informado como "defaultResponder" no método "getService". Nesse caso foi usado a timeline atual que por acaso é a "_root". Mas também poderia ser qualquer outro objeto desde que as funções de resposta estejam definidas nele.
Pra quem já conhece o FlashRemoting, reconhecerá essa estrutura pois é exatamente idêntica ao uso do Remoting da Macromedia, com a única diferença na criação dos componentes no servidor que nesse caso foi usado PHP.
Para mais informações sobre FlashRemoting e AMFPHP veja:
http://www.macromedia.com/.../amfphp.html
http://www.actionscript.org/.../index.shtml
http://www.macromedia.com/.../documentation.html
http://www.macromedia.com/.../tutorial_index.html
http://www.macromedia.com/.../026.html
Bons estudos!
Rafael Sotelo Mizukami
Muito show essa matéria !
Ae Neto Leal, você poderia fazer mais matérias assim para o iMasters, hein ? a comunidade Flash agradece imensamente !
Parabéns !
virgiliomax
Pessoal, um pequeno erro na hierarquia dos arquivos na estrutura correta, a pasta "classes" estaria na RAIZ do site e não dentro da pasta "Flashservices", ok ?
Abraços
Marco Favarin
Muito boa essa matéria. Principalmente para os programadores em PHP. A integração Flash - PHP agradece.
Marcos Mendes
Tudo bom!?
Vocês poderiam me ajudar, eu estive fazendo este exemplo na minha maquina só que não deu certo... aparentemente fiz tudo direitinho, mas sei que algo esta errado se não, não funcionaria né( doarrdd...rsrsrs )
Teria alguma forma de vcs me ajudarem, desculpa eu estar usando este espaço para isso, só que eu não achei outra forma de entrar em contato com vcs..e realmente fiquei tentando.. tentando.. e não consegui fazer rodar o Flash com PHP.
Tudo bem?
T+!!
Valew!!
Renato Lins
tudo bem gostaria de alguem que pudesse me dar uma mão...
gostaria de saber como chamar uma pagina . php dentro de um quadro flash...
estou criando um site onde a fita superior do site é feito em flash e nessa fita consta 5 botões e cada um deles chamara uma pagina diferente...por exemplo o botão "CONTATO" precisa chamar a página "contato.php"
fico muito grato se alguem puder me ajudar
Valdelis
a pág. internet, com o exemplo.sql não foi encontrada... não consegui baixar!
Foi tirada do ar?
Luiz Fabiano Cardoso
Não baixei o flashremoting pq utilizo o Flash8/AS2. Funcionou!
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.