標籤雲

Android (59) ActionScript (52) PHP (14) JavaScript (11) 設計模式 (10) CSS與Html (8) Flex (7) Material Design (6) frameworks (5) 工具 (5) 串流影音 (4) 通用 (4) DB (3) FlashRemoting (3) Java (3) SQL (3) Mac 操作 (2) OpenGL ES (2) PureMVC (2) React Native (2) jQuery (2) AOSP (1) Gradle (1) XML (1) 軟體設定 (1)

搜尋此網誌

顯示具有 FlashRemoting 標籤的文章。 顯示所有文章
顯示具有 FlashRemoting 標籤的文章。 顯示所有文章

2010/11/03

flash.net.registerClassAlias 與 Value Object

接續前面的內容,在 Zend_Amf 入門 裡面,透過 gateway 程式我們可以呼叫 PHP 的方法傳回資料
今天來研究一下另一種 Typed Object 的方式,把 PHP 類別 mapping 到 ActionScript 裡面(這種專門用來存放資料的物件稱為 Value Object)

首先回顧一下我們的 gateway,透過 addDirectory 我們把 AMFapp/ 下的 .php 動態載入
<?php
require_once 'Zend/Amf/Server.php';

$server = new Zend_Amf_Server();
$server->addDirectory(dirname(__FILE__) . '/AMFapp/');

$response = $server->handle();
echo $response;
?>

接下來我們在 AMFapp 下面新開一個資料夾 vo,專門用來放 Value Object 的類別
並在裡面建立一個 VOPerson.php
<?php
class VOPerson{
 //注意這裡!! 用 public $_explicitType 設定類別別名
 public $_explicitType = "VOPersonAlias";
 
 public $fName = "Joseph 喬瑟夫";
 public $lName = "Joestar 喬斯達";
 public $favoriteFood = array("T-Bone Steak", "Fried Chicken", "Chewing Gum");
 
 protected $standName = "Hermit Purple";
 private $birthday = "1920-09-27";
}
?>

除了用 public $_explicitType 設定類別別名外,也可以用 getASClassName 回傳類別別名
兩種方式擇一即可
public function getASClassName(){
 return 'VOPersonAlias';
}

有了 mapping 的 PHP 類別後,我們再寫一個 TestVO.php (放在 AMFapp下) 用來回傳這個 VOPerson 類別

<?php
//記得要把類別匯入
include 'vo/VOPerson.php';

class TestVO{
 public function getVOPerson(){
  return new VOPerson();
 }
}
?>

在 Flash 裡面我們也要準備一個跟 VOPerson 對應的類別,本例為 VOPerson.as
範例方便起見就使用 default package
package  {
 public class VOPerson {
  public var fName:String;
  public var lName:String;
  public var country:String;
  public var favoriteFood:Array;
  //非 public 的物件成員是不會 mapping 過來的,這邊只是測試用而已
  protected var standName:String;
  private var birthday:String;
  //這邊我們定義 toString 方法以便傾印資料
  public function toString():String{
   var s:String = "======== " + fName +" ‧ "+ lName +" ========\n";
   s += "國籍: "+ country +"\n";
   s += "喜歡的食物: "+ favoriteFood +"\n";
   s += "替身名: "+ standName +"\n";
   s += "生日: "+ birthday +"\n";
   s += "=================================================";
   return s;
  }
 }
}

該準備的東西都齊了,組合!!
ValueObjectTest1.fla
import flash.net.*;

//注意這裡!! 一定要註冊類別別名且與 $_explicitType 的值相同,這樣才可以正確識別
registerClassAlias("VOPersonAlias", VOPerson);

[Bindable]
var person:VOPerson;

var nc:NetConnection = new NetConnection();
var responder:Responder = new Responder(onNCResult, onNCFault);
nc.connect("http://localhost/zend_gateway.php");
nc.call("TestVO.getVOPerson", responder);

function onNCResult(re:*):void{
 person = VOPerson(re);
 trace(person); //因為我們寫了 toString(),所以可以直接 trace
}
function onNCFault(fault:Object):void{
 for(var s:String in fault){
  trace(s);
 }
}

如果順利的話就可以見到如下資訊
可以看到非 public 的屬性是過不來的
======== Joseph 喬瑟夫 ‧ Joestar 喬斯達 ========
國籍: U.S.A.
喜歡的食物: T-Bone Steak,Fried Chicken,Chewing Gum
替身名: null
生日: null
=================================================

如果出現錯誤訊息的話,請檢察類別別名是否有設定?
在 PHP 跟 AS 裡面設的別名是否相同?
需要的檔案是否正確匯入?...等

2010/11/01

ActionScript (AMF3) 與 PHP 資料型別對照表

