本文章最新版本請參見:http://www.deepcast.net/wiki/ow.asp?Flash和PHP的整合
在上一篇文章 Flash整合PHP指令碼(1)--XML篇中,我們開發了一個小型的Adobe
Flex2應用程式串連了一個PHP背景程式。如果你曾看過上篇,你可能會問:它們之間是否可以不通過XML編碼作中介,而直接傳遞變數?答案是可以。本文就會示範這方面的執行個體。
請注意,本文是用Flex2編寫的。
一,系統要求:1, Flex Builder 2 (包括SDK)
2, AMFPHP 1.25 :
3, PHP (installed on a local web server)
二,預備知識
PHP有關Intermediate知識
三,MYSQL和PHP
如果想要建立一個中大型的公司專屬應用程式,可以使用Adobe Flex Data Service
2。它通過高效的資料轉送,基於資訊的發布和訂閱等更多方式來簡化資料的互動。AMFPHP只是它的一個小子集。如果你為大企業工作,你會更想見識一下它在資料互動層的表現。
完成這個任務的關鍵是
AMFPHP。該項目最早是由Wolfgang
Hamann發起的,該團隊成長壯大到目前的五六個開發人員左右。正是多虧了他們的辛勤工作,整個Flex社區現在才有了一個基於Flex的使用PHP背景前台。
本例將示範如果從一個資料庫中顯示記錄。只是顯示,暫不能插入和更新。本文使用的MYSQL資料庫名Sample,表名Users,和前一篇文章用到的資料庫結構一致,只是需要先往裡面填一些資料以供顯示。AMFPHP_Flex.rar此為資料庫結構和輸入資料的SQL檔案提供下載。
如下為PHP指令碼代碼,其檔案名稱為 sample.php,把它放到AMFPHP的services目錄下。
<?php
// Create new service for PHP Remoting as Class
class sample
{
function sample ()
{
// Define the methodTable for this class in the constructor
$this->methodTable = array(
"getUsers" => array(
"description" => "Return a list of users",
"access" => "remote"
)
);
}
function getUsers () {
$mysql = mysql_connect(localhost, "username", "password");
mysql_select_db( "sample" );
//return a list of all the users
$Query = "SELECT * from users";
$Result = mysql_query( $Query );
while ($row = mysql_fetch_object($Result)) {
$ArrayOfUsers[] = $row;
}
return( $ArrayOfUsers );
}
}
?>
如果你熟悉AMFPHP的話,上述你也應該很熟悉。
類的名字和檔案名稱要保持一致,如上檔案名稱smaple.php,則類名為sample。因為類檔案總是在載入時調用與其同名的類來初始化自己。上例中定義了對AMFPHP有效方法,就是getUsers,該方法返回一個使用者列表。在資料庫裡,取回所有使用者,並以一個對象數組的方式返回。
四,應用的前台
現在開始建立前台的檔案sample.mxml,它也只有短短五十行:
<!--第一行是最頂層的XML文檔定義-->
<?xml version="1.0"
encoding="utf-8"?>
<!--第二行是Applicastion定義,並設定了在FLASH載入creationComplete時調用initApplication()函數-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" creationComplete="initApplication()">
<!--用於顯示使用者資料的DataGrid組件,請注意列名元素必須和資料庫的欄位名一致。-->
<mx:DataGrid dataProvider="{dataProvider}">
<mx:columns>
<mx:DataGridColumn headerText="Userid" dataField="userid"/>
<mx:DataGridColumn headerText="User Name" dataField="username"/>
<mx:DataGridColumn headerText="User Name" dataField="emailaddress"/>
</mx:columns>
</mx:DataGrid>
<!--然後是一系列AS命令-->
<mx:Script>
<![CDATA[
<!--本例中dataProvider被綁定到<mx:DataGrid>,這意味著該DataGrid從該變數中(此處為PHP對象數組)取得資料。
上,-->
[Bindable]
public var dataProvider:Array;
<!--然後是AMFPHP在FLEX中工作的必須代碼。首先匯入用於遠端
flash.net.Responder包,其實當你聲明你需要一個新的
Responder時FLEX會自動包含入那個包。此處只是特地示範。
<!--然後,建立一個變數,gateway, 它是 RemotingConnection資料類型。你已經知道了RemotingConnection的相關事宜。你應該在FLEX的底部來加入一個檔案,名為RemotingConnection.as,上面有許多代碼。
-->
import flash.net.Responder;
public var gateway : RemotingConnection;
<!--當FLASH應用載入時調用initApplication ,設定gateway變數為到AMFPHP中的gateway.php的串連路徑。這樣就可以調用sample類中的getUsers方法了。然後根據是否出錯相應地執行onResulth或者onFault兩個函數之一。-->
public function initApplication()
{
gateway = new RemotingConnection( "http://localhost/flex/php/gateway.php" );
gateway.call( "sample.getUsers", new Responder(onResult, onFault));
}
<!--簡單設定了dataProvider變數為結果變數,其通過AMFPHP傳回ActionScript。這就是當你運行MYSQL查詢($ArrayOfUsers)時會返回PHP對象的數組。AMFPHP已經自動把PHP對象數組翻譯成了ActionScript數組,酷吧。 -->
public function onResult( result : Array ) : void
{
dataProvider = result;
}
<!--在出錯情況下,就象給使用者的錯誤資訊提示一樣,你可以追蹤變數的值,在偵錯模式中特別有用-->
public function onFault( fault : String ) : void
{
trace( fault );
}
]]>
</mx:Script>
</mx:Application>
上述執行個體稍顯複雜,讓我們再次明確一下檔案的位置。有三個檔案被建立,以及下載來的AMFPHP檔案包。
- 把Flex專案檔,sample.mxml 和 RemotingConnection.as放在同一個目錄下
- 把PHP檔案和檔案夾如services ,actions, adapters, app, browser等從AMFPHP檔案壓縮包中解壓縮釋放出來。
- 把AMFPHP中的所有檔案都放到web根目錄下
- 把sample.php放到AMFPHP項目中的services 檔案夾下
那麼,上述串連PHP後台和Flex所建前台的小應用程式執行個體就到此結束了。上述代碼提供在此AMFPHP_Flex.rar打包下載。
本文章最新版本請參見:http://www.deepcast.net/wiki/ow.asp?Flash和PHP的整合