Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flex
Flex Forum d'entraide sur la programmation Adobe Flex : applications Internet riches (RIA)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/02/2011, 11h21   #1
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Par défaut Problème insert, delete, update avec Remote Object

bonjour,

je dois développer un back-office en flex afin d'administrer une base de donnée MySQL (je précise que je travaille sous windows avec wamp).

Pour cela j'utilise la création de service automatique de Flash Builder via Remote Object.
La mise en place du service se passe bien et les opérations de test sont ok.
J'utilise Flash Builder pour générer les appels aux services et les formulaires.

Le problème que je rencontre c'est que lorsque je test l'application les opérations d'insert, delete, update sur la base de donnée ne sont pas effectuées (aucune erreure n'est signalée). Je peux lire les infos de la base (select) mais pas effectuer d'autres opérations.
En testant l'appli je me rends compte que le problème vient du fait que pour les opérations insert, delete, update, la classe de service AS3 ne fait pas appel à la classe PHP qui lui correspond alors que tout se passe bien pour les opérations de select.

Je suis donc à la recherche d'infos me permettant de résoudre ce problème.

Merci.
gui-yem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 12h04   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour et bienvenue,

que t'a généré Flash builder ? Un backend avec Zend Framework ? As tu vérifié que ton serveur AMF mappe bien tes services et que tes retours en as3 se font bien sur l'event result et pas fault ?
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 12h57   #3
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Merci pour ta réponse rapide.

- que t'a généré Flash builder ?

il m'a généré toute la couche de service PHP (introspection avec Zend Framework) et AS3 ainsi que les classes ValueObject AS3.
J'ai aussi fait généré les appels aux services et les formulaires par Flash Builder.


- As tu vérifié que ton serveur AMF mappe bien tes services ?


Toutes les opérations de test (insert, delete, update, select) effectuées avec Flash Builder fonctionne parfaitement. Donc j'en déduis qu'il n'y a pas de souci côté PHP et AMF.

- tes retours en as3 se font bien sur l'event result et pas fault ?

Pour ce qui est des retour AS3 c'est flash builder qui a généré les appels aux services donc aparemment pas de pb de ce côté là. Surtout que les opérations de select marchent parfaitement.


Le pb est vraiment lié au fait que pour les opérations insert, delete, update, la classe de service AS3 générée par Flash Builder ne lance pas la classe de service PHP qui gère les opérations sur la base. Ce qui est surprenant c'est que le processus fonctionne parfaitement sur les opérations de select qui sont gérés par la même classe AS3.

Aprés avoir analysé la classe de service AS3 (qui est la classe génée par defaut sans aucune modif) je ne vois pas du tout pourquoi sur les méthodes (create, delete, update) le service côté serveur n'est pas invoqué. J'imagine qu'il doit y avoir un paramêtre à configuré ...

Je précise que je n'ai aucune erreur relevée lors de la validation des formulaires de l'appli de test.


Voici qq échantillons de code généré :

- la méthode de la classe de service AS3 censé apeller la méthode de la classe service PHP
Code :
1
2
3
4
5
6
7
8
 
public function createTest(item:Object) : mx.data.ItemReference
{
    var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation("createTest");
    var _internal_token:mx.data.ItemReference = _internal_operation.send(item) as mx.data.ItemReference;
 
    return _internal_token;
}
- L'appel au service :
Code :
1
2
3
4
5
6
7
8
9
10
 
protected function button_clickHandler(event:MouseEvent):void
{
	var test2:Test = new Test();
	test2.id = parseInt(idTextInput.text);
	test2.name = nameTextInput.text;
	test2.age = parseInt(ageTextInput.text);
 
	createTestResult.token = testService.createTest(test2);
}
(code généré par défaut par Flash Builder)
gui-yem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 13h32   #4
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
J'avoue que j'utilise jamais Flash builder pour générer mes services donc je suis pas trop habitué à ces notations et encore moins aux opérations.

