Flash Remoting et AmfPhp

Compatible ActionScript 2. Cliquer pour en savoir plus sur les compatibilités.Compatible Flash 8. Cliquer pour en savoir plus sur les compatibilités.Compatible PHP. Cliquer pour en savoir plus sur les compatibilités.

Tout d'abord, il est important d'expliquer 2 choses :

  • Flash Remoting : échange direct et aisé entre Flash et une application installée sur le serveur.
  • AmfPhp : Solution open-source concurrente à ColdFusion.

Requis

Installation

  • Installez Flash. ;-)
  • Installez les composants Flash Remoting.
  • Extrayez les classes AS2 Flash Remoting dans votre répertoire de classes AS2.
  • Mettez les fichiers extraits de l'archive d'Amfphp sur votre serveur.

Configuration d'AmfPhp

Il vous faut éditer le fichier se trouvant à la racine du dossier d'Amfphp : gateway.php. Dans le milestone 3, le gateway.php est configuré à 99%, la seule chose à modifier en général est le support des langues. Fort heureusement, un gros effort a été investi dans la documentation. gateway.php inclut un véritable manuel sur elle-même !

Ainsi, si vous voulez qu'Amfphp transfère les caractères accentués inhérents au Français, copiez les lignes

    	// Western european languages (French, Spanish, German, etc.):
 
	$gateway->setCharsetHandler( "iconv", "ISO-8859-1", "ISO-8859-1" );
	$gateway->setCharsetHandler( "utf8_decode", "ISO-8859-1", "ISO-8859-1" );

des commentaires et collez-les sous la ligne 141 qui est un commentaire vous disant que vous pouvez ajouter votre propre code à partir de là.


A la ligne 105, le classpath par défaut est services qui est le répertoire par défaut à la racine d'Amfphp pour les services. Si vous souhaitez mettre vos services ailleurs que dans ce répertoire par défaut, vous devrez changer le paramètre de cette ligne. :-)

    //Set where the services classes are loaded from, *with trailing slash*
    $gateway->setBaseClassPath("services/");

Environnement de production

Lorsque vous avez terminé votre application/site et que vous mettez le tout en ligne, vous n'avez plus besoin du NetDebug, ni d'aucun autre outil de débug. Il faut donc les désactiver dans amfphp et cela se fait en un mot dans gateway.php à la ligne 100, remplacez

define("PRODUCTION_SERVER", false);

par

define("PRODUCTION_SERVER", true);

Pour vérifier que votre configuration est bonne, via votre navigateur, allez sur la page gateway.php, il doit vous proposer le téléchargement de la page.

Configuration de Flash

  • Créez un nouveau fichier flash.
  • Allez dans le menu Fenetre > Autres Panneaux > Bibliothéques communes > Remoting.
  • Ctrl+L vous affiche la bibliothéque de votre animation vide actuelle.
  • Déplacez RemotingClasses et RemotingDebugClasses vers la bibliothéque de votre animation.

Vous pouvez vous passer de RemotinClasses, il est en effet possible de les importer via leurs class as. Seul le Debug nécessite d'être utilisé comme cela.

Classes requises

Il y a un minimun de classes à importer :

import mx.remoting.Service;
import mx.remoting.PendingCall;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;

Si vous souhaitez faire fonctionner le DebugRemoting, il vous faut importer une classe supplémentaire :

import mx.remoting.debug.NetDebug;

Si vous souhaitez avoir les logs des échanges, il faut importer :

import mx.services.Log;

1er échange, partie PHP

Voici un exemple d'un échange simple, on défini la passerelle php, puis le service ( classe php ) à employer, ensuite on effectue une requête sur l'une des méthodes définie dans la class php. L'exemple ci-dessous est écrit en AS2 :

import mx.remoting.Service;
import mx.remoting.PendingCall;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;
 
var service : Service = new Service("http://site.com/gateway.php", null, "MyService", null, null);
 
var pc:PendingCall = service.hello("Flash");
pc.responder = new RelayResponder(this, "onResult", "onFault");
 
function onResult (res:ResultEvent) 
{
	trace ("Résultat : " + res.result)
}
function onFault (res:FaultEvent) 
{
	trace ("Erreur : " + res.fault.faultstring);
}

Il nous faut donc une class php MyService, dans le dossier où sont stockés les services :

<?php
include_once("../util/MethodTable.php");
/* 
Le fichier MyService est dans le répertoire "services" d'amfphp dans ce cas.
Veillez à pointer correctement sur MethodTable qui se trouve dans
le répertoire de base amfphp > util.
*/
 
