Использование Flex 2 и AMFPHP(оригинал)

Автор: Майк Поттер

Перевод: Андрей Горбатов

Это вторая статья про использование Flex 2 и PHP. Но здесь интеграция проводится с помощью AMFPHP, что более удобно, чем манипулирование XML данными.

Что нужно:

Flex Builder 2

AMFPHP 1.1

PHP (на локальном сервере)

Начнем

Сперва необходимо скачать последнюю версию библиотеки 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 );

}

Файлы этого урока должны быть расположены следующим образом:

Ссылки по теме