RemoteObject & AMFPHP Beginning level

Rock!! Step by Step.

1. สร้าง DB บน MySQL

CREATE DATABASE `myflexphp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `my_user` (

`user_auto_id` INT NULL AUTO_INCREMENT PRIMARY KEY ,
`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/ จะได้ผลดังนี้
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 ที่เราสร้างขึ้น
AMFPHP services
สามารถทดสอบได้ โดยเลือกเมธอดที่้ต้องการทดสอบ แล้วกดปุ่ม Call
insertRow จะเป็นการเก็บข้อมูลลงตารางในฐานข้อมูล
selectAll จะแสดงข้อมูลจากตาราง

4. Create Flex project and config complier arguments

เปิด Flex Builder 3 ไปที่ File->New->Flex Project

ใส่ค่าที่จำเป็นดังนี้

MyFlexApp

Project name: MyFlexApp
Project location ให้เลือกค่าดีฟอลท์
Applicaion type ให้เลือก Web application (runs in Flash Player)
Server technology ในช่อง Application server type ให้เลือก PHP

กดปุ่ม Next >

คอนฟิก PHP Server

Flex build path
ใส่ค่าที่จำเป็นดังนี้
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

MyFlexApp->New->File

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
services-config.xml
ปรับปรุงข้อมูลใน 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>

Flex world is my life

แหล่งอ้างอิงที่เกี่ยวข้อง

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

About knopsod
Developer by Flex/Flash, ActionScript, PHP, Java, MySQL,PostgreSQL, Oracle, Ebay, PayPal, Alibaba, iOffer รับปรึกษา สอน และพัฒนาซอฟแวร์ ซื้อ ขาย ประมูลสินค้าออนไลน์

7 Responses to RemoteObject & AMFPHP Beginning level

  1. Pingback: AMFPHP Bug fix 555 « Flex ActionScript Guide Blog

  2. Genetic says:

    เพิ่งจะเริ่มเขียน Flex เองครับ หาวิธีติดต่อฐานข้อมูลอยู่พอดี

    ได้บทความนี้ของท่านไป มีประโยชน์มาก ๆ เลยครับ

    ขอบคุณอีกทีครับ

  3. supa says:

    ผมลองไล่ทำตามแล้วเกิดปัญหาตรงนี้นะครับ
    $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 …

    • knopsod says:

      ลองใช้ editor ตัวอื่นที่ช่วยในการเขียนโค้ด php โดยเฉพาะดูครับ เช่น netbeans, eclipse
      ถ้าใช้ dream มันอาจจะมีปัญหาบางอย่าง เช่น บางทีสัญลักษณ์พวก ” มันจะมองเป็นพวก tag html หรือบางทีถ้า dream ที่ติดตั้งบน windows มันก็ encode ไฟล์เป็น ANSI ซึ่งแก้ไขโดยการแล้วเลือกให้มัน encode เป็น UTF8 เป็นต้น ครับ

      ลองด้วย server ที่ใช้ php เวอร์ชั่นอะไรครับ php5.2 หรือ 5.3 ถ้า 5.2 จะใช้ได้ทันที ถ้าเป็น 5.3 อาจต้องมีการแก้ไขโค้ดบางอย่างของ amfphp ด้วย

  4. supa says:

    ขอบคุณมากครับ เห็นโำพสล่าสุด2 ปี ก่อน ผมนึกว่าจะไม่มีคนตอบแล้วนะเนี่ย ขอบคุณที่มาตอบครับ^^

    คือตอนนี้ผมไล่ทำจนถึงขั้นตอน ที่6 แล้วครับ
    - แต่ผมเริ่มไม่เข้าใจว่า ตั้งแต่ขั้นตอนที่ 4 มา นี่คือการทำอะไรหรอครับ
    - แล้วโค็ด xml ข้อ 6 ผม เซฟเป็นไฟล์ RemoteObject.xml เหมือนการทำ services-config.xml นี่ถูกรึเปล่าครับ
    - ผมต้องกด run ตรงไหนให้เหมือนกับภาพตอนสุดท้ายนะครับ ลองกด run MyFlexApp ใน flex แล้วขึ้นแค่หน้าจอว่างๆนะครับ

    • knopsod says:

      - แต่ผมเริ่มไม่เข้าใจว่า ตั้งแต่ขั้นตอนที่ 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 ไฟล์ที่เขียนอยู่

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.