Создание сайта Винница, Заказать сайт Винница, купить сайт Винница, Разработка сайта Винница, продвижение сайта Винница, сопроводжение сайта Винница

 Русский

Создание сайтов любой сложности WEB - студия Tehno-Team

Flash

Взаемодействие Flash-PHP, javascript-PHP

Поделиться:
Facebook Vkontakte Twitter LiveJournal

Во многих играх при создании сайтов в клиент-серверном взаимодействии часто приходится создавать протокол общения между Flash, PHP и javascript. В этой статье я постараюсь описать основные принципы работы этого механизма на примере обмена данными php-flash.

Итак, в процессе создания сайта в начале создадим на стороне Flash-приложения класс посылки-приема данных.

package

{

               

                import com.adobe.serialization.json.JSON;

                import flash.display.*;

                import flash.events.Event;

                import flash.events.HTTPStatusEvent;

                import flash.events.IEventDispatcher;

                import flash.events.IOErrorEvent;

                import flash.events.ProgressEvent;

                import flash.events.SecurityErrorEvent;

                import flash.net.*;

               

                public class WebAPI

                {             

                                private var _callback:Function;

                                private var _online:Boolean=false;

                                public function WebAPI()

                                {

                               

                                }

 

//############################# EVENTS #################################

                                private function configureListeners(dispatcher:IEventDispatcher):void

                                {

dispatcher.addEventListener(Event.OPEN, openHandler);

dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);

dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);

dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);

                                                dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

dispatcher.addEventListener(Event.COMPLETE, completeHandler);

}

 

                                private function openHandler(event:Event):void

                                {

trace("openHandler: " + event);

}

 

                                private function progressHandler(event:ProgressEvent):void

                                {

trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);

}

 

                                private function securityErrorHandler(event:SecurityErrorEvent):void

                                {

trace("securityErrorHandler: " + event);

}

 

                                private function httpStatusHandler(event:HTTPStatusEvent):void

                                {

trace("httpStatusHandler: " + event);

}

 

                                private function ioErrorHandler(event:IOErrorEvent):void

                                {

trace("ioErrorHandler: " + event);

}

                               

//############################# CALLBACK #################################

                                private function completeHandler(event:Event):void

{

var loader:URLLoader = URLLoader(event.target);

                                                if(_callback!=null)

                                                {

                                                                                var result:Object;

                                                                                                result = JSON.decode(loader.data);

                                                                                _callback(result);

                                                }

                                }

                               

//############################# POST DATA #################################

                                public function load_data(params:Array, URL:String, callback:Function=null):void

                                {

                                                _callback = callback;

                                                var vhod_var:URLVariables = new URLVariables(); // хранилище переменных для передачи в скрипт

                                                var vhod_req:URLRequest = new URLRequest(URL);  // куда идет коннект

                                                vhod_req.method = URLRequestMethod.POST;         // метод POST

                                                var vhod_ldr:URLLoader = new URLLoader();           // гейтвейт

                               

                                                configureListeners(vhod_ldr);

 

                                                // определяем переменные для передачи

for(var p:String in params)

vhod_var[p] = params[p];

 

                                                vhod_req.data = vhod_var; // записываем все переменные в постовский сендер

                                                vhod_ldr.dataFormat = URLLoaderDataFormat.TEXT;                           // определяем формат получения данных

                                                try

                                                {

                                                                vhod_ldr.load(vhod_req);                 // передаем переменные в скрипт и получаем результат

                                                }

                                                catch (err:Error)

                                                {

                                                                //если неудачно то ошибка

                                                                trace(" Сервер не доступен!");

                                                }

                                }

 

//############################# UTILS #################################

                                public function getBaseURL(url:String):String

                                {

                                                if (url.indexOf("?") == -1)

                                                {

                                                                var lastSlashIndex:int = url.lastIndexOf("/");

                                                                url = url.substring(0, lastSlashIndex+1);

                                                }

                                                else

                                                {

                                                                var indexOfUpitnik:int = url.lastIndexOf("?");

                                                                url = url.substring(0, indexOfUpitnik+1);

                                                                lastSlashIndex = url.lastIndexOf("/");

                                                                url = url.substring(0, lastSlashIndex+1);

                                                }

                                                return url;

                                }

 

                }

}

 

