让我们来看一个更复杂的例子,这个例子展示了用 ArrayCollection 作为返回数据以及在Flex中使用 [RemoteClass]
在本例中,远程方法返回一个映射了类的数组(an array of mapped classes),也就是说,返回的这个数组中的每个元素都有一个AS类与之对应。
1. 创建PHP服务
1.1 一个php类:$AMF_PHP/tutorials/Person.php
<?php
// actually it's php code
class Person {
var $firstName;
var $lastName;
var $phone;
var $email;
// explicit actionscript package
var $_explicitType = "tutorials.Person";
}
?>
其中 $_explicitType 变量告诉 amfphp 这个Person类与 AS 中的 tutorials.Person 类相对应。
1.2 下面创建php的service文件 $AMF_PHP/tutorials/PersonService.php,
这个类只有一个 getList 方法用来返回Person对象的数组
<?php
// actually it's PHP code
require_once "./Person.php";
class PersonService{
/**
* Get a list of people
* @returns An Array of Person
*/
function getList(){
$people = array(
array("Alessandro", "Crugnola", "+390332730999", "[email protected]"),
array("Patrick", "Mineault", "+1234567890", "[email protected]"),
);
$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;
}
}
?>
注意:上面两个php文件<?php ?>外面不能有任何输出,特别注意空格的存在
2. 编写客户端AS脚本Person类
// it's AS file
package tutorials
{
[RemoteClass(alias="tutorials.Person")]
[Bindable]
public class Person
{
public var firstName:String;
public var lastName:String;
public var phone:String;
public var email:String;
}
}
其中[RemoteClass(alias="tutorials.Person")]告诉Flex 该类与一个远程对象相关联(注意,相关联的类必须有相同的结构,否则Flex 不能正确识别远程对象)。
3. 完整的 main.mxml 代码如下
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="#FFFFFF">
<mx:RemoteObject id="myservice" source="tutorials.PersonService" destination="amfphp" fault="faultHandler(event)" showBusyCursor="true">
<mx:method name="getList" result="getListHandler(event)" fault="faultHandler(event)" />
</mx:RemoteObject>
<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 tutorials.Person;
import mx.utils.ArrayUtil;
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
[Bindable]
private var dp:ArrayCollection;
[Bindable]
private var selectedPerson:Person;
private function faultHandler(fault:FaultEvent):void{
Alert.show(fault.fault.faultString, fault.fault.faultCode.toString());
}
private function getListHandler(evt:ResultEvent):void{
dp = new ArrayCollection( ArrayUtil.toArray(evt.result) );
}
private function changeHandler(event:Event):void{
selectedPerson = Person(DataGrid(event.target).selectedItem);
}
]]>
</mx:Script>
<mx:Button x="290" y="357" label="get list" click="myservice.getOperation('getList').send();"/>
<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>
RemoteObject 标签 指向 tutorials/PersonService.php 类 并且定义一个方法来调用 PersonService.php 文件中的 getList 方法,当接到返回值后 getListHandler 方法会将返回值转化为 ArrayCollection 对象并且存储在变量 dp 中
最后 get list 按钮的 click="myservice.getOperation('getList').send(); 用来调用远程服务。
4. 看一下最终的swf
编译运行
引用
amxmlc -locale en_US -services "services-config.xml" main.mxml
界面如下:
点击get list按钮,鼠标点选任意行,结果如下: