Opa! buenas a todos!
Então! ai vai mais uma classe que me ajudou bastante!
Uma classe de conexão genérica, onde eu não preciso criar a tag do objeto <mx:RemoteObject /> em todos os componentes que utilizam conexão. E fora que utilizando a tag do RemoteObjet, eu fico limitado a utilizar apenas uma classe do AMFPHP.
Vamos a classe:
/*
* Autor: Gregui Shigunov
* Data: 18/05/2007
* Observação: Classe para conexão Flex
*/
package gregui
{
import mx.core.Application;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.core.IFlexDisplayObject;
import mx.managers.PopUpManager;
import flash.display.DisplayObject;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.remoting.mxml.Operation;
public class Conexao
{
/**
* Trata quando o Remote Object levanta um erro
*
* @param fault
*/
public static function connectError(fault:FaultEvent):void {
Alert.show( fault.fault.faultString +” \n”
+ fault.fault.message + ” \n”
+ fault.fault.faultDetail + ” \n”
+ fault.fault.toString() + ” \n”
, fault.fault.faultCode.toString());
}
/**
* Conecta com classe do AMFPHP
* limitado até 5 parametros
*
* @param classe nome da classe a ser chamado
* @param metodo da classe
* @func_retorno função que irá tratar o retorno do método
* @rest… parâmetros que irão ser passados para o método
*/
public static function abrir(
classe:String, metodo:String, func_retorno:Function, …rest):void {
var ro:RemoteObject = new RemoteObject();
ro.destination = “dest_service“;
ro.source = classe;
ro.showBusyCursor = true;
ro.addEventListener(”fault”, Conexao.connectError);
var op:Operation = ro.getOperation(metodo) as Operation;
op.addEventListener(”result”, func_retorno);
switch (rest.length)
{
case 0:
op.send();
break;
case 1:
op.send(rest[0]);
break;
case 2:
op.send(rest[0], rest[1]);
break;
case 3:
op.send(rest[0], rest[1], rest[2]);
break;
case 4:
op.send(rest[0], rest[1], rest[2], rest[3]);
break;
case 5:
op.send(rest[0], rest[1], rest[2], rest[3], rest[4]);
break;
default:
op.send(rest);
break;
}
}
}
}
Observe a string em vermelho (ro.destination = “dest_service“;), dest_service é a configuração do serviço de destino.
Crie 2 arquivos na raiz do projeto chamados “services-config.xml” e “remoting-config.xml” respectivamente.
services-config.xml :
<?xml version=”1.0″ encoding=”utf-8″ ?>
<service id=”amfphp-flashremoting-service” class=”flex.messaging.services.RemotingService” messageTypes=”flex.messaging.messages.RemotingMessage”>
<default-channels>
<channel ref=”my-amfphp”/>
</default-channels>
<destination id=”dest_service“>
<properties>
<source>*</source>
</properties>
</destination>
</service>
remoting-config.xml :
<?xml version=”1.0″ encoding=”UTF-8″?>
<services-config>
<services>
<service-include file-path=”remoting-config.xml” />
</services>
<channels>
<channel-definition id=”my-amfphp” class=”mx.messaging.channels.AMFChannel”>
<endpoint uri=”http://blablabla/amfphp/gateway.php” class=”flex.messaging.endpoints.AMFEndpoint”/>
</channel-definition>
</channels>
</services-config>
A escrita em vermelho é a url de conexão do gateway do AMFPHP.
O próximo passo é colocar a referência dos arquivos de configuração no projeto. Para isso, entre no “properties” do projeto:
E no Item “Flex compiler” coloque referência ao arquivo de configuração:
Additional compiler arguments: -locale pt_BR -services services-config.xml
Pronto!!!!
Como usar?
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:TitleWindow
xmlns:mx=”http://www.adobe.com/2006/mxml”
layout=”absolute” width=”300″ height=”600″ title=”Exemplo”
showCloseButton=”true”
close=”this.parent.removeChild(this)”
creationComplete=”init();”>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import gregui.Conexao;
private function init():void {
this.isPopUp = true;
Conexao.abrir("Acesso", "logar", this.onRecebeDados,
"usuario","senha");
}
private function onRecebeDados(re:ResultEvent):void {
if (re.result.logado == "true") {
Alert.show("Logado");
}
if (re.result.logado == "false") {
Alert.show(re.result.erro);
}
}
]]>
</mx:Script>
</mx:TitleWindow>
para ficar mais claro, ai vai uma classe (PHP) para conexão:
Acesso.php
<?php
/*
* Autor: Gregui Shigunov
* Data: 26/05/2007
* Observação: Classe para interface de “login”
*
*/
include_once(”gregui/config.php”);
include_once(”gregui/bo/LoginBO.php”);
class Acesso {
/**
* Loga o usuário no sistema
*
* retorna array com:
*
* logado: String
* erro: Mensagem de erro se houver
*
* @param String $strUsuario
* @param String $strSenha
* @return Array
*/
public function logar($strUsuario, $strSenha) {
$arrayRetorno = array();
$bo = new LoginBO();
$logado = $bo->logar($strUsuario, $strSenha);
if ($logado) {
$arrayRetorno["logado"] = “true”;
} else {
$arrayRetorno["logado"] = “false”;
$arrayRetorno["erro"] = “Usuário inválido ou senha incorreta!”;
}
return $arrayRetorno;
}
Lembrando que esse arquivo deve ficar na pasta “services” do AMFPHP.
Bom! é isso! Espero ter ajudado!

Add to del.icio.us
6 06UTC Novembro 06UTC 2007 às 1:52 pm |
Ola Gregui, eu estava seguindo seu posto passo a passo até a a hora de criar a classe de conexao, nela vc faz um include: ”gregui/config.php” e ”gregui/bo/LoginBO.php”, vc tem como disponibilizar esses codigos?
grande abraço e parabens pelos post, são muito bons.
24 24UTC Novembro 24UTC 2007 às 11:40 pm |
E ae Gregui… muito legal seu trabalho.
Estou tentando utlizá-los, mas sem sucesso. Tem como disponibilizar os arquivos? ou a estrutura deles? valeu…
26 26UTC Novembro 26UTC 2007 às 11:37 pm |
Dica no lugar do:
switch (rest.length)
{
case 0:
op.send();
break;
case 1:
op.send(rest[0]);
break;
case 2:
op.send(rest[0], rest[1]);
break;
case 3:
op.send(rest[0], rest[1], rest[2]);
break;
case 4:
op.send(rest[0], rest[1], rest[2], rest[3]);
break;
case 5:
op.send(rest[0], rest[1], rest[2], rest[3], rest[4]);
break;
default:
op.send(rest);
break;
}
}
vc pode trocar por um apply:
op.send.apply(this, rest);
aii pode passar qtos paremetros quiser
27 27UTC Novembro 27UTC 2007 às 8:04 am |
Boa!!! Dica anotada!
Valeu!