Как видно из класса, прием данных будет осуществляться через JSON-формат. Для этого мы подключили JSON-библиотеку для флеша: import com.adobe.serialization.json.JSON;

Пример использования:

Для Flash-проэкта:

  1. помещаем файл со скриптом в ту же папку, что и флешка.
  2. пишем код:

var web_api:WebAPI;

web_api=new WebAPI();

url=web_api.getBaseURL(LoaderInfo(this.root.loaderInfo).loaderURL)+”test.php”;

var params:Array=new Array();

params[‘action’]=”get_goods”;

params[‘id’]=123;

params[‘secret’]=”sdfsdfgfe45622bnv34bv”;

web_api.load_data(params, url, getGoods);

 

function getGoods(loadedData:Object):void

{

                for(var p:String in loadedData)

                                trace(“key=”+p+”value=”+ loadedData[p]);

                // DO somethigs next…

}

Для Flex-проэкта web_api.getBaseURL работать не будет. Поэтому выходом из этой ситуации будет передача этого же url посредством flash-vars.

В остальном принцип работы тот же, что описан выше.

 

Пример простого кода на стороне сервера будет выглядить примерно так:

header('Content-Type: text/html; charset=utf-8');

$test_array=array();

$test_array[‘foo’]=’one’;

$test_array[‘bar’]=’two’;

if(isset($_POST['action']))

{

                switch($_POST['action'])

                {

                                case ‘get_goods’: echo json_encode($test_array);break;

                                case 'right_menu': echo json_encode($right_menu);break;

                                ……………………………………………………

                }

}

Примечание: json-формат доступен в php версии не ниже 5.3. Можно конечно же создать свой метод json_encode, что будет применяться, если в php на вашем web-сервере не будет обнаружен свой json_encode-метод.

Точно такой же подход можно использовать и для javascript-взаимодействия. Единственная проблема в этом может быть - преобразование в php ф-ии json_encode русских букв в их utf-8 аналоги.
Если у Вас возникла проблема с русскими символами - читаем дальше :)
1. Добавляем в php-файл функцию вида:

function json_encode_cyr($str) {
$arr_replace_utf = array('u0410', 'u0430','u0411','u0431','u0412','u0432',
'u0413','u0433','u0414','u0434','u0415','u0435','u0401','u0451','u0416',
'u0436','u0417','u0437','u0418','u0438','u0419','u0439','u041a','u043a',
'u041b','u043b','u041c','u043c','u041d','u043d','u041e','u043e','u041f',
'u043f','u0420','u0440','u0421','u0441','u0422','u0442','u0423','u0443',
'u0424','u0444','u0425','u0445','u0426','u0446','u0427','u0447','u0428',
'u0448','u0429','u0449','u042a','u044a','u042d','u044b','u042c','u044c',
'u042d','u044d','u042e','u044e','u042f','u044f');
$arr_replace_cyr = array('А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е',
'Ё', 'ё', 'Ж','ж','З','з','И','и','Й','й','К','к','Л','л','М','м','Н','н','О','о',
'П','п','Р','р','С','с','Т','т','У','у','Ф','ф','Х','х','Ц','ц','Ч','ч','Ш','ш',
'Щ','щ','Ъ','ъ','Ы','ы','Ь','ь','Э','э','Ю','ю','Я','я');
$str1 = json_encode($str);
$str2 = str_replace($arr_replace_utf,$arr_replace_cyr,$str1);
return $str2;
}

В коде выше заменяем json_encode на json_encode_cyr.

2. Для Flash все должно работать, как описано выше. Объект мы уже имеем. В случаи javascript мы имеем на получении строку, что есть json. Чтобы преобразовать json-строку в объект делаем следующее:
Предположим str - это наша json-строка. Тогда чтобы сделать ее объектом пишем код:

obj = eval( "obj = " + str );

Все.

Тренируемся, если будут вопросы - пишите.

    Прикрепленные файлы:
  • test.rar

Только авторизированные пользователи могут оставлять сообщения.
  Авторизация   Регистрация
       Добавить сообщение