Cependant, quelque chose me surprend : tu ne mets pas d'ecouteur sur _internal_token afin d'écouter la réponse du serveur ?
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h08   #5
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Dans ce cas c'est la méthode createTest(item:Object) de la classe de service AS3 qui renvoie la réponse du serveur (return _internal_token).
gui-yem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h17   #6
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
et ce return est exploité où ensuite ?
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h25   #7
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Le return est exploité ici :
Code :
1
2
3
4
5
6
7
8
9
10
protected function button_clickHandler(event:MouseEvent):void
{
   var test2:Test = new Test();
   test2.id = parseInt(idTextInput.text);
   test2.name = nameTextInput.text;
   test2.age = parseInt(ageTextInput.text);
				
   createTestResult.token = testService.createTest(test2);
}
et cette méthode est invoquée sur l'évènement click sur le btn du formulaire de création
gui-yem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h37   #8
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
et ce createTestResult est de quel type et où est il crée stp ?
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h45   #9
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Il est créé ici :
Code :
1
2
3
4
5
6
<fx:Declarations>
   <valueObjects:Test id="test"/>
   <testservice:TestService id="testService"  fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"/>
   <s:CallResponder id="createTestResult"/>
</fx:Declarations>
c'est un objet CallResponder.
gui-yem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h54   #10
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Essaies de tester les événements comme ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
createTestResult.addEventListener(FaultEvent.FAULT, eventFault);
createTestResult.addEventListener(ResultEvent.RESULT, eventResult);
createTestResult.token = testService.createTest(test2);
 
protected function eventFault(event:FaultEvent):void {
  Alert.show("marche pas");
}
 
protected function eventResult(event:ResultEvent):void {
  Alert.show("marche");
}
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 16h08   #11
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Donc j'ai testé...
rien ne se passe.

mais bon l'évènement Fault est déja écouté ici :
Code :
1
2
3
4
5
6
<fx:Declarations>
    <valueObjects:Test id="test"/>
    <testservice:TestService id="testService"  fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"/>
    <s:CallResponder id="createTestResult"/>
</fx:Declarations>
gui-yem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 16h17   #12
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
On dirait que la destination de ton remote object n'a pas été définie.

Personnellement, j'applique la méthode décrite sur le site de zend, au moins je comprends tout ce que je fais ensuite.

As tu testé de faire cette méthode via un fichier xml décrivant tes services ?
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 16h45   #13
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
En fait ici la configuration du Remote Object est entièrement gérée par la classe de service AS3:
Code :
1
2
3
4
5
6
7
...
_serviceControl.convertResultHandler = com.adobe.serializers.utility.TypeUtility.convertResultHandler;
_serviceControl.source = "TestService";
_serviceControl.endpoint = "gateway.php";
destination = "TestService";
...
Ce qui est étonnant dans tout ça c'est que l'opération select sur une table marche.
J'arrive à alimenter une DataGrid avec le contenu d'une table.
Donc la passerelle entre Flex et PHP est opérationnelle.
Par contre impossible d'effectuer une autre opération.

J'en viens à me demander si il n'y a pas une histoire de restriction ou de droit concernant les opérations insert, delete, update ... ce qui me paraît vraiment improbable.
gui-yem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 16h54   #14
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Envois tu bien via ton remote object autant de paramètres qu'il y en a dans tes services PHP ?

Sinon, tu peux regarder les logs apache ou définir une fonction de log dans tes services afin d'historiser un peu ce que fait ton service et trouver ainsi les éventuel problèmes
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 19h46   #15
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Donc j'ai trouvé un moyen de débugger ces problèmes.

Je donne la méthode que j'ai utilisé pour ceux qui rencontrerait les même pb que moi.

- J'ai supprimé les méthodes create, update et delete de la classe de service PHP.
- Ensuite j'ai éxécuté le programme afin de relancer l'introspection de la classe de service PHP par le zend framework ce qui a pour effet de mettre à jour la classe de service AS3 (suppression des méthodes create, update, delete).
- Puis j'ai remis les méthodes create, update, delete dans la classe de service PHP
- Enfin j'ai rééxécuté le programme afin de relancer une nouvelle introspection et donc de remettre à jour la classe de service AS3 (recréation des méthodes create, update, delete).


Ce que ça donne niveau code c'est le type des paramètres et le type des retours des méthodes de create, update, delete de la classe de service AS3 qui ont changé:

avant manip:
Code :
1
2
3
4
5
6
7
8
 
