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:

Erko Bridee - que escreveu 403 post(s).


Entre em contato

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

1 Comentário para este post

  1. Ricardo Gobbo:

    Parabens Erko… otimo post