ʹÓÃ
Eclipse PDT ´´½¨Ö§³Ö¸»Ó¦ÓóÌÐòµÄ PHP ·þÎñ
Mate ÊÇÒ»¸öÇáÁ¿¼¶µÄʼþÇý¶¯¿ò¼Ü£¬¸Ã¿ò¼ÜÖ§³ÖÒÔ Model-View-Controller
(MVC) ģʽ¹¹½¨Óû§½çÃæ£¨UI£©ºÍ·þÎñ¡£±¾ÎÄѧϰÈçºÎÁªºÏʹÓà Eclipse PHP ¿ª·¢¹¤¾ß£¨PDT£©ºÍ
Flex Èí¼þ¿ª·¢¹¤¾ß£¨SDK£©¹¹½¨Ê¹Óà Mate ¿ò¼ÜµÄÓ¦ÓóÌÐò¡£±¾ÎÄÏêϸ½²½âÏÖÓÐµÄ Mate Îĵµ£¬ÒòΪËü¹Ø×¢Ê¹ÓÃ
Eclipse PDT ×÷Ϊ¹¤¾ß¡£
Adobe? Flash? ÊÇÁíÒ»ÖÖ¹¹½¨¸» Internet Ó¦ÓóÌÐò£¨RIA£©µÄºÃ·½·¨¡£Ê¹ÓÃ
Eclipse ºÍ Adobe Flex SDK£¬Äú¿ÉÒÔ½«ÏîÄ¿±àÒë½ø Flash Player ÖÐÔËÐеÄÓ¦ÓóÌÐò¡£Mate
ÊÇÒ»¸öÇáÁ¿¼¶µÄʼþÇý¶¯¿ò¼Ü£¬ËüÖ§³Öͨ¹ýµ÷Óú¯ÊýÇáËɵ÷ÓÃÔ¶³Ì¶ÔÏó¡£ÕâЩԶ³Ì¶ÔÏó¿ÉÄÜÊÇÓà PHP ±àдµÄ·þÎñ¡£
ÒªÔËÐб¾ÎÄÖеÄʾÀý£¬ÄúÐèÒª Eclipse PDT¡£±¾ÎÄ»¹½«½éÉÜÄúÐèÒªµÄÆäËû×é¼þ¡£
Mate ºÍ Flex SDK ¸ÅÊö
Flex SDK ÔÊÐíÄú¹¹½¨ Adobe Flex Ó¦ÓóÌÐò¡£Flex
Ó¦ÓóÌÐòʹÓà XML ¸ñʽºÍ ActionScript V3.0 ÓïÑÔµÄÔ´Îļþ¡£Ê¹ÓñàÒëÆ÷£¬Äú¿ÉÒÔ½« .mxml
ÎļþºÍ ActionScript Îļþ±àÒëΪ Adobe Flex Ó¦ÓóÌÐò¡£
¿ÉÒÔÏÂÔØÁ½¸ö°æ±¾µÄ Flex SDK£º
1.Adobe Free °æ°üº¬±àÒëÓ¦ÓóÌÐòµÄ Adobe ²úÆ·£¬»¹°üº¬
Adobe AIR ºÍÆäËû×é¼þ¡£Adobe Free SDK ͨ¹ý Adobe Flex SDK Ðí¿ÉÖ¤Ðí¿É£¨²Î¼û
²Î¿¼×ÊÁÏ£©¡£
2.ÁíÒ»¸ö SDK °æ±¾ÊÇ Open Source Flex SDK °æ£¬Ëü×ñÑ
Mozilla Public License (MPL) Ðí¿É¡£Ëü°üº¬Ò»¸ö±àÒëÆ÷ºÍÔËÐб¾ÎÄÖеÄʾÀýÐèÒªµÄËùÓÐ×é¼þ¡£µ«ÊÇ£¬MPL
Ðí¿É¿ÉÄÜÂú×ã²»ÁËÄúµÄÐèÒª¡£×ÉѯÄúµÄ·¨Âɲ¿ÃÅ£¬ÑéÖ¤Õâ¸öÐí¿ÉÊÇ·ñÊÊÓá£
ÁíÍ⣬Adobe Ìṩһ¸ö³ÆÎª Flex Builder µÄ²úÆ·£¬Äú¿ÉÒÔ½«Æä×÷Ϊһ¸ö
Eclipse ²å¼þ»òÕß×÷Ϊһ¸öÍêÕûµÄ²úÆ·ÏÂÔØ¡£ÎªÔËÐб¾ÎÄÖеÄʾÀý£¬ÇëÏÂÔØ¿ªÔ´ Flex SDK¡£ÏÂÔØ
ZIP Îļþ²¢½«Æä½âѹËõµ½Ò»¸ö¼òµ¥Ò׼ǵı¾µØÎ»Ö㬱¾ÎĽ«Õâ¸öλÖóÆÎª FLEX_HOME¡£±¾ÎĽ«ÑÝʾÈçºÎʹÓÃÕâ¸öÃâ·Ñ
SDK ÉèÖà Eclipse£¬ÒÔ±ãÄú¿ÉÒÔֻʹÓà Eclipse¡¢PDT ºÍ Flex SDK ¹¹½¨ RIA¡£
Mate ÊÇÒ»¸ö°ïÖúÄú¹¹½¨×ñÑ MVC ģʽµÄÓ¦ÓóÌÐòµÄ¿ò¼Ü¡£Mate
ÒÔʼþÇý¶¯£¬Òò´ËÄúÐèÒª´´½¨Ò»Ð© ActionScript Ààʼþ¡£È»ºó½«ÕâЩʼþÓ³Éäµ½Ô¶³Ì¶ÔÏóµ÷Óã¬ÒԱ㽫´úÂëϸ½ÚÖÃÓÚÊÓͼºÍÄ£ÐÍÖ®Íâ¡£
´´½¨ÏîÄ¿½á¹¹
ÔÚ±¾ÎÄÖУ¬Ò»¸ö¼òµ¥µÄʱ¼äÊäÈëÓ¦ÓóÌÐò ¡ª ³ÆÎª ChronoLog ¡ª
½«ÑÝʾÈçºÎʹÓà PHP ·þÎñ¹¹½¨Ò»¸ö Flex UI¡£Õâ¸öʾÀýÐèÒªÔÚÄúµÄ Eclipse ¹¤×÷¿Õ¼äÖн¨Á¢Á½¸öÏîÄ¿£ºÒ»¸öÊÇ
PHP ÏîÄ¿£¬ÓÃÓÚ·þÎñ£»ÁíÒ»¸öÊÇÆÕͨÏîÄ¿£¬Ëü°üº¬Ò»¸ö×÷Ϊ Ant ¹¹½¨Æ÷½¨Á¢µÄ Ant Îļþ¡£Õâ¸ö Ant
¹¹½¨Æ÷ÓÃÓÚÖ´ÐÐ Flex ±àÒëÆ÷£¬ÒÔ±àÒëÓÃÓÚ UI µÄÏîÄ¿¡£
Òª´´½¨·þÎñ PHP ÏîÄ¿£¬´Ó Eclipse ²Ëµ¥ÖÐÑ¡Ôñ File >
New > Project¡£Ñ¡Ôñ PHP Project£¬È»ºóÑ¡Ôñ Create project
from existing source ²¢ÔÚÎļþ·þÎñÆ÷µÄÎĵµ¸ùĿ¼ÏÂÑ¡ÔñÒ»¸öλÖá£Õ⽫ÔÊÐíÄú¿ìËÙ²âÊÔËù´´½¨µÄ
PHP ·þÎñ¡£
Òª´´½¨ UI ÏîÄ¿£¬Ê¹Óà File > New > Project
²¢Ñ¡Ôñ Project ´´½¨Ò»¸ö¿ÕÏîÄ¿¡£
´´½¨Õâ¸ö UI ÏîÄ¿ºó£¬´´½¨Ò»¸öÃûΪ src µÄÎļþ¼Ð£¬²¢ÔÚ¸ÃÎļþ¼ÐÖд´½¨Ò»¸öÎļþ¼Ð
chronolog¡£ÔÚ chronolog Îļþ¼ÐÏ£¬·Ö±ð´´½¨ events¡¢model¡¢views ºÍ
maps Îļþ¼Ð¡£Õâ¸öÏîÄ¿µÄ½á¹¹ÈçÏÂͼËùʾ¡£

