Flex RemoteObject and AMFPHP 1.9 教程(二)

让我们来看一个更复杂的例子,这个例子展示了用 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(&apos;getList&apos;).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

界面如下:
Flex RemoteObject and AMFPHP 1.9 教程(二)


点击get list按钮,鼠标点选任意行,结果如下:
Flex RemoteObject and AMFPHP 1.9 教程(二)

你可能感兴趣的:(PHP,xml,Flex,脚本,actionscript)