Tout d'abord, il est important d'expliquer 2 choses :
Pour faire du Flash Remoting, il est nécessaire d'avoir :
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/");
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.
Fenetre > Autres Panneaux > Bibliothéques communes > Remoting.Ctrl+L vous affiche la bibliothéque de votre animation vide actuelle.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.
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;
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) :
@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 :
Les désavantages sont :
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).
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
Encore des questions? Besoin d'aide? Venez en discuter sur les forums Flash Remoting ou Programmation Dynamique.