ͼ 1. UI ÏîÄ¿½á¹¹
ÏÂÔØ²¢°²×° Mate
Mate ÏÂÔØÎļþÊÇÒ»¸öÒѱàÒëÎļþ£¬À©Õ¹ÃûΪ .swc¡£´ÓÏà¹ØÕ¾µãÏÂÔØÕâ¸öÎļþ£¬°²×°·½·¨Êǽ«Æäµ¼ÈëÕâ¸ö
UI ÏîÄ¿ÖÐµÄ libs Îļþ¼Ð¡£½á¹ûÈçͼ 2 Ëùʾ¡£

ͼ 2. libs Îļþ¼ÐÖÐµÄ Mate
.swc Îļþ
¹¹½¨Ò»¸ö¼òµ¥µÄ·þÎñ
Õâ¸ö·þÎñÓà PHP ±àд£¬Ö»ÓµÓÐÁ½¸öÀࣺһ¸öÊÇÖ´Ðк¯ÊýµÄ·þÎñÀ࣬һ¸öÊÇ
TimeEntry UI ÀàÓ³Éäµ½µÄ PHP Àà¡£
±àдÕâЩ·þÎñÀà֮ǰ£¬ÏÂÔØ²¢°²×°ÐèÒªµÄ AMFPHP Îļþ¡£ÒªÔËÐÐÕâ¸öʾÀý£¬Ö»Ð轫 amfphp Îļþ¼Ð°²×°µ½ÄúµÄ
PHP ÏîÄ¿ÖУ¨ÈçÏÂËùʾ£©¡£

