slobber | 06 九月, 2006 07:53
在å¦ä¸€ç¯‡æ–‡ç« (æ•´åˆ Flex 2 与 PHP) ä¸ï¼Œæˆ‘演示了如何开å‘一个简å•çš„ Adobe Flex 2 应用程åºåŽ»è¿žæŽ¥åˆ°ä¸€ä¸ª PHP åŽå°ç¨‹åºã€‚å¦‚æžœä½ å·²ç»è¯»äº†è¿™ç¯‡æ–‡ç« ,å¯èƒ½ä½ 会考虑有没有途径使 Flex 程åºä¸Ž PHP 之间直接交æ¢å˜é‡ï¼Œè€Œä¸ç”¨å°†å®ƒä»¬ç¼–ç 为 XMLï¼Ÿç”æ¡ˆæ˜¯è‚¯å®šçš„,在本文ä¸ï¼Œæˆ‘将展示如何实现它。
注æ„: 本教程是基于Flex 2 Beta 3的。我将尽快将它更新到 Flex 的零售版本。
ä¸ºäº†å®žçŽ°æœ¬æ–‡çš„å¤§éƒ¨åˆ†ç›®æ ‡ï¼Œä½ éœ€è¦å®‰è£…以下的软件和文件:
PHP ä¸çº§çŸ¥è¯†ã€‚
å¦‚æžœä½ æ‰“ç®—åŽ»æž„å»ºä¸€ä¸ªä¸åž‹æˆ–者大型的ä¼ä¸šçº§åº”ç”¨ï¼Œä½ éœ€è¦ä½¿ç”¨ Adobe Flex Data Services 2 (缩写为 FDS)。通过高性能的数æ®ä¼ 输,基于消æ¯çš„å‘å¸ƒè®¢é˜…æœºåˆ¶ï¼Œä»¥åŠæ›´å¤šçš„特性,FDS 实现了数æ®äº¤äº’的简å•高效。而 AMFPHP 是仅实现了一个 FDS 功能的一个å°çš„å集。如果工作于一个大型公å¸ï¼Œåœ¨æ•°æ®äº¤æ¢å±‚ä¸Šï¼Œä½ å¯èƒ½éœ€è¦è€ƒè™‘下 FDS。
实现本教程任务的关键是一个称为 AMFPHP 的项目。这个项目最开始是由 Wolfgang Hamann å¼€å§‹çš„ã€‚é¡¹ç›®å›¢é˜Ÿé€æ¸æˆé•¿ï¼ŒçŽ°åœ¨å¤§çº¦æœ‰äº”ã€å…个开å‘者。由于他们的努力工作,Flex 社区现在有了一个从 Flex å‰å°åˆ° PHP åŽå°çš„æ¡¥æ¢ã€‚
å¦‚æžœçŽ¯å¢ƒè¿˜æ²¡å‡†å¤‡å¥½ï¼Œä½ éœ€è¦åŽ»ä¸‹è½½å®‰è£… Flex 2 and AMFPHP v. 1.1 (详细信æ¯è¯·é˜…读帮助文件)ã€‚å½“ç„¶ï¼Œå¦‚æžœä½ æ²¡æœ‰è¯»è¿‡æˆ‘çš„å¦ä¸€ç¯‡æ–‡ç« ã€Šæ•´åˆ Flex 2 与 PHPã€‹ï¼Œä¹Ÿå»ºè®®ä½ åŽ»çœ‹çœ‹ã€‚
本教程ä¸ä½ 建立的这个例å将示范如何使用 Flex æ¥æ˜¾ç¤ºä¸€ä¸ªæ•°æ®åº“ä¸çš„è®°å½•ã€‚ä½ ä¸éœ€è¦åŽ»æ’入或更新任何记录,仅仅就是给用户显示数æ®ã€‚ä½¿ç”¨çš„æ˜¯å’Œä¹‹å‰æ–‡ç« ä¸çš„例å相åŒçš„æ•°æ®åº“,如果之å‰ä½ å·²ç»å»ºç«‹è¿‡äº†ï¼Œç”¨é‚£ä¸ªä¹Ÿæ²¡æœ‰é—®é¢˜ã€‚没有建立数æ®åº“çš„è¯ï¼Œå»ºç«‹å¦‚下的 MySQL 表:
CREATE TABLE 'users' (
'userid' int(10) unsigned NOT NULL auto_increment,
'username' varchar(255) collate latin1_general_ci NOT NULL,
'emailaddress' varchar(255) collate latin1_general_ci NOT NULL,
PRIMARY KEY ('userid')
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;在数æ®åº“䏿·»åŠ å‡ è¡Œæ•°æ®ã€‚å—æ®µå说明了它应该填的内容。别忘了,这个例ååªæ˜¯ä»Žæ•°æ®åº“䏿˜¾ç¤ºæ•°æ®ï¼Œå¦‚æžœä½ ä¸æ·»åŠ äº›ï¼Œä½ å°±æ²¡ä»€ä¹ˆå¯æ˜¾ç¤ºçš„了。å¯ä»¥ä½¿ç”¨ PHPMyAdmin æ¥å¾€è¡¨é‡Œæ·»åŠ æ•°æ®ã€‚
䏋颿˜¯ä¸€ä¸ªæ–°çš„ 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 æ¯”è¾ƒç†Ÿæ‚‰ï¼Œè¿™æ®µä»£ç æ˜¯ä¸æ˜¯å¾ˆç®€å•?
ç±»åè¦å’Œæ–‡ä»¶å相åŒã€‚在这个例åä¸ï¼Œæ–‡ä»¶å为 sample.php,所以类å为 sampleã€‚å½“ä¸€ä¸ªç±»åŠ è½½æ—¶ï¼Œå®ƒè¿è¡Œ sample() 函数 (类总是通过调用和类å相åŒçš„函数æ¥è¿›è¡Œåˆå§‹åŒ–),这个函数ä¸å®šä¹‰äº† AMFPHP å¯ä»¥ä½¿ç”¨çš„æ–¹æ³•。这个例åä¸ï¼Œåªæœ‰ä¸€ä¸ªæ–¹æ³•: getUsersï¼Œå¦‚åŒæè¿°ä¸æ‰€å†™çš„,它返回一个用户信æ¯åˆ—表。在这个函数ä¸ï¼Œä½ å¯ä»¥çœ‹åˆ°å®ƒçœŸçš„相当简å•: 连接到一个 MySQL æ•°æ®åº“,获得所有用户,最åŽè¿”回一个包å«ç”¨æˆ·ä¿¡æ¯çš„æ•°ç»„。
现在让我们看看å‰å°çš„应用程åºï¼Œsample.mxml,最终以 Flash çš„å½¢å¼æ˜¾ç¤ºã€‚令人惊奇的是,它仅仅需è¦å¤§çº¦ 50 行代ç 。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" creationComplete="initApplication()">
<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>
<mx:Script>
<![CDATA[
[Bindable]
public var dataProvider:Array;
import flash.net.Responder;
public var gateway : RemotingConnection;
public function initApplication()
{
gateway = new RemotingConnection( "http://localhost/flex/php/gateway.php" );
gateway.call( "sample.getUsers", new Responder(onResult, onFault));
}
public function onResult( result : Array ) : void
{
dataProvider = result;
}
public function onFault( fault : String ) : void
{
trace( fault );
}
]]>
</mx:Script>
</mx:Application>
第一行,<?xml version="1.0" encoding="utf-8"?>,声明这是一个 XML 文档。所有的 Flex 应用程åºç¬¬ä¸€è¡Œéƒ½æ˜¯è¿™å¥è¯ã€‚
第二行声明这是一个应用程åºï¼Œå¹¶ä¸”在 Flash åŠ è½½ (creationComplete) åŽè¿è¡Œ initApplication() 函数:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" creationComplete="initApplication()">
ä¸‹ä¸€éƒ¨åˆ†æ˜¯ä¸€ä¸ªç”¨æ¥æ˜¾ç¤ºç”¨æˆ·åˆ—表的 DataGrid 组件:
<mx:DataGrid dataProvider="{PHPData}">
<mx:columns>
<mx:DataGridColumn headerText="Userid" dataField="userid"/>
<mx:DataGridColumn headerText="User Name" dataField="username"/>
<mx:DataGridColumn headerText="User Email" dataField="emailaddress"/>
</mx:columns>
</mx:DataGrid>
ä¸åƒåœ¨æ–‡ç« ã€Šæ•´åˆ Flex 2 与 PHP》ä¸çš„ DataGrid 组件,这个组件显示数æ®åº“ä¸çš„全部三列信æ¯ã€‚注æ„,列åå…ƒç´ å¿…é¡»å’Œ MySQL 表ä¸çš„å—æ®µå匹é…。
以下的部分是一系列 ActionScript 指令:
<mx:Script>
<![CDATA[
[Bindable]
public var PHPData:Array;
import flash.net.Responder;
public var gateway : RemotingConnection;
public function initApplication()
{
gateway = new RemotingConnection( "http://localhost/flex/php/gateway.php" );
gateway.call( "sample.getUsers", new Responder(onResult, onFault));
}
public function onResult( result : Array ) : void
{
PHPData = result;
}
public function onFault( fault : String ) : void
{
trace( fault );
}
]]>
</mx:Script>
下é¢è¯´æ˜Žè¿™éƒ¨åˆ†çš„åŠŸèƒ½ã€‚ä»¥ä¸‹å‡ è¡Œå£°æ˜Žäº†ä¸€ä¸ªæ•°ç»„: PHPData,它å¯ä»¥ç»‘定到 ([Bindable]) MXML 对象上:
[Bindable] public var PHPData:Array;
在本例ä¸ï¼ŒPHPData 数组作为 dataProvider 被绑定到 <mx:DataGrid>。这æ„å‘³ç€ DataGrid 从 PHPData å˜é‡ä¸èŽ·å¾—æ•°æ®ï¼›æœ¬ä¾‹ä¸ï¼Œå®ƒæ˜¯ä¸€ä¸ª PHP 对象数组
以下的代ç 片æ–对于 Flex 调用 AMFPHP 是必须的:
import flash.net.Responder;
public var gateway : RemotingConnection;
public function initApplication() : void
{
gateway = new RemotingConnection( "http://localhost/flex/php/gateway.php" );
gateway.call( "sample.getUsers", new Responder(onResult, onFault));
}
public function onResult( result : Array ) : void
{
PHPData = result;
}
public function onFault( fault : String ) : void
{
trace( fault );
}
首先,代ç 导入 flash.net.Responder 包,里é¢åŒ…å«ç”¨æ¥è¿›è¡Œè¿œç¨‹è®¿é—®çš„类。实际上,Flex ä¼šåœ¨ä½ å£°æ˜Žä¸€ä¸ªæ–° Responser 时自动导入这个包。我在这写上它仅仅是为了说明它的使用。
接下æ¥ï¼Œä»£ç 定义了一个å˜é‡â€”—gateway,是一个 RemotingConnection æ•°æ®ç±»åž‹ã€‚å…¶å®žä½ å·²ç»çŸ¥é“这个 RemotingConnection æ•°æ®ç±»åž‹äº†â€”—在 Flex 应用程åºçš„ç›®å½•ä¸æœ‰ä¸ªå« RemotingConnection.as 的文件,其ä¸åŒ…å«ä»¥ä¸‹ä»£ç :
package
{
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
public class RemotingConnection extends NetConnection
{
public function RemotingConnection( sURL:String )
{
objectEncoding = ObjectEncoding.AMF0;
if (sURL) connect( sURL );
}
public function AppendToGatewayUrl( s : String ) : void
{
//
}
}
}
注æ„ç±»åè¦å’Œæ–‡ä»¶å相åŒã€‚本例ä¸ï¼Œä½ 在 NetConnection åŒ…ä¸æ·»åŠ ä¸€ä¸ªæ–°æ–¹æ³•â€”â€”AppendToGatewayUrl.
下一æ¥ï¼Œå†™äº†ä¸€ä¸ªå‡½æ•°ï¼ŒinitApplication:
public function initApplication()
{
gateway = new RemotingConnection( "http://localhost/flex/php/gateway.php" );
gateway.call( "sample.getUsers", new Responder(onResult, onFault));
}å½“ä½ çš„ç¨‹åºåŠ è½½åŽé¦–å…ˆè¿è¡Œ initApplication 函数。通过å˜é‡ gateway 建立一个新连接到 AMFPHP ä¸çš„ gateway.php 脚本。gateway.php 文件按照代ç ä¸çš„ä½ç½®è®¾ç½®ã€‚ç„¶åŽï¼Œåœ¨ä¸‹ä¸€è¡Œä¸è°ƒç”¨ sample ç±»ä¸çš„函数 getUsers (sample.getUsers)。å“åº”æ—¶ï¼Œä½ è¿è¡Œå¦‚下两个函数ä¸çš„一个: 如果一切æ£å¸¸è¿è¡Œ onResult,如果é‡åˆ°é”™è¯¯è¿è¡Œ onFault。
下é¢çš„一行将å˜é‡ result 赋值给å˜é‡ PHPData,å˜é‡ result 是由 AMFPHP ä¼ é€ç»™ ActionScript çš„:
public function onResult( result : Array ) : void
{
PHPData = result;
}
è¿™æ˜¯å½“ä½ è¿è¡Œ MySQL 查询 ($ArrayOfUsers) åŽè¿”回的 PHP 对象数组。AMFPHP å·²ç»ä¸ºä½ å°† PHP 对象数组翻译为 ActionScript 对象数组。很酷,是å§ï¼Ÿ
现在看看最åŽä¸€è¡Œ:
public function onFault( fault : String ) : void
{
trace( fault );
}
本例ä¸ï¼Œå¦‚æžœå‘生错误,æ¤å¤„就是用æ¥å¤„ç†é”™è¯¯çš„,å¯èƒ½ç»™ç”¨æˆ·æ˜¾ç¤ºä¸€æ¡ä¿¡æ¯ã€‚在这个例åä¸ï¼Œå°±æ˜¯ç®€å•çš„ trace 一下故障å˜é‡ï¼Œå½“ä½ åœ¨è°ƒè¯•æ¨¡å¼ä¸‹è¿è¡Œ Flex åº”ç”¨ç¨‹åºæ—¶ï¼Œtrace 是éžå¸¸æœ‰ç”¨çš„函数。
也许对于åˆå¦è€…è¿˜æ˜¯æœ‰äº›å¤æ‚,让我们清楚地说明下å„个文件的ä½ç½®ã€‚ä½ ä¸€å…±å»ºç«‹äº†ä¸‰ä¸ªæ–‡ä»¶ï¼Œå¦å¤–ä½ ä¸‹è½½åŠä½¿ç”¨çš„ AMFPHP æœ‰ä¸€å †æ–‡ä»¶ã€‚
è¿™æ ·ï¼Œä½ ç¼–å†™äº†ä¸€ä¸ªéžå¸¸ç®€å•的应用程åºï¼Œå®ƒæ¼”示了如何从 Flex å‰å°è¿žæŽ¥åˆ° PHP åŽå°çš„æ–¹æ³•。请è”ç³»æˆ‘ï¼Œå‘Šè¯‰æˆ‘ä½ çš„æ–°å‘现。
æˆ‘è¦æ„Ÿè°¢ Patrick Mineault å’Œ Jess Warden 对我的帮助,他们æä¾›äº†æˆ‘在这个教程ä¸ä½¿ç”¨çš„软件,并且解ç”äº†æˆ‘çš„ä¸€äº›é—®é¢˜ä½¿æˆ‘å¾—ä»¥å¼€å§‹è¿™ç¯‡æ•™ç¨‹ã€‚å¦‚æžœä½ å¯¹ä½¿ç”¨ PHP å’Œ Flex (或者 Flash) 感兴趣,å¯ä»¥åŽ»è®¿é—®ä»¥ä¸‹çš„åšå®¢:
| « | 二月 2012 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | ||||