На скоро ми се наложи да използвам AMF формата, за да прехвърлям данни от Flex към PHP към DataBase и октрих, че с AMFPHP всичко става по-лесно, по-бързо (и като писане и като прехвърляне на данни)
Може да прочетете тук : AMFPHP SITE по-обстойна информация какво представлява.
Ето и прост пример как да си нагласите AMFPHP-то и да тествате :
1.Изтеглете нужните файлове от сайта и разархивирайте.Трябва да имате папка amfphp и вътре services, etc.
2.Сложете цялата папка в директорията на локалния хост.
3.Връзката от FLex към AMFPHP ще се прави чрез gateway.php !
4.Отворете папката services и създайте нов PHP файл със следното съдържание :
<?php class AMFTestService { public function __construct() { define("MySQL_HOST", "localhost"); // server define("MySQL_USER", "user"); // user define("MySQL_PASS", "pass"); // pass define("MySQL_BASE", "database"); //database $db=@mysql_connect(MySQL_HOST, MySQL_USER, MySQL_PASS); // connectiong @mysql_query("set names utf8", $db); // za kirilicata ako prai problemi @mysql_select_db(MySQL_BASE); // selektirane na bazata danni } //pomo6tna funkciq, vru6ta masiv ot obekti za po-lesna obrabotka vuv flex private function _handleQuery($query) { $res = mysql_query($query)or die(mysql_error()); $ret = array(); while($obj = mysql_fetch_object($res)){ $ret[] = $obj; } return $ret; } //funkciqta, koqto se vika ot Flex function getSomeInfo() { $query = "SELECT pole FROM bazadanni"; return $this->_handleQuery($query); } } ?>
Както виждате това е PHP Class със следните методи :
__construct() -> конструктор метода на класа. В него се прави връзка към базата данни ( препоръчително ). Този метод се изпълнява всеки път когато се вика този клас.
private function _handleQuery($query) -> Функцията обработва заявката и връща масив от обекти, които във Flex директно се слагат във ArrayCollection.
Хубаво е да се използва, ако чрез заявката ще вземете някаква информация без да правите проверки и т.н.
function getSomeInfo() -> Тази функция се вика директно от Flex и връща директно във Flex масивът със обекти от базата данни ! Няма нужда да си цапате ръцете с XML ! Директно викане от Flex и взимане на променливи от Flex.
Следва да настроим клиента!
Създайте си нов Flex проект и сложете следният код, който е добре коментиран :
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" initialize="init()"> <mx:Script> <![CDATA[ import mx.controls.Alert; import mx.collections.ArrayCollection; // v tazi promenliva zadavame putq do gateway.php failyt, koito sluji za vruzka ! private var AMFGatewayLocation:String = "http://localhost/amfphp/gateway.php"; //promenlivate gateway 6te sudurja obekt NetConnection, //chrez koito shte se osy6testvqva vikaneto i svurzvaneto s AMFPHP private var gateway:NetConnection; // normalen ArrayCollection, koito 6te sluji za DataProvider na DataGrid componenta [Bindable] private var dp:ArrayCollection; //init funkciqta, koqto se izvikva pri startirane na prilojenieto private function init():void { gateway = new NetConnection(); // suzdavame nova instanciq na NetConnection() gateway.objectEncoding = ObjectEncoding.AMF3; //tuk kazvame objectEncoding-a da e vuv AMF vid. Ne e zaduljitelno, no e preporu4itelno gateway.connect(AMFGatewayLocation); // polzvame metoda connect() s parametur putq do gateway.php //vsi4ko e gotovo ! vurzani sme kym AMFPHP-to } //click event handler na butona //izvikvame call metoda na NetConnection obekta private function callAMF(e:MouseEvent):void { gateway.call("AMFTestService.getSomeInfo", new Responder(onResult,onFault)); /* * purviqt parametur e imeto na klasa, posledvan ot to4ka i imeto na funkciqta, koqto iskame da izvikame * vtoriqt parametur predstavlqva nov Responder obekt ili nakratko -> onResult e pri rezultat, onFault e ako e vuzniknala gre6ka * tretiqt parametur ( ne e vuveden ) predstavlqva syotvetno parametrite, koito se pra6tat kym AMFPHP, ako ima takiva Primer : ako imame v AMF Class-a funkciq : function updateUser($id,$username) { $query = "UPDATE users SET username ='$username' WHERE id = '$id'; $res = mysql_query($query); if($res) return true; else return false; } to togava call metoda 6te izglejda taka : gateway.call("AMFTestService.getSomeInfo", new Responder(onResult,onFault), idInput.text, userNameInput.text); kudeto idInput i userNameInput sa fiktivni poleta */ } // funkciqta, koqto se izpylnqva pri vurnat rezultat ot klasa private function onResult(data : Array):void { dp = new ArrayCollection(data); //suzdavame nov ArrayCollection sus vurnatiqt masiv //dp-to e vurzano kym DataGrid-a, a dataField poletata nosqt su6tite imena kato imenata na poletata v bazata danni ! //udobno, nali :) } //ako vuznikne gre6ka, 6te ni signalizira //preporu4vam vi vinagi da polzvate tozi sintaksis na funkciqta za gre6ka : private function onFault(fault : Object):void { Alert.show(fault.description); } ]]> </mx:Script> <mx:ApplicationControlBar dock="true" width="100%"> <mx:Button label="Call" click="callAMF(event)" /> </mx:ApplicationControlBar> <mx:DataGrid dataProvider="{dp}" width="100%" height="100%"> <mx:columns> <mx:DataGridColumn dataField="someFieldName" /> </mx:columns> </mx:DataGrid> </mx:Application>
Това е всичко за тази публикация. Нататък ще пускам и други хитрини за AMFPHP!