ͼ 3. amfphp Îļþ¼Ð
Õâ¸ö·þÎñÀàÏÔʾÔÚ Çåµ¥ 1 ÖС£Õâ¸ö·þÎñÀàÖ»ÊÇÔÚÒ»¸öÁÙʱλÖÃÖÐÒÔÒ»¸ö XML СÎļþµÄÐÎʽд³öһЩֵ¡£ÔÚÄúµÄ¼ÆËã»úÉÏ£¬ÄúÒ²ÐíÐèÒªÐÞ¸ÄÕâ¸öλÖ㨴ÖÌ壩£¬ÒÔ±ãËüÄܹ»±»³É¹¦Ð´³ö¡£ÄúÐèÒª½«Ëü¸ü¸ÄΪһ¸öÄܹ»±»ÄúµÄ
Web ·þÎñÆ÷¶ÁдµÄÎļþµÄÃû³Æ¡£
Çåµ¥ 1. amfphp/services/ChronoLogManager.php Îļþ
<?php require_once('./vo/TimeEntry.php'); /* * A service for managing time entries. */ class ChronoLogManager {
public function saveTimeEntry($entry)
{
$myFile = "/tmp/time.xml";
$fh = fopen($myFile, 'w') or die("can't open
file");
$stringData = "<projects>";
$stringData .= "<entry project=\"$entry->project\"
" .
"time=\"$entry->time\" user=\"$entry->username\"
/>";
$stringData .= "</projects>";
fwrite($fh, $stringData);
fclose($fh);
}
}
?> |
·þÎñ·½Ä£ÐͶÔÏó TimeEntry.php ÏÔʾÔÚ Çåµ¥ 2 ÖС£AMFPHP ÒªÇóÖµ¶ÔÏó´æ´¢ÔÚ services/vo
Îļþ¼ÐÖУ¬Òò´Ë£¬Õâ¸ö PHP ÎļþÏà¶ÔÓÚ PHP ÏîÄ¿µÄ¸ùĿ¼µÄÏà¶Ô·¾¶Ãû³ÆÊÇ amfphp/service/vo/TimeEntry.php¡£AMFPHP
ÒªÇóÀàÃûºÍÎļþÃû£¨²»°üº¬À©Õ¹Ãû£©Ò»Ö¡£
Çåµ¥ 2. amfphp/services/vo/TimeEntry.php Îļþ
<?php class TimeEntry { var $_explicitType = 'model.TimeEntry';
public $username;
public $project;
public $time;
}
?> |
ʹÓÃÀà×÷Ϊ²ÎÊý¶ÔÏóÒÔ´úÌæ¶à¸ö²ÎÊýµÄºÃ´¦ÊÇ£¬Èç¹ûÕâ¸öʱ¼äÊäÈë×Ö¶ÎÒªÌí¼Ó¸ü¶à×ֶΣ¬Ö»ÐèÏòÕâ¸ö¶ÔÏóÌí¼ÓÒ»¸öÐÂ×ֶΡ£µ«Ò²ÓÐÒ»¸ö»µ´¦£¬Ê¹Óü´Ê±Í¨Ñ¶¿ò¼ÜʱÓöµ½µÄÈκÎÎÊÌâ¿ÉÄÜ»á°éËæ¸´ÔÓµÄÀàÐÍ·¢Éú¡£ÓÐʱ£¬¼òµ¥µÄÀàÐÍ£¨×Ö·û´®¡¢ÕûÊýºÍ²¼¶ûÐÍ£©¸üÈÝÒ×ʹÓã¬ÒòΪËüÃDz»ÈÝÒ׳öÎÊÌâ¡£
ʹÓÃÒ»¸öÄ£ÐͶÔÏó
Ä£ÐͶÔÏóÊÇÒ»¸ö ActionScript À࣬ËüЯ´øÓ¦ÓóÌÐòÖеÄÊý¾Ý²¢Ó³Éäµ½
PHP ·þÎñ²ãÖеÄÒ»¸öÔ¶³Ì¶ÔÏó£¨TimeEntry.php£©¡£Äú¿ÉÒÔ½«Õâ¸ö¶ÔÏó×÷Ϊһ¸ö·½·¨ ¡ª »òÒ»¸ö·½·¨µÄ½á¹û
¡ª µÄ²ÎÊý£¬¶øÎÞÐë¹¹½¨Êý×éÔÚ UI ºÍ·þÎñÖ®¼ä´«µÝÊý¾Ý¡£
ͨ³££¬ÓÃÒ»ÖÖ¼¼Êõ¹¹½¨ UI£¬ÓÃÁíÒ»ÖÖ¼¼Êõ¹¹½¨·þÎñʱ£¬Äú±ØÐè±àд»òÕÒµ½Ò»¸ö¿ò¼Ü£¬ÒÔÁ½ÖÖ¼¼Êõ¶¼Àí½âµÄijÖÖ¸ñʽÐòÁл¯ÕâЩÀà¡£¾³£Ê¹ÓÃ
XML£¬ÒòΪͨ³£ºÜÈÝÒ×ÕÒµ½ÓÃÏÖ´ú±à³ÌÓïÑÔ±àдµÄ¡¢¶Áд XML µÄ¹¤¾ß¡£
ÔÚÕâ¸öÓ¦ÓóÌÐòÖУ¬AMFPHP ÓÃÓÚ½« Flex ¶ÔÏóÓ³Éäµ½Ô¶³Ì PHP
¶ÔÏó¡£Adobe Message Format (AMF) ÊÇ Adobe ÓÃÓÚÐòÁл¯ºÍ·´ÐòÁл¯¶ÔÏóµÄ¸ñʽ¡£Ê¹ÓÃ
AMF µÄÒ»¸öºÃ´¦ÊÇËüÔÊÐíÄúÁ¬½ÓÕâЩ¶ÔÏó£¬ÎÞÐè×Ô¼º±àдÔÚ UI ºÍ·þÎñÖ®¼äÐòÁл¯ºÍ·´ÐòÁл¯µÄ´úÂë¡£Óм¸¸ö¿ò¼ÜÓÃÓÚͨ¹ý
AMF Á¬½Ó Flex ºÍ PHP£¬ÆäÖÐÒ»¸öÀ´×Ô Zend£¨¼û ²Î¿¼×ÊÁÏ£©¡£
Çåµ¥ 3 ÖÐÏÔʾÁË TimeEntry µÄÄ£ÐͶÔÏ󣨰üº¬Ã¿¸öʱ¼äÊäÈë×ֶεÄÐÅÏ¢£©¡£½«Ëü´æ´¢µ½
UI ÏîÄ¿µÄ src/chronolog/model Îļþ¼ÐÖС£
Çåµ¥ 3. src/chronolog/model/TimeEntry.as
Îļþ
package model { [Bindable] [RemoteClass(alias='TimeEntry')] public class TimeEntry { private var _username : String; private var _project : String; private var _time : String; public function TimeEntry() { } public function get username() : String { return _username; } public function set username(value : String) : void { _username = value; } public function get project() : String { return _project; } public function set project(value : String) : void { _project = value; } public function get time() : String { return _time; } public function set time(value : String) : void { _time = value; }
}
} |
³ýÁËÔÚÕâ¸öÀàÖÐÉùÃ÷µÄ RemoteObject ÊôÐÔÍ⣬Õâ¸öÀà¾ÍÏñÄú´´½¨À´Ö§³ÖÓ¦ÓóÌÐòµÄÆäËû ActionScript
ÀàÒ»Ñù¡£
¹¹½¨Ò»¸öʼþ
Mate ÊÇÒ»¸öʼþÇý¶¯µÄ¿ò¼Ü£¬Òò´ËʹÓà Mate ʱҪ´´½¨Ðí¶àʼþ¡£Ò»¸ö Mate ʼþÊÇÒ»¸ö ActionScript
À࣬Ëü´Ó»ù flash.events.Event ÀàÀ©Õ¹¶øÀ´¡£Ò»¸ö×Ö·û´®³£Á¿Ê¶±ðÒ»¸öÌØ¶¨Ê¼þ£¬Ò»¸öʼþÀàÖпÉÒÔÓÐÒ»¸ö»ò¶à¸ö³£Á¿¡£ÎÒʹÓÃÕâ¸ö¹¦ÄÜÀ´¸ù¾ÝʼþÔÚÒµÎñÁìÓòÖеÄÄ¿µÄ¶Ôʼþ·Ö×é¡£ÀýÈ磬ÔÚÕâ¸ö
ChronoLog ʾÀýÖÐÓÐÒ»¸ö TimeEntryEvent Àà¡£Õâ¸öÀàʹÓó£Á¿ SAVE£¬Õâ¸ö³£Á¿±íʾһ¸öʼþ½«´¥·¢Ò»¸ö´æ´¢Ê±¼äÊäÈëµÄº¯Êý¡£Ëæ×ÅÏîÄ¿·¢Õ¹£¬Õâ¸öÀàÖпÉÄܰüÀ¨¸ü¶àʼþ£¬±ÈÈç
GET »ò DELETE¡£
ʹÓÃÒµÎñÊõÓïÃüÃûÄúµÄʼþ²¢½«ËüÃÇÓ³Éäµ½ÒµÎñº¯Êý¡£²»Òª´´½¨³ÆÎª ButtonEvent µÄʼþÀ࣬Ҳ²»ÒªÌí¼Ó³ÆÎª
SAVE_CLICKED µÄ³£Á¿¡£·ñÔò£¬Äú½«Ê¹Óò»ºÃµÄÃüÃû·½·¨£¬´Ó¶øÏÞÖÆÁËʼþµÄÖØÓá£Èç¹ûÓû§¸Ä±äÖ÷ÒâÇÒ°´Å¥¸ÄΪһ¸öÁ´½Ó£¬ÕâÖÖÃüÃû·½·¨½«µ¼ÖÂÄÇЩ¹ýÓÚ½ôÃܵذ󶨵½
UI µÄʼþ³öÏÖÎÊÌâ¡£
Çåµ¥ 4 ÖÐÏÔʾÁË TimeEntryEvent ActionScript ÀàµÄÒ»¸öʾÀý¡£³ýÁËÌí¼Ó SAVE
³£Á¿Ö®Í⣬¹¹ÔìÆ÷ÖÐµÄ bubbles ²ÎÊýµÄĬÈÏÖµ¸ü¸ÄΪ true¡£ÎÒΪÕâ¸öʼþÌí¼ÓÁËÒ»¸öÀàÐÍΪ¹«¹²±äÁ¿µÄ²ÎÊý
TimeEntry¡£
Çåµ¥ 4. src/chronolog/events/TimeEntryEvent.as Îļþ
package events { import flash.events.Event; import model.TimeEntry;
public class TimeEntryEvent extends Event
{
public static const SAVE : String = 'TimeEntryEvent_SAVE';
public var entry : TimeEntry;
public function TimeEntryEvent(type:String, bubbles:Boolean=true,
cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
} |
¹¹½¨Ò»¸öÊÓͼ
³ýÁË ActionScript À࣬UI ÏîÄ¿ÖÐµÄÆäÓàÎļþ¶¼ÊÇ Flex ×é¼þ¡£ÕâЩ×é¼þ·ÅÖÃÔÚÀ©Õ¹ÃûΪ
.mxml µÄÎļþÖС£MXML ÎļþÊǸñʽÁ¼ºÃµÄ XML Îļþ£¬ËùÒÔÎÒ½«ËüÃÇÔÚ Eclipse ÖйØÁªµ½
XML ±à¼Æ÷£¬ÒÔÀûÓà XML ±à¼Æ÷µÄ¹¦ÄÜ£¬±ÈÈç¸ñʽ»¯ºÍ±ê¼Ç±ÕºÏ¡£Òª´´½¨ MXML Îļþ£¬Ñ¡Ôñ File
> New > File ²¢¸øÎļþÒ»¸öÊʵ±µÄÃû³Æ¡£
¶ÔÓÚ UI£¬Ö÷³ÌÐòÎļþ£¨main.mxml£©Ö»°üº¬¶ÔÖ÷ EventMap ºÍ¶ÔÊÓͼµÄÒýÓá£Õâ¸ö main.xml
µÄÔ´ÔÚÇåµ¥ 5 ÖÐÏÔʾ£¬main.mxml Îļþ´æ´¢ÔÚÕâ¸ö UI ÏîÄ¿µÄ src/chronolog Îļþ¼ÐÖС£
Çåµ¥ 5. src/chronolog/main.mxml Îļþ
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:maps="maps.*" xmlns:views="views.*"> <mx:ViewStack> <views:DetailView id="detailView" /> </mx:ViewStack> </mx:Application> |
ÊÓͼ detailView ÊÇÒ»¸ö Flex ×é¼þ£¬ËüÀ©Õ¹ Flex Panel ¶ÔÏó¡£Õâ¸öÊÓͼµÄÕû¸öÄÚÈÝÔÚÏÂÃæÏÔʾ¡£
Çåµ¥ 6. src/chronolog/views/DetailView.mxml Îļþ
<?xml version="1.0" encoding="utf-8"?> <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" width="100%" height="100%" xmlns:mate="http://mate.asfusion.com/"> <mx:Script> <![CDATA[ import com.asfusion.mate.events.ResponseEvent; import mx.controls.Alert; import model.TimeEntry; import events.TimeEntryEvent; [Bindable] public var entry : TimeEntry; private function save() : void { entry = new TimeEntry(); entry.username = 'jdoe'; entry.project = projectInput.text; entry.time = timeInput.text; } private function handleResult(event : ResponseEvent) : void { Alert.show('Success!'); } private function handleFault(event : ResponseEvent) : void { Alert.show(event.fault.toString()); } ]]> </mx:Script> <mx:HBox> <mx:FormItem label="Project Number"> <mx:TextInput id="projectInput" /> </mx:FormItem> <mx:FormItem label="Time"> <mx:TextInput id="timeInput" /> </mx:FormItem> <mx:Button label="Save" click="save()" /> </mx:HBox> </mx:Panel> |
Õâ¸öÊÓͼ°üº¬Á½¸ö×ֶκÍÒ»¸ö°´Å¥¡£ÕâЩ×Ö¶ÎÊÇÏîÄ¿±àºÅºÍÒ»¸ö±íʾÒѹ¤×÷ʱ¼äµÄÖµ¡£Ò»¸öÓû§Ãû£¨ËüÒ²ÓÃÓÚÕâ¸öʱ¼äÊäÈë×ֶΣ©ÊÇÓ²±àÂëµÄ¡£Ëæ×ÅÓ¦ÓóÌÐòÔËÐУ¬Óû§ÃûÀ´×ÔÓû§µÇ¼¸Ã³ÌÐòʱ»ñÈ¡µÄÊý¾Ý¡£½«Õâ¸öÊÓͼ×÷Ϊһ¸ö
MXML Îļþ±£´æÔÚ views Îļþ¼ÐÖУ¬ÃûΪ DetailView.mxml¡£
¹¹½¨ EventMap
Ò»¸öÀ©Õ¹ Mate µÄ EventMap µÄ×é¼þÓÃÓÚ½«Ê¼þÓ³Éäµ½¶¯×÷£¬ÕâÊǽ«Ê¼þÁ´½Óµ½Ô¶³Ì¶ÔÏó¡£ÁíÍ⣬EventMap
¿ÉÒÔÓÃÓÚʹʼþÔÚ½áÊøÊ±µ÷ÓÃÆäËûʼþ£¬ÉèÖñ¾µØ¶ÔÏóÉϵÄÖµ£¬ÒÔ¼°ÔÚ±¾µØÆô¶¯·½·¨¡£
Ó¦ÌØ±ðÖ¸³öµÄÊÇ£¬Á´½Óʼþ¹¦ÄÜÇ¿´ó¡£Í¨¹ýÁ´½Óʼþ£¬Äú¿ÉÒÔ±ÜÃâ¶ÔÐí¶à½»»¥½øÐÐÓ²±àÂ룬ʹÏîÄ¿¸üÊÊÓ¦²»¶Ï±ä»¯µÄÒµÎñÐèÇó¡£ÀýÈ磬Èç¹ûÓû§Ï£ÍûÔڳɹ¦±£´æÊý¾Ýºó½çÃæ±äΪÁíÒ»¸öÊÓͼ£¬Äú¿ÉÒÔ´´½¨Ò»¸ö
NavigateEvent À´ÊµÏÖÕâÖÖ¸ü¸Ä¡£TimeEntry.SAVE ʼþÄܹ»µ÷Óà NavigateEvent¡£ÕâÑù£¬Èç¹ûÓû§ÉÔºó¸Ä±äÖ÷Ò⣬ÄúÖ»Ðè¸üÐÂ
EventMap À´·´Ó³ÐµÄÐèÇó¡£
Çåµ¥ 7 ÖÐÏÔʾÁË MainEventMap µÄÒ»¸öʾÀý¡£ËüÖ»ÊÇÔÚ maps Îļþ¼ÐÖд´½¨µÄÒ»¸ö .mxml
Îļþ¡£
Çåµ¥ 7. src/chronolog/maps/MainEventMap.mxml Îļþ
<?xml version="1.0" encoding="utf-8"?> <mate:EventMap xmlns:mate="http://mate.asfusion.com/" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ import events.TimeEntryEvent; ]]> </mx:Script> <mate:EventHandlers type="{TimeEntryEvent.SAVE}"> <mate:RemoteObjectInvoker destination="amfphp" source="ChronoLogManager" method="saveTimeEntry" arguments="{event.entry}"> <mate:resultHandlers> <mate:ServiceResponseAnnouncer type="result" /> </mate:resultHandlers> <mate:faultHandlers> <mate:ServiceResponseAnnouncer type="fault" /> </mate:faultHandlers> </mate:RemoteObjectInvoker> </mate:EventHandlers> </mate:EventMap> |
ÔÚ EventMap ÖУ¬RemoteObjectInvoker °üº¬½«Ê¼þÀàÐÍ TimeEntryEvent.SAVE
Ó³Éäµ½Ô¶³Ì¶ÔÏó£¨ChronoLogManger£©ÉϵÄÕýÈ··½·¨£¨saveTimeEntry£©µÄÐÅÏ¢¡£RemoteObjectInvoker
ÊäÈ뻹ָ¶¨²ÎÊý ¡ª{event.entry} ¼Ç¼µÄʼþµÄÊäÈë×ֶΡ£Ä¿±ê amfphp ÊÇÔÚ services-config.xml
ÎļþÖÐÖ¸¶¨µÄÄ¿±êµÄ ID¡£
´´½¨ EventMap Ö®ºó£¬½«Ëü°üº¬µ½Ö÷³ÌÐòÖУ¨ÈçÇåµ¥ 8 Ëùʾ£©¡£
Çåµ¥ 8. main.mxml ÎļþÖÐµÄ MainEventMap
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:maps="maps.*" xmlns:views="views.*"> <maps:MainEventMap id="eventMap" /> <mx:ViewStack> <views:DetailView id="detailView" /> </mx:ViewStack> </mx:Application> |
·Ö·¢ÊÓͼÖеÄʼþ
ʹÓà Mate ¿ÉÒÔÒÔ¶àÖÖ·½Ê½·Ö·¢Ê¼þ¡£Äú¿ÉÒÔʹÓÃÔÚÿ¸ö×é¼þÖгöÏֵķַ¢Æ÷¡£Ò²¿ÉÒÔʹÓà Mate µÄ
Dispatcher£¬Õâ¸ö ChronoLog Ó¦ÓóÌÐòʹÓõľÍÊÇ Dispatcher¡£Ê¹Óà Dispatcher
µÄÒ»¸öºÃ´¦ÊÇÄú¿ÉÒÔ½«Ê¼þÉϵIJÎÊýÇáËÉÉèÖÃΪ±¾µØÖµ£¨±ÈÈçÎı¾ÊäÈ룩£¬¶øÎÞÐè±àдÈκΠActionScript
´úÂëÀ´Íê³ÉÕâ¸öÈÎÎñ¡£¶øÇÒ£¬Ê¹Óà Dispatcher ¿ÉÒÔÉèÖÃÔÚʼþ½áÊøÊ±Ö´Ðз½·¨¡£
Õâ¸ö Dispatcher ÔÚÏÂÃæµÄ´úÂëÖÐÓôÖÌåÏÔʾ¡£
Çåµ¥ 9. ÔÚ src/chronolog/views/DetailView.mxml ÎļþÖÐÏÔʾµÄ
Dispatcher
<?xml version="1.0" encoding="utf-8"?> <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" width="100%" height="100%" xmlns:mate="http://mate.asfusion.com/"> <mx:Script> <![CDATA[ import com.asfusion.mate.events.ResponseEvent; import mx.controls.Alert; import model.TimeEntry; import events.TimeEntryEvent; [Bindable] public var entry : TimeEntry; private function save() : void { entry = new TimeEntry(); entry.username = 'jdoe'; entry.project = projectInput.text; entry.time = timeInput.text; saveDispatcher.generateEvent(); } private function handleResult(event : ResponseEvent) : void { Alert.show('Success!'); } private function handleFault(event : ResponseEvent) : void { Alert.show(event.fault.toString()); } ]]> </mx:Script> <mx:HBox> <mx:FormItem label="Project Number"> <mx:TextInput id="projectInput" /> </mx:FormItem> <mx:FormItem label="Time"> <mx:TextInput id="timeInput" /> </mx:FormItem> <mx:Button label="Save" click="save()" /> </mx:HBox> <mate:Dispatcher id="saveDispatcher" generator="{TimeEntryEvent}" type="{TimeEntryEvent.SAVE}"> <mate:eventProperties> <mate:EventProperties entry="{entry}" /> </mate:eventProperties> <mate:ServiceResponseHandler result="handleResult(event)" fault="handleFault(event)" /> </mate:Dispatcher> </mx:Panel> |
µ÷Ó÷þÎñ
Òªµ÷Ó÷þÎñ£¬ÄúÐèÒªÔÚ services-config.xml ÎļþÖÐµÄ AMFPHP ·þÎñÅäÖÃÎļþÖн¨Á¢
PHP Àà¡£services-config.xml Îļþ°üº¬·þÎñµÄ¶Ëµã URL£¬Õâ¸ö URL ÊÊÓÃÓÚÖ§³Ö
AMF µÄ¿ò¼Ü¡£services-config.xml ÎļþµÄʾÀýÈçÏÂËùʾ¡£
Çåµ¥ 10. src/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"
class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://localhost/chronolog/amfphp/gateway.php"
class="flex.messaging.endpoints.AMFEndpoint"
/>
</channel-definition>
</channels>
</services-config> |
×¢Ò⣬ÄúÐèÒª½« AMFPHP ʹÓõÄÍø¹Ø URL ¸ü¸ÄΪÄúµÄ»·¾³Ê¹ÓõÄÖµ¡£
¹¹½¨ÏîÄ¿
ËùÓÐ Flex Îļþ¾ÍÐ÷ÒÔºó£¬Ant ¹¹½¨Æ÷ʹÓà Flex SDK ×Ô´øµÄ mxml.jar Îļþ±àÒëÏîÄ¿¡£Õâ¸ö
Ant ÎļþÈçÏÂËùʾ¡£
Çåµ¥ 11. build.xml Îļþ
<?xml version="1.0"?> <project name="chronologUI" basedir="." default="build"> <property name="flex.home" value="/home/ngood/bin/flex3-sdk" /> <property name="mxmlc.jar" value="${flex.home}/lib/mxmlc.jar" /> <property name="project.home" value="${basedir}" /> <property name="project.src" value="${project.home}/src" /> <property name="build.out" value="${project.home}/bin" /> <target name="build"> <java jar="${mxmlc.jar}" fork="true" failonerror="true"> <jvmarg value="-Xms256m"/> <jvmarg value="-Xmx256m"/> <arg value="-compiler.source-path=${project.src}" /> <arg value="+flexlib=${flex.home}/frameworks" /> <arg value="-compiler.library-path+=${project.home}/libs/Mate_08_8_1.swc" /> <arg value="-file-specs=${project.src}/chronolog/main.mxml" /> <arg value="-locale=en_US" /> <arg value="-services=${project.src}/services-config.xml" /> <arg value="-compiler.strict=true" /> <arg value="-warnings=false" /> <arg value="-output=${build.out}/chronolog.swf" /> </java> </target> </project> |
build.xml ÎļþÌí¼Óµ½ÏîĿ֮ºó£¬°´ÕÕÒÔϲÙ×÷·½·¨Ìí¼ÓÒ»¸ö Ant Builder£º´Ó Project
Explorer Ñ¡Ôñ chronologUI ÏîÄ¿£¬È»ºóÑ¡Ôñ Project > Properties£»´Ó
Properties ´°¿Úµ¥»÷ New£»´ÓÁбíÖÐÑ¡Ôñ Ant Builder£»ÔÚÏÂÒ»¸ö½çÃæÖУ¨¼û ͼ 4£©£¬µ¥»÷
Browse Workspace ÒÔ²éÕÒ²¢Ñ¡Ôñ build.xml Îļþ¡£Õâ¸ö¹¹½¨Æ÷°²×°³ÌÐò×Ô¶¯Ê¹ÓÃĬÈÏÄ¿±ê£¬Òò´ËÄú¿ÉÒÔµ¥»÷
Finish ¹Ø±Õä¯ÀÀÆ÷¡£Òª»ñÈ¡¹ØÓÚ´´½¨×Ô¼ºµÄÏîÄ¿¹¹½¨Æ÷µÄ¸üÏêϸµÄ˵Ã÷£¬Çë²Î¼û ²Î¿¼×ÊÁÏ¡£

ͼ 4. ´´½¨ Ant ¹¹½¨Æ÷
ÏÖÔÚ¹¹½¨Æ÷ÒѾÌí¼Óµ½ÏîÄ¿ÖУ¬Ö»Ðè´Ó Eclipse ÖеIJ˵¥ÖÐÑ¡Ôñ Project > Build
¾Í¿ÉÒÔÔËÐÐËü¡£
ÓÉÓÚÕâ¸öʾÀýʹÓà AMFPHP£¬±ØÐëÓÐÒ»¸ö AMF Ŀ¼ÒÔÖ§³Ö AMFPHP ¿ò¼Ü¡£¹ØÓÚÈçºÎ½¨Á¢ºÍ°²×°
AMFPHP µÄ¸ü¶àÐÅÏ¢Çë²Î¼û ²Î¿¼×ÊÁÏ¡£
ÔËÐÐʾÀý
¹¹½¨Õâ¸ö UI ÏîÄ¿ºó£¬½« chronolog.swf Îļþ·ÅÖõ½ÄúµÄ Web ä¯ÀÀÆ÷µÄÎĵµ¸ùĿ¼֮Ï£¬²¢ÔÚä¯ÀÀÆ÷Öе¼º½µ½¸ÃÎļþ£¨ÈçÏÂͼËùʾ£©¡£

ͼ 5. ÔËÐÐÍê³ÉºóµÄÓ¦ÓóÌÐò
µ±ÄúÊäÈëÊý¾Ý²¢µ¥»÷ Save Ö®ºó£¬·þÎñ²ã½«°ÑÊý¾Ýдµ½ÔÚ·þÎñÖÐÖ¸¶¨µÄλÖÃÖеÄÒ»¸ö XML СÎļþ¡£
½áÊøÓï
ʹÓà Flex SDK¡¢Mate ºÍ PHP ¿ÉÒÔ¹¹½¨¸» Web Ó¦ÓóÌÐò¡£Ö»Ðè¶Ô
Eclipse ÏîÄ¿ÉèÖýøÐÐһЩ΢µ÷£¬Äú¾Í¿ÉÒÔʹÓà Flex SDK °üº¬µÄ Flex Builder
ÔÚ Eclipse Öй¹½¨ Flex Ó¦ÓóÌÐòÁË£¬¾¡¹Ü Flex Builder µÄ WYSIWYG UI
±à¼ºÍµ÷ÊÔ¹¦ÄÜʹ¹¹½¨ Flex Ó¦ÓóÌÐò¸ü¼ÓÈÝÒס£
ʹÓà Eclipse PDT ºÍ AMFPHP£¬Äú¿ÉÒÔ¹¹½¨¹© Flex
Ó¦ÓóÌÐòʹÓõķþÎñ¡£Ô¶³ÌÏîÄ¿£¨Ê¹Óà AMF£©ÔÊÐíÄú¿ìËÙ±àд´Ó Flex µ÷ÓÃÔ¶³Ì¶ÔÏóÉϵķ½·¨µÄʼþ¡£ |