Para maioria do pessoal que anda trabalhando com Adobe Flex e algum DataService, seja este AMFPHP, WebOrb, BlazeDS, GraniteDS, … para qualquer um destes, caso você não queira, não precisa utilizar o arquivo services-config.xml para trabalhar com o RemoteObjects…
obs.: porém caso você não defina o services-config.xml, você não poderá utilizar a tag RemoteObject e apenas utilizar segundo o modelo a seguir, segue uma classe para trabalhar sem o services-config.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | /** * Classe para chamada de Objetos Remotos * * por: * Carlos A. Piasseski * Erko Bridee de Almeida Cabrera */ package RO { import mx.controls.Alert; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.remoting.mxml.Operation; import mx.rpc.remoting.mxml.RemoteObject; import mx.messaging.Channel; import mx.messaging.ChannelSet; import mx.messaging.channels.AMFChannel; public class RemoteConnection { // URL do gateway do DataService // no caso está apontando para uma URL padrão do AMFPHP, mas poderia ser outro DS public static var endPointUrl:String = "http://{server.name}/amfphp/gateway.php"; // nome para o canal de comunicação public static var channelName:String = "amfphp"; /** * Método que pré-configura o RemoteObject * definindo o canal de comunicação com o * respectivo DataService que está sendo utilizado no * back-end, com isso não há a necessidade de utilizar * o service-config.xml definida na compilação do * projeto */ private function instanceRemoteObject() : RemoteObject { // Cria um ChannelSet. var cs:ChannelSet = new ChannelSet(); // Cria um Channel. var customChannel:Channel = new AMFChannel( // define o nome do canal channelName, // define a URL de conexão endPointUrl ); // Adiciona o Channel ao ChannelSet. cs.addChannel(customChannel); // instância o objeto var connection:RemoteObject = new RemoteObject(channelName); // Assign the ChannelSet to a RemoteObject instance. connection.channelSet = cs; // retorna a instância do RemoteObject return connection; } /** * Método que trata quando há algum erro de * Conexão com o AMFPHP * * @param event:FaultEvent */ public function onConnectionFault(event:FaultEvent) : void { Alert.show(event.fault.getStackTrace(),"FALHA DE CONEXÃO!"); } /** * * @param Método da Classe * @callBack Função de Retorno do Método Assincrono * @VO Instancia do VO que navegará entre as camadas no back-end */ public function call(servico:String, metodo:String, callBack:Function, VO:Object=null) : void { // recuperando uma instância do RemoteObject pré-configurada var connection:RemoteObject = instanceRemoteObject(); // Faz a busca do serviço solicitado connection.source = servico; // Mostra o cursor ocupado connection.showBusyCursor = true; // Mostra erros, se ocorrerem connection.addEventListener(FaultEvent.FAULT, onConnectionFault); // executa o método da classe de serviço var op:Operation = connection.getOperation(metodo) as Operation; op.addEventListener(ResultEvent.RESULT, callBack); // quando houver a necessidade de enviar um objeto para o servidor VO == null ? op.send() : op.send(VO); } } } |
Exemplo de uso, considerando o uso do AMFPHP para este exemplo:
dentro do diretório do /services do AMFPHP, o diretorio /remote_object_php
classe do VO: /vo
1 2 3 4 5 6 7 8 9 10 11 | <?php class Person { var $firstName; var $lastName; var $phone; var $email; // explicit actionscript package var $_explicitType = "RO.teste.Person"; } ?> |
classe do serviço:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <?php require_once "vo/Person.php"; class PersonService { /** * Recupera uma lista de pessoas * @returns An Array of Person */ function getList() { $people = array( array("Alessandro", "Crugnola", "+390332730999", "alessandro@sephiroth.it"), array("Patrick", "Mineault", "+1234567890", "patrick@5etdemi.com"), ); $p = array(); for($a = 0; $a < count($people); $a++){ $person = new Person(); $person->firstName = $people[$a][0]; $person->lastName = $people[$a][1]; $person->phone = $people[$a][2]; $person->email = $people[$a][3]; $p[] = $person; } return $p; } function getPerson() { $person = new Person(); $person->firstName = "Primeiro Nome"; $person->lastName = "Sobre Nome"; $person->phone = "+5533333333"; $person->email = "mail@host.dom"; return $person; } } ?> |
No Adobe Flex:
classe AS que representa o Person:
1 2 3 4 5 6 7 8 9 10 | package RO.teste { [RemoteClass(alias="RO.teste.Person")] [Bindable] public class Person { public var firstName:String; public var lastName:String; public var phone:String; public var email:String; } } |
MXML: interface do exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="#FFFFFF"> <mx:DataGrid x="10" y="10" width="345" id="people_list" dataProvider="{dp}" change="changeHandler(event)"> <mx:columns> <mx:DataGridColumn headerText="Last name" dataField="lastName"/> <mx:DataGridColumn headerText="First name" dataField="firstName"/> <mx:DataGridColumn headerText="Telephone" dataField="phone"/> <mx:DataGridColumn headerText="Email" dataField="email"/> </mx:columns> </mx:DataGrid> <mx:Script> <![CDATA[ import mx.utils.ArrayUtil; import mx.collections.ArrayCollection; import mx.rpc.events.ResultEvent; import mx.controls.Alert; import mx.rpc.events.FaultEvent; import RO.RemoteConnection; import RO.teste.Person; [Bindable] private var dp:ArrayCollection; [Bindable] private var selectedPerson:Person; private function getListHandler(evt:ResultEvent):void { dp = new ArrayCollection( ArrayUtil.toArray(evt.result) ); } // ao alterar private function changeHandler(event:Event):void { selectedPerson = Person(DataGrid(event.target).selectedItem); } private function getDados() : void { var remoteConnection:RemoteConnection = new RemoteConnection(); // nome da classe PHP // nome do método da classe // função para tratar o retorno dos dados // tipo do objeto remoteConnection.call("remote_object_php.PersonService","getList", function(event:ResultEvent):void { // o flex geralmente espera um retorno de array de objetos dp = new ArrayCollection( event.result as Array ); } ); } private function getPerson() : void { var remoteConnection:RemoteConnection = new RemoteConnection(); // nome da classe PHP // nome do método da classe // função para tratar o retorno dos dados // tipo do objeto remoteConnection.call("remote_object_php.PersonService","getPerson", function(event:ResultEvent):void { selectedPerson = event.result as Person; } ); } ]]> </mx:Script> <mx:Button x="290" y="357" label="get list" click="getDados();"/> <mx:Button x="200" y="357" label="get Person" click="getPerson();"/> <mx:Form x="10" y="174" width="345" height="175"> <mx:FormHeading label="Selected Person" /> <mx:FormItem label="First Name"> <mx:TextInput id="person_first_name" text="{selectedPerson.firstName}" /> </mx:FormItem> <mx:FormItem label="Last Name"> <mx:TextInput id="person_last_name" text="{selectedPerson.lastName}" /> </mx:FormItem> <mx:FormItem label="Telephone"> <mx:TextInput id="person_phone" text="{selectedPerson.phone}" /> </mx:FormItem> <mx:FormItem label="Email"> <mx:TextInput id="person_email" text="{selectedPerson.email}" /> </mx:FormItem> </mx:Form> </mx:Application> |
Download: RemoteObjectSemXML
Remondo verificar estes links externos #1 #2 #3 que estão relacionados diretamente a este post.







quinta-feira, 11/03/2010 10:00 pm
Parabens Erko… otimo post