Flash/PHP/Mysql - Partie 3: Passage de variables avec JSON et LoadVars (le retour)
Ben oui ... croyiez quand même pas que je m'arréterais à passer les variable du PHP vers le Flash ... Il faut faire dans l'autre sens aussi ...
Alors ça m'a pris plus de temps quand même ... avant que je trouve un moyen de tester ça correctement ...
Commençons par le php, dans un premier temps on va simplement renvoyer ce qu'on reçois ... Histoire de voir si tout se passe bien ... rajoutons donc une action a notre controlleur de news :
public function addNewAction() { $news = Zend_Json::decode(stripslashes($_REQUEST["news"])); echo 'news=' . Zend_Json::encode($news); }
Le stripslashes est nécéssaire seulement si vous avez les magic quotes mais comme je les active partout, je met pas de test ... (si vous voulez allez voir du coté de get_magic_quotes_gpc())
Pourquoi j'utilise $_REQUEST plutot que POST ou GET ? Parce que bien souvent c'est très inutile de distinguer ... Si on a une variable en même temps qui porte le même nom en GET et en COOKIE c'est qu'il y a un problème de conception quelque part... enfin c'est mon avis ... Bref ça a un autre point positif vous verrez plus tard ...
Comme dit dans le précédent billet, utiliser LoadVars, c'est simple ... Mais la on travaille a l'aveuglette puisqu'il faut deviner ce qu'on reçoit et ce qu'on envoie du coté php puisque le client n'est pas un navigateur ... On pourrait simuler le client flash en créant un formulaire mais on serait pas bien sur que ce qu'on envoie est exactement la même chose que le formulaire ...
Donc voici le bout de code flash qui marche (je reviens la dessus plus tard ...)
var news:News = new News(-1, "News test", new Date()); var addLoader:LoadVars = new LoadVars(); addLoader.onLoad = function(success:Boolean) { if (success) { var n:News = new News(); n.init(JSON.parse(this.news)); trace(StringHelper.toString(n)); } else { trace(" Error loading variables "); } } addLoader.news = JSON.stringify(news); addLoader.sendAndLoad("http://localhost:8888/projetFlash/News/addNew", addLoader, "POST");
Voila j'ai introduit une notion de classe News que voici :
class News { private var id:Number; private var news:String; private var tmstp:Date; function News(id:Number, news:String, tmstp:Date) { this.id = id; this.news = news; this.tmstp = tmstp; } function init(object:Object) { this.id = object.id; this.news = object.news; this.tmstp = object.tmstp; } }
Il faudrait que j'y rajoute les getters et setters, mais je sais pas si je vais concerver le mode objet tout du long, ça a tendence à alourdir pour peu de choses ... Surtout la notre object c'est bien un bean (java fashion) ... un conteneur de données quoi ... donc bon ... machin.truc ça ira aussi ...
Bref la fonction init(object) est pratique pour l'initialiser à partir d'un JSON object (remarquez qu'on en a pas besoin si on oublie le model objet)
Là ou ça deviens chaud c'est que ... je vous file le code qui va bien ... avec les stripslashes les decode et encode qui vont bien ... Mais quand on teste c'est un petit peu le calvaire pour savoir ce qu'on fait ...
Alors c'est simple ... si a la place de sendAndLoad on y met un send avec une methode GET ça va beaucoup plus simple ...
//addLoader.sendAndLoad(urlPost, addLoader, "POST"); addLoader.send(urlPost, "_BLANK", "GET");
et du coup avec le $_REQUEST du coté php ça gère pareil ... et nous on peut tester comme des sauvages sans se préocuper du flash jusqu'à temps qu'on ait ce qu'on veut en sortie ... c'est-y pas beau ça ?
Ensuite n'en tien qua vous d'utiliser cette façon de faire et de l'agrémenter de l'insertion dans la base, et de la récupération du code d'erreur, c'est simple du coup puisqu'il suffit de se passer la balle :D