class MyService
{
	function MyService ()
	{
		/**
		 * La classe MethodTable a fait son apparition dans AMFPHP milestone 3 
		 * et génère la table des méthodes à partir des commentaires en en-tête
		 * de chaque fonction, d'où l'importance d'écrire des commentaires correctement !
		 */
		$this->methodTable = MethodTable::create("MyService");
	}
 
	/**
	 * @desc Remote hello
	 * @access remote
	 * @param $who Le nom de celui qui salue :)
	 * @returns String
	 */
	function hello($who)
	{
		return $who . " said hello !";
	}
}
?>

Un point très important ici, et je veux insister dessus : documentez correctement vos en-têtes de fonctions ! Il existe d'autres mots-clés suivant ce que l'on veut faire (leur usage sera démontré dans d'autres tutoriaux) :

  • desc (décrit une fonction)
  • access (accès à la méthode)
  • roles (permet de restreindre l'accès à une méthode pour certains utilisateurs)
  • instance
  • returns (type de variable renvoyée par la méthode s'il y en a)
  • pagesize (utilisé pour définir une taille limite aux pages d'un RecordSet)

@access décrit la portée d'une méthode. Si vous ne souhaitez pas qu'une méthode soit appelée par Flash, écrivez simplement private au lieu de remote.

Documentation sur le wiki officiel à propos de MethodTable : http://www.amfphp.org/wiki/doku.php?id=methodtable_class

Les avantages de l'utilisation de MethodTable sont :

  • Le programmeur est forcé à documenter correctement ses fonctions
  • De fait, le constructeur est plus lisible sans methodTable codé en dur
  • C'est plus simple que de coder en dur

Les désavantages sont :

  • Plus de lenteur dans l'exécution car la table des méthodes doit être générée
  • Pour des raisons inconnues, parfois MethodTable ne fonctionne pas (fin 2005)

ATTENTION : pour utiliser la classe MethodTable, vous devez avoir au moins PHP 4.3.0.

Si vous souhaitez écrire en dur la table des méthodes, vous devrez remplacer l'unique ligne dans le constructeur de MyService ci-dessus par ceci :

$this->methodTable = array (
		"hello" => array(
				"description" => "Remote hello",
				"arguments" => array("who"),
				"access" => "remote",
				"returns" => "String" 
				)
		);

Note : si vous voulez générer la methodTable automatiquement à partir de vos en-têtes de fonctions, allez sur http://localhost/flashservices/browser/ (remplacez localhost/flashservices par l'url pointant sur amfphp sur votre server).

1er échange, partie AS2

Flash envoie donc une variable à php, et php lui renvoie cette variable. Lorsqu'on compilera le .swf, “Flash said hello !” est affiché dans la console de sortie (output).

Dans les outils indispensables au débuggage lorsqu'on utilise AMFPHP, il y a le NetDebugger. Pour l'utiliser, il faut intégrer un autre composant dans la librairie, nommé RemotingDebugClasses :

import mx.remoting.Service;
import mx.remoting.PendingCall;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;
 
// Import du NetDebug
import mx.remoting.debug.NetDebug;
// Initialisation et voilà, c'est tout ce qu'il y a à ajouter
NetDebug.initialize();
 
var service : Service = new Service("http://site.com/gateway.php", null, "MonService", null, null);
 
var pc:PendingCall = service.hello("Flash");
pc.responder = new RelayResponder(this, "onResult", "onFault");
 
function onResult (res:ResultEvent) 
{
	trace ("Résultat : " + res.result)
}
function onFault (res:FaultEvent) 
{
	trace ("Erreur : " + res.fault.faultstring);
}

Que voyons nous dans le DebugRemoting, que vous pouvez lancer directement via flash :

Fenêtre>Autres Panneaux>NetConnexion Debugger

ou à partir d'un raccourci vers le fichier :

C:\Documents and Settings\NomUtilisateur\Local Settings\Application Data\Macromedia\Flash MX 2004\en\Configuration\WindowSWF\NetConnection Debugger.swf

On obtient cela :

ConnectString: "http://localhost/flashservices/gateway.php"
MethodName: "MyService.hello"
Parameters (object #2)
.....[0]: "Flash said hello !"
Result: "Flash said hello !"

Vous venez de faire votre 1ère utilisation d'amfphp dans le cadre d'échange de données entre Flash et PHP. Bien sûr, AMFPHP ne se limite pas qu'à cela et il est extrêmement pratique avec une database SQL par exemple.

D'autres tutoriaux plus avancés sur AMFPHP sont disponibles. :-)

- Anty

 
Le contenu de cet article est la propriété de .
Toute distribution ou adaptation est interdite sans l'autorisation expresse de l'auteur.
Contact Ressources Mediabox

Ces pages de ressources collaboratives Mediabox sont mises en ligne en utilisant Dokuwiki