Использование Flex 2 и AMFPHP(оригинал)
Автор: Майк Поттер
Перевод: Андрей Горбатов
Это вторая статья про использование Flex 2 и PHP. Но здесь интеграция проводится с помощью AMFPHP, что более удобно, чем манипулирование XML данными.
Сперва необходимо скачать последнюю версию библиотеки AMFPHP. Установка библиотеки проста – скопируйте содержимое архива на сервер. Желательно также прочитать первую статью по интеграции Flex 2 и PHP.
В данном примере показано, как отображать данные базы данных во Flex-приложении. Поэтому необходимо создать тестовую базу данных и таблицу:
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;
Наполните таблицу данными.
Следующий PHP код необходимо записать в файл sample.php и расположить его в папке services, расположенной в папке установки AMFPHP:
<?php
// Создание нового сервиса PHP Remoting в виде класса
class sample
{
function sample ()
{
// Задание methodTable для класса в конструкторе
$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" );
//список пользователей
$Query = "SELECT * from users";
$Result = mysql_query( $Query );
while ($row = mysql_fetch_object($Result)) {
$ArrayOfUsers[] = $row;
}
return( $ArrayOfUsers );
}
}
?>
Имя класса должно совпадать с именем файла. При загрузке класса он запускает функцию sample() (то есть конструктор класса), которая определяет методы, доступные в AMFPHP (в версии AMFPHP 1.9 этого уже не требуется), например, getUsers, возвращающая список пользователей. В самой функции происходит подключение к базе данных и запрос на вывод списка всех пользователей в виде массива объектов.
Создадим файл sample.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" creationComplete="initApplication()">
<mx:DataGrid dataProvider="{ PHPData }">
<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 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>
</mx:Application>
Во второй строке вызывается слушатель события 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 Name" dataField="emailaddress"/>
</mx:columns>
</mx:DataGrid>
Обратите внимание, что элемент columnName должен соответствовать имени поля таблице.
Далее идет 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 привязан к источнику данных <mx:DataGrid>.
Следующий код необходим для работы AMFPHP во Flex:
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, необходимый для Remoting. На самом деле, Flex включает этот класс автоматически при определении Responser позже. Но я включил эту строку для наглядности.
Затем устанавливается переменная gateway типа RemotingConnection. Для этого необходимо иметь в папке приложения класс 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
{
//
}
}
}
Затем идет функция initApplication:
public function initApplication()
{
gateway = new RemotingConnection( "http://localhost/flex/php/gateway.php" );
gateway.call( "sample.getUsers", new Responder(onResult, onFault));
}
Функция initApplication запускается при загрузке приложения. Файл gateway.php находится в корне AMFPHP. Убедитесь в правильности пути к нему. Затем происходит вызов метода getUsers класса sample (sample.getUsers). Ответ этого вызова контролируется двумя функциями: onResult (если все в порядке) и onFault (в случае ошибки).
Далее переменной PHPData передается результат запроса:
public function onResult( result : Array ) : void
{
PHPData = result;
}
Это массив PHP объектов, возвращенный запросом ($ArrayOfUsers). AMFPHP перевел этот PHP массив объектов в ActionScript массив объектов.
Здесь происходит вывод ошибки, если таковая имеет место:
public function onFault( fault : String ) : void
{
trace( fault );
}
Файлы этого урока должны быть расположены следующим образом:
Файлы sample.mxml и RemotingConnection.as должны быть расположены в одной папке.
PHP файлы из AMFPHP должны быть расположены в корне сервера.
Файл sample.php должен находится в папке services каталога AMFPHP.
Ссылки по теме
Tweenpix - блог, из которого взят код класса RemotingConnection