public function createTest(item:valueObjects.Test) : mx.data.ItemReference
{
    var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation("createTest");
    var _internal_token:mx.data.ItemReference = _internal_operation.send(item) as mx.data.ItemReference;
 
    return _internal_token;
}
après manip:
Code :
1
2
3
4
5
6
7
8
 
public function createTest(item:Object) : mx.rpc.AsyncToken
{
     var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation("createTest");
     var _internal_token:mx.rpc.AsyncToken = _internal_operation.send(item) ;
 
     return _internal_token;
}
Cette méthode pour obtenir des services fonctionnelles sur toutes les opérations (insert, update, delete) n'est pas très logique mais bon ça marche.

Si quelqu'un a une explication ou une méthode plus propre je suis preneur.
gui-yem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 14h40   #16
Invité de passage
 
Femme
Ingénieur développement logiciels
Inscription : avril 2011
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Sénégal

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Communication - Médias

Informations forums :
Inscription : avril 2011
Messages : 1
Points : 4
Points : 4
Par défaut Merci!

Citation:
Envoyé par gui-yem Voir le message
Donc j'ai trouvé un moyen de débugger ces problèmes.

Je donne la méthode que j'ai utilisé pour ceux qui rencontrerait les même pb que moi.

- J'ai supprimé les méthodes create, update et delete de la classe de service PHP.
- Ensuite j'ai éxécuté le programme afin de relancer l'introspection de la classe de service PHP par le zend framework ce qui a pour effet de mettre à jour la classe de service AS3 (suppression des méthodes create, update, delete).
- Puis j'ai remis les méthodes create, update, delete dans la classe de service PHP
- Enfin j'ai rééxécuté le programme afin de relancer une nouvelle introspection et donc de remettre à jour la classe de service AS3 (recréation des méthodes create, update, delete).


Ce que ça donne niveau code c'est le type des paramètres et le type des retours des méthodes de create, update, delete de la classe de service AS3 qui ont changé:

avant manip:
Code :
1
2
3
4
5
6
7
8
 
public function createTest(item:valueObjects.Test) : mx.data.ItemReference
{
    var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation("createTest");
    var _internal_token:mx.data.ItemReference = _internal_operation.send(item) as mx.data.ItemReference;
 
    return _internal_token;
}
après manip:
Code :
1
2
3
4
5
6
7
8
 
public function createTest(item:Object) : mx.rpc.AsyncToken
{
     var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation("createTest");
     var _internal_token:mx.rpc.AsyncToken = _internal_operation.send(item) ;
 
     return _internal_token;
}
Cette méthode pour obtenir des services fonctionnelles sur toutes les opérations (insert, update, delete) n'est pas très logique mais bon ça marche.

Si quelqu'un a une explication ou une méthode plus propre je suis preneur.


Salut gui-yem!
Grace à votre réponse j'ai pu résoudre mon problème qui m'a pris presque une semaine.
J'utilise Flash builder 4 pour developper un intranet.
J'avoue que toutes les fonctions générées pour un service fonctionnent correctement.
J'ai résolu mon problème comme ça:
1* j'ai commenté les ligne de code des fonction create, delete et update au niveau du service concerné
2* ensuite j'ai exécuté le programme flash
3* j'ai décommenté les lignes que j'avais commenté a l'étape 1
4* j'ai reexécuté le programme et l'insertion marche très bien

J'espère que ça va aider quelqu'un qui utilise la méthode que j ai suivi!

Merci
mouride84 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/04/2011, 21h59   #17
Invité de passage
 
Homme Benoît Durand
amateur motivé
Inscription : avril 2011
Messages : 1
Détails du profil
Informations personnelles :
Nom : Homme Benoît Durand
Localisation : France

Informations professionnelles :
Activité : amateur motivé
Secteur : Arts - Culture

Informations forums :
Inscription : avril 2011
Messages : 1
Points : 1
Points : 1
Par défaut merci

Eh bien les gars, je ne saurais trop vour remercier de nous avoir fait partager vos recherches et surtout vos solutions !
Ça fait pratiquement une semaine que je m'arrache les cheveux sur ce problème, et mes nerfs étaient sur le point de lâcher tous en même temps.

Je me suis inscrit au forum juste pour vous remercier:
Merci, merci, et encore merci !
durandl3enoit est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h30.


 
 
 
 
Partenaires

Hébergement Web