Ако сте свикнали във Flex 3 да ползвате
Application.applicationвече кода е
FlexGlobals.topLevelApplicationРезултати от търсенето Категория: Flex
Ако сте свикнали във Flex 3 да ползвате
Application.applicationвече кода е
FlexGlobals.topLevelApplicationАко се чудите от къде да намерите добре обяснен component lifecycle за Flex SDK 3/4, може да изгледате следното клипче :
http://weblog.mrinalwadhwa.com/2009/02/17/understanding-the-flex-component-lifecycle/
От 2008-ма е, но е обяснено много добре.
Adobe са пуснали интересна статия, свързана с MMORPG игрите и Flex.
СТАТИЯТА
Пише интересни неща и се препоръчва electro-server за сървърното решение на играта.
Лично аз се бях мъчил да напиша подобие на Socket Server, но не е толкова лесно, колкото изглежда, особено ако не се занимаваш с такъв вид програмиране или пък още по-малко с JAVA.
Освен JAVA, за Socket Server може да се ползва и PHP, C++, C#, Python, но за сега повечето готови комерсиални сървари са писани на JAVA.
А за тези, които ще попитат какво е това Socket Server -> това е сървърът, чрез който дадено флаш приложение става „multiplayer“ -> чатове, игри и т.н.
Препратки :
Wiki->Socket Server
Ако сте пробвали да пращатe през Flex нещо на кирилица, ползвайки AMFPHP, със сигурност сте се натъкнали на гаден проблем. Кирилицата не се изобразява!
Всичко се оправя, като в gateway.php в AMF папката на 127ми ред смените
127 | $gateway->setCharsetHandler(каквото и да има тук); |
със
127 | $gateway->setCharsetHandler("iconv", "UTF-8", "UTF-8"); |
или енкодинг подходящ за вашата база данни.
На скоро ми се наложи да използвам 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!
Най-простият начин :
Да приемем, че скрипта се намира в localhost и се казва script.php.
Flex-a представлява TextInput поле с id myText, бутон със click event -> send(event) и httpservice деклариран по следният начин :
1 2 3 4 5 6 | <mx:HTTPService id="phpRequest" resultFormat="text" url="http://localhost/script.php" result="onResult(event)" fault="onFault(event)"> |
Целта е да пратим написаното в myText до PHP.
Имаме следният код :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private function send(e:MouseEvent):void { var sendObject:Object = new Object(); // pravim obekt sendObject.textZaPrashtane = myText.text; // pravim promenliva na tozi obekt na ime textZaPrashtane i sus stoinost myText.text phpRequest.send(sendObject); // prashtame kym scripta } private function onResult(e:flash.rpc.ResultEvent):void { Alert.show(e.result.toString()); } private function onFault(e:flash.rpc.FaultEvent):void { // pri greshka } |
И съответният PHP скрипт :
1 2 3 4 | <?php $promenliva = $_POST['textZaPrashtane']; echo $promenliva; ?> |
Ако искате да пращате още неща към PHP-то, начинът е : sendObject.oshteNeshto = „oshte nesheto za prasthane“ и така колкото искате.
Може да гледате видео уроци правени от мен, свързани с Flex на Video Tutorials .
Надявам се да ви харесва, а ако правя нещо интересно ще го качвам като обяснение и тук.
Как да си направим по-различен ъплоад от нормалните HTML форми ? И как да го направим по-сигурен ?
Ползваме нещо по-интерактивно. Flash или Flex или Silverlight или други RIA технологии.
Сега ще публикувам примерен код за ъплоад направен във Flex, а след това ще публикувам и такъв, направен във Flash. ( Silverlight, за сега няма да има ).
ДЕМО СЪС SOURCE CODE ( десен клик -> view source )
Целият source код е коментиран и съм обяснил където каквото трябва.
Може да забележите FileFilter-a, който позволява посочване само на .jpg разширение.Това спомага за сигурността ( естествено е препоръчително след това да се прави и проверка в сървърния език ).
Ако има въпроси ги задавайте в коментарите.
Ако имате опит в четенето на документацията от Adobe : FileReference , FileFilter то това ще ви е достатъчно.
Относно PHP скрипта, ползвам това :
1 2 3 4 5 | $res = move_uploaded_file($_FILES['File']['tmp_name'],$dir . $_FILES["File"]["name"]); if($res) echo "Uspeh ot scripta"; else echo"Greshka"; |
П.С. Всичко качено се трие на момента.
Чрез Alert class-a може да изкарваме PopUp прозорче, чрез което може да изпишем обикновенно съобщение или да попитаме потребителя за потвърждение на неговото действие.
Всичко това става много лесно и ще ви покажа как :
Това представлява статичния метод на Alert със всичките му параметри, чрез който се изкарва PopUp прозорчето:
show(text:String = "", title:String = "", flags:uint = 0x4, parent:Sprite = null, closeHandler:Function = null, iconClass:Class = null, defaultButtonFlag:uint = 0x4)
Подробно обяснение на параметрите :
text:String = „“: Това представлява главното съобщение, което се изписва в прозорчето.
title:String = „“ :Това представлява title текста, който се изписва в горния ляв ъгъл на прозорчето.
flags:uint = 0×4: Флаговите параметри, биват : Alert.OK, Alert.CANCEL, Alert.YES, Alert.NO. Разделят се с побитово или ( “ | “ ). Колкото от тях се придадат като параметър, толкова бутони ще излязат в Alert прозореца. Независимо в какъв ред ще ги напишете, бутоните винаги излизат в следният ред : OK, Yes, No, Cancel.( Вижте в кода на демото тяхната употреба )
parent:Sprite (default = null) : Това е displayObject-a, в който Прозорчето да се центрира. Оставено на null ще се центрира по средата на екрана.
closeHandler:Function (default = null) :Това е функцията, която се извиква след натискането/затварянето на Alert PopUp-a. Ползва се най-често за проверка на потвърждението от потребителя.
iconClass:Class :Този параметър отговаря за иконката, която се появява до текста в Alert-a. ( Вижте в кода на демото как се използва, чрез [Embed] metatag )
defaultButtonFlag:uint : Същото като flags, но този път който бутон придадете за параметър, той ще е маркиран и при натискане на Enter ще се натиска.
Демо със соурс код ! ( десен клик, view source )
Връзки :
Adobe lang ref
Извадих основните компоненти като класове в отделен .css file.
Така изглежда css-a във Flex :
1 2 3 4 5 | .volumeSlider { show-track-highlight: true; thumb-skin: Embed("assets/search-32.png"); } |
Нужно е само да си свалите арихивираният проек и да го отворите във Flex (file->Import->Flex project-> посочвате пътя за архива).
В главната директория ще намерите all_styles.css.
Също така може да променяте и външния вид през Design View.
Връзки :
Линк за сваляне(архив)
Линк за сваляне(swf)
Главна публикация