ActionScript (AMF3) 對應 PHP 資料型別
ActionScript type (AMF3)PHP type
undefined
null
null
intinteger (超出範圍時為 float)
Number
uint
float
Booleanboolean
Stringstring
Arrayarray
XmlSimpleXml
flash.utils.ByteArraystring
Object
mx.collections.ArrayCollection
object
RemoteClass Objectclass mapped object
dateZend_Date

 

PHP 對應 ActionScript (AMF3) 資料型別
PHP typeActionScript type (AMF3)
nullnull
booleanBoolean
stringString
integer
float
Number
DomDocumentXml
DateTimeDate
Array (索引式陣列)Array
object
Array (關聯式陣列)
Object
RemoteClass Zend_Amf_Value_TypedObjecttyped object
RemoteClass Zend_Amf_Value_ArrayCollectionmx.collections.ArrayCollection

2010/10/25

Zend_Amf 入門

上一篇整理了 Flash 的資料交換方式,這次要開始慢慢切入正題
Flash Remoting 是 swf 使用 AMF 二元資料格式與伺服器的 Remoting Component 進行資料交換的技術(透過 HTTP)
在 PHP 有 amfphp, Zend_Amf 等
但由於 PHP 5.3 與 amfphp 1.9 在 localhost 測試時會出現錯誤
在找不到解決方法下,我打算改由 Zend_Amf 來上手

Zend Framework 是 Zend 公司針對 PHP 企業級開發的 Framework,而 Zend_Amf 就是其中的一組函式庫
取得的方法很簡單,只要上官方網站下載後解壓縮打開即可

而我是使用 svn 的方式來取得,既然是寫入門還是說清楚一點好了:
1. 首先如果 PC 裡沒有安裝 svn 軟體,可以下載安裝 TortoiseSVN (俗稱小烏龜)軟體
2. 在電腦裡開一個資料夾並命名,如 Zend Framework,按右鍵選擇 SVN Checkout,網址輸入 http://framework.zend.com/svn/framework/standard/trunk
3. 此時會跟網址上的檔案進行版本更新,但因為 Zend Framework 並不是很小,所以等它跑完大約需要幾分鐘

至於布署方式,只要把 library 的內容放到網站目錄下即可
(租用虛擬主機空間時由於無法更改主機設定故要用這種方式來布署)
我是選擇直接在 php.ini 裡做 include 設定,檔案就不用貼來貼去占空間
include 的方法如下:只要找到 include_path 這一行,然後以分號分隔把路徑加上去即可
路徑請記得改成自己的...

; Windows: "\path1;\path2"
include_path = ".;c:\php\includes;C:\Zend Framework\library"

這樣安裝跟布署就完成了!!

接下來還有一個重點就是要設定 Gateway 程式
在網頁目錄下新增一個 zend_gateway.php 輸入以下程式碼
並開一個子資料夾來放 remoting component,本例為 AMFapp/

<?php
//匯入 Zend/Amf/Server.php 檔案
require_once 'Zend/Amf/Server.php';

// 建立 Server 物件
$server = new Zend_Amf_Server(); //由於檔案是在 Zend/Amf/ (套件路徑)下,所以 new 的時候要寫為 Zend_Amf_Server
$server->addDirectory('AMFapp/'); //呼叫  Zend_Amf_Server 的 addDirectory 方法,將指定路徑下的檔案自動加進來

//呼叫 handle 方法處理資料並放入 $response 裡輸出
$response = $server->handle();
echo $response;
?>

而在 AMFapp 裡,開一個 HelloWorld.php 來測試吧
<?php
class HelloWorld{
 /**
  * 就是 Hello World 啦!!
  * @param string $arg
  * @return string
  */
 function sayHelloWorld($arg = ""){
  $returnValue = "Hello Zend_Amf!! 如果看到這就成功嚕!!". $arg;
  return $returnValue;
 }
}
?>

接下來是 ActionScript 的部分:(關於 NetConnection 的詳細內容請參閱官方文件)
package {
 import flash.display.*;
 import flash.net.*;
 
 public class MyTest_zend_01 extends MovieClip {
  private var ncZend:NetConnection;
  private var rsZend:Responder;
  
  public function MyTest_zend_01() {
   //建立 NetConnection 物件
   ncZend = new NetConnection();
   //將 Gateway 的完整路徑傳入 connect 方法
   ncZend.connect("http://localhost/zend_gateway.php");
   //建立 Responder 物件,指定回應與錯誤的 callback func
   rsZend = new Responder(onResult, onFault);
   //呼叫 call 方法開始連線
   //注意這裡是用 SomeClass.SomeFunc 的表示方式
   ncZend.call('HelloWorld.sayHelloWorld', rsZend, "這是傳入的字串");
  }
  //回應處理函式
  private function onResult(result:Object):void {
   trace(result);
  }
  //錯誤處理函式
  private function onFault(err:Object):void {
   trace("fault:");
   for (var i:String in err) {
    trace(i, ":", err[i]);
   }
  }
 }
}
測試發布時如果看到 output 有 trace 出訊息就表示成功了!!