RemoteObject & AMFPHP Beginning level
2009/07/11 7 Comments
Rock!! Step by Step.
1. สร้าง DB บน MySQL
CREATE DATABASE `myflexphp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE `my_user` (
`user_username` VARCHAR( 25 ) NULL ,
`user_email` VARCHAR( 25 ) NULL
) ;
2. AMFPHP installation.
ดาวน์โหลด AMFPHP ที่ www.amfphp.org จะได้ amfphp-1.9.beta.20080120.zip แตกไฟล์ออกมา
สร้างโฟลเดอร์ใหม่ใน Web root directory ชื่อ myamftest ตามโครงสร้างดังนี้ แล้วนำโฟลเดอร์ amfphp ที่แตกไฟล์แล้วไปเก็บไว้
ภายใน amfphp->services ให้สร้างโฟลเดอร์ใหม่ ชื่อ myflexphp
C:\
….|-AppServ
……..|-www
…………|-myamftest
…………….|-amfphp
………………..|-services
……………………|-myflexphp
ทดสอบโดยเข้าไปที่ http://127.0.0.1/myamftest/amfphp/browser/ จะได้ผลดังนี้

จะเห็นฟอร์มและค่าดีฟอล์ท ให้กดปุ่ม Save ได้เลย
3. เขียน *.php (PHP Class, PHP Dao)
สร้างคลาส MyUser ไว้ในไฟล์ MyUser.php และเก็บไว้ในโฟลเดอร์ myflexphp ดังนี้
<?php
/** * MyUser class
*/
class MyUser{
var $user_auto_id;
var $user_username;
var $user_email;
/** * explicit actionscript package */
var $_explicitType = “myflexphp.MyUser“;
}
?>
สร้างคลาส MyUserDao ไว้ในไฟล์ MyUserDao.php และเก็บไว้ในโฟลเดอร์ myflexphp ดังนี้
<?php
/**
* @author
* @copyright 2008
*/
/**
* First MyUserDao class */ /** Flex */
require_once “./MyUser.php”; /** Flex */
class MyUserDao{ /** Flex */
var $myConn;
/** ************* ************* */
function MyUserDao(){ /** Flex */
$this->myConn = mysql_connect(“127.0.0.1″, “root”, “123456″);
mysql_select_db(“myflexphp”, $this->myConn);
mysql_query(“SET NAMES ‘utf8′”,$this->myConn);
}
/** ************* ************* */
function insertRow($valObj){
$query =
“
INSERT INTO my_user(user_auto_id,user_username,user_email) VALUES
(‘”.$valObj["user_auto_id"].”‘,’”.$valObj["user_username"].”‘,’”.$valObj["user_email"].”‘)
“;
return mysql_query($query,$this->myConn);
}
/** ************* ************* */
function selectAll(){
$query = “SELECT * FROM my_user”;
$result = mysql_query($query, $this->myConn);
$arr = array();
$valObj;
while($row = mysql_fetch_array($result)){
$valObj = new MyUser();
$valObj->user_auto_id = $row["user_auto_id"];
$valObj->user_username = $row["user_username"];
$valObj->user_email = $row["user_email"];
$arr[] = $valObj;
}
return $arr;
}
}
?>
ทดสอบ *.php เข้าไปที่ http://127.0.0.1/myamftest/amfphp/browser/ อีกครั้ง จะเห็น services ที่เราสร้างขึ้น

สามารถทดสอบได้ โดยเลือกเมธอดที่้ต้องการทดสอบ แล้วกดปุ่ม Call
insertRow จะเป็นการเก็บข้อมูลลงตารางในฐานข้อมูล
selectAll จะแสดงข้อมูลจากตาราง
4. Create Flex project and config complier arguments
เปิด Flex Builder 3 ไปที่ File->New->Flex Project
ใส่ค่าที่จำเป็นดังนี้
Project name: MyFlexApp
Project location ให้เลือกค่าดีฟอลท์
Applicaion type ให้เลือก Web application (runs in Flash Player)
Server technology ในช่อง Application server type ให้เลือก PHP
กดปุ่ม Next >
คอนฟิก PHP Server

ใส่ค่าที่จำเป็นดังนี้
Server location
….|-Web root:C:\AppServ\www\myamftest
….|-Root URL:http://127.0.0.1/myamftest
กดปุ่ม Validate Configuration
Compiled Flex application location
….|-Output folder:C:\AppServ\www\myamftest\MyFlexApp-debug
กดปุ่ม Finish
สร้างไฟล์ servics-config.xml ตามตำแหน่งนี้
MyFlexApp
….|-src
……..|-services-config.xml


ข้อมูลที่จำเป็นใน services-config.xml มีดังนี้
<?xml version=”1.0″ encoding=”UTF-8″?>
<services-config>
<services>
<service id=”amfphp-flashremoting-service”
class=”flex.messaging.services.RemotingService”
messageTypes=”flex.messaging.messages.RemotingMessage”>
<destination id=”amfphp“>
<channels>
<channel ref=”my-amfphp”/>
</channels>
<properties>
<source>*</source>
</properties>
</destination>
</service>
</services>
<channels>
<channel-definition id=”my-amfphp”>
<endpoint uri=”http://127.0.0.1/myamftest/amfphp/gateway.php“
class=”flex.messaging.endpoints.AMFEndpoint”/>
</channel-definition>
</channels>
</services-config>
*เพื่อความยืดหยุ่นในการใช้งาน การระบุ endpoint uri อาจเขียนได้เป็นดังนี้
<endpoint uri=”../myamftest/amfphp/gateway.php“
/>
ซึ่งช่วยให้เราอัพโหลดขึ้น server hosting ได้ในทันทีโดยไม่ต้องมาเปลี่ยนทุกครั้งเมือ build โปรเจ็คท์
จากนั้นคลิกขวาที่ MyFlexApp->Properties เลือก Flex compiler

ปรับปรุงข้อมูลใน Additional compiler arguments:
จาก
-locale en_US
เป็น
-locale en_US -services “services-config.xml”
5. เขียน *.as ( ActionScript Class )
สร้างโฟลเดอร์ใหม่ชื่อ 
myflexphp และสร้างคลาส MyUser ในไฟล์ MyUser.as ตามตำแหน่งนี้
MyFlexApp
….|-src
……..|-myflexphp
…………|-MyUser.as
package myflexphp
{
[RemoteClass(alias="myflexphp.MyUser")]
[Bindable]
public class MyUser
{
public var user_auto_id:String;
public var user_username:String;
public var user_email:String;
}
}
6. Remoting ( mx:RemoteObject )
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”>
<mx:Script>
<![CDATA[
import myflexphp.MyUser;
import mx.utils.ArrayUtil;
import mx.rpc.events.ResultEvent;
private function btInsert():void{
var valObj:MyUser = new MyUser();
valObj.user_auto_id = txtInUserAutoId.text;
valObj.user_username = txtInUserUsername.text;
valObj.user_email = txtInUserEmail.text;
rmtObjMyUserDao.getOperation("insertRow").send(valObj);
}
private function btSelect():void{
rmtObjMyUserDao.getOperation("selectAll").send();
}
private function resultSelectAll( event:ResultEvent ):void{
ac = new ArrayCollection( ArrayUtil.toArray( event.result ) );
}
]]>
</mx:Script>
<mx:ArrayCollection id=”ac”/>
<mx:RemoteObject id=”rmtObjMyUserDao”
source=”myflexphp.MyUserDao”
destination=”amfphp“>
<mx:method name=”insertRow”/>
<mx:method name=”selectAll” result=”resultSelectAll(event)”/>
</mx:RemoteObject>
<mx:DataGrid dataProvider=”{ac}”/>
<mx:Form>
<mx:FormItem label=”user_auto_id”>
<mx:TextInput id=”txtInUserAutoId”/>
</mx:FormItem>
<mx:FormItem label=”user_username”>
<mx:TextInput id=”txtInUserUsername”/>
</mx:FormItem>
<mx:FormItem label=”user_email”>
<mx:TextInput id=”txtInUserEmail”/>
</mx:FormItem>
<mx:HBox>
<mx:Button label=”INSERT” click=”btInsert()”/>
<mx:Button label=”SELECT” click=”btSelect()”/>
</mx:HBox>
</mx:Form>
</mx:Application>

http://www.sephiroth.it/tutorials/flashPHP/flex_remoteobject/index.php
Utility tool may be you looking for http://www.drezzy.com/amfphpdbutil/bin/AMFPHPDbUtil.html

Pingback: AMFPHP Bug fix 555 « Flex ActionScript Guide Blog
เพิ่งจะเริ่มเขียน Flex เองครับ หาวิธีติดต่อฐานข้อมูลอยู่พอดี
ได้บทความนี้ของท่านไป มีประโยชน์มาก ๆ เลยครับ
ขอบคุณอีกทีครับ
ยินดีคับ พอช่วยได้ก็ช่วยกันไป
ผมลองไล่ทำตามแล้วเกิดปัญหาตรงนี้นะครับ
$this->myConn = mysql_connect(“127.0.0.1″, “root”, “123456″);
ใน dream มันแจ้งว่า no cs5 rules apply for selected tag
พอมาทดสอบตามมันขึ้นแบบนี้นะครับ
Error retrieving service info:
Invalid AMF message
Parse error: syntax error, unexpected T_STRING in …
ลองใช้ editor ตัวอื่นที่ช่วยในการเขียนโค้ด php โดยเฉพาะดูครับ เช่น netbeans, eclipse
ถ้าใช้ dream มันอาจจะมีปัญหาบางอย่าง เช่น บางทีสัญลักษณ์พวก ” มันจะมองเป็นพวก tag html หรือบางทีถ้า dream ที่ติดตั้งบน windows มันก็ encode ไฟล์เป็น ANSI ซึ่งแก้ไขโดยการแล้วเลือกให้มัน encode เป็น UTF8 เป็นต้น ครับ
ลองด้วย server ที่ใช้ php เวอร์ชั่นอะไรครับ php5.2 หรือ 5.3 ถ้า 5.2 จะใช้ได้ทันที ถ้าเป็น 5.3 อาจต้องมีการแก้ไขโค้ดบางอย่างของ amfphp ด้วย
ขอบคุณมากครับ เห็นโำพสล่าสุด2 ปี ก่อน ผมนึกว่าจะไม่มีคนตอบแล้วนะเนี่ย ขอบคุณที่มาตอบครับ^^
คือตอนนี้ผมไล่ทำจนถึงขั้นตอน ที่6 แล้วครับ
- แต่ผมเริ่มไม่เข้าใจว่า ตั้งแต่ขั้นตอนที่ 4 มา นี่คือการทำอะไรหรอครับ
- แล้วโค็ด xml ข้อ 6 ผม เซฟเป็นไฟล์ RemoteObject.xml เหมือนการทำ services-config.xml นี่ถูกรึเปล่าครับ
- ผมต้องกด run ตรงไหนให้เหมือนกับภาพตอนสุดท้ายนะครับ ลองกด run MyFlexApp ใน flex แล้วขึ้นแค่หน้าจอว่างๆนะครับ
- แต่ผมเริ่มไม่เข้าใจว่า ตั้งแต่ขั้นตอนที่ 4 มา นี่คือการทำอะไรหรอครับ
+ สร้าง Flex project และตั้งค่า Flex compiler arguments ครับ เพื่อที่จะ remoting ได้สะดวกขึ้น
- แล้วโค็ด xml ข้อ 6 ผม เซฟเป็นไฟล์ RemoteObject.xml เหมือนการทำ services-config.xml นี่ถูกรึเปล่าครับ
+ ไม่ครับ ตอนที่เราสร้าง Flex project ขึ้นมาจะมี Application file อยู่แล้ว 1 ไฟล์ โดยไฟล์ดังกล่าวจะมี Application tag (mx:Application หรือ s:Application) อยู่ ให้ไปแก้ไขไฟล์ดังกล่าวตามโค้ดใน ข้อ 6
- ผมต้องกด run ตรงไหนให้เหมือนกับภาพตอนสุดท้ายนะครับ ลองกด run MyFlexApp ใน flex แล้วขึ้นแค่หน้าจอว่างๆนะครับ
+ ให้ลองไปที่เมนูบาร์ Project แล้วเลือกคลิ๊กอันใดอันหนึ่งต่อไปนี้ Build All, Build Project, หรือ Build Automatically แล้วกด Run
*Build All จะสั่งให้ Flex/Flash Builder ทำการ compile & build ทุกโปรเจ็คที่เปิดอยู่
*Build Project จะสั่งให้ Flex/Flash Builder ทำการ compile & build โปรเจ็คที่กำลังเปิดเขียนอยู่
*Build Automatically จะกำหนดให้ Flex/Flash Builder ทำการ compile & build ทุกครั้งที่ Save ไฟล์ที่เขียนอยู่