RemoteObject sem services-config.xml

sábado, 21/02/2009 9:04 pm  

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:

?View Code ACTIONSCRIPT
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:

?View Code ACTIONSCRIPT
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:

?View Code ACTIONSCRIPT3
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.

, , ,

Veja também:

Este post foi escrito por:

- que escreveu 493 post(s).


Entre em contato

  • http://intensedebate.com/profiles/ricardogobbo Ricardo Gobbo

    Parabens Erko… otimo post