Ajax et framework Jquery :: actions en cascade


Mountain Magazin
WRInaute impliqué
WRInaute impliqué
 
Messages: 598
Inscription: 1 Oct 2004

Ajax et framework Jquery :: actions en cascade

Message le Lun Mai 04, 2009 7:47

Salut à tous,

J'ai besoin d'un petit conseil :

J'utilise parfois le framework Jquery, qui est très bien, notamment pour certaines requêtes ajax en POST ou des effets graphiques.

Je suis assez friand des interfaces en ajax, qui permettent de gérer son compte sans recharger la page, je trouve cela terriblement confortable, un peu comme Gmail.
Je sais que cela est à éviter sur la partie publique du site et que lorsque c'est le cas, il faut des liens JS valides qui puissent est suivis pas les moteurs (type <a href="lien.html" onclick="action via ajax">). Là n'est pas le débat.

En fait mon souci, c'est par exemple lorsqu'un utilisateur met en ligne une nouvelle promotion, via ajax, à la validation j'affiche dans un DIV le résultat de la page php appelée :
Code: Tout sélectionner
         $.ajax({
            type: "POST",
            url: "include/gestion-promos/gestion_promo.php",
            data: ser, //Serialise
            success: function(html){
               $("#reponsepromo").empty(); //On vide le contenu du div à chaque occurence de test pour éviter le cumul des messages d'erreur
               $("#reponsepromo").append(html);//On charge le message d'erreur en provenance du script PHP de traitement


            } //--\\success
         }); //--\\$.ajax


Jusque là pas de souci. Par contre, la difficulté, c'est que là on test le succès de la requête ajax, mais pas le succès de l'opération qui se déroule en php en arrière plan.

J'en ai besoin car je veux déclencher d'autres actions en cas de succès, comme l'insertion de la nouvelle promo dans le flux de la page. Alors, j'ai trouvé une solution, qui est la suivante (mais que je ne trouve pas très propre) :

Code: Tout sélectionner
         $.ajax({
            type: "POST",
            url: "include/gestion-promos/gestion_promo.php",
            data: ser, //Serialise
            success: function(html){
               $("#reponsepromo").empty(); //On vide le contenu du div à chaque occurence de test pour éviter le cumul des messages d'erreur
               $("#reponsepromo").append(html);//On charge le message d'erreur en provenance du script PHP de traitement

               var not = document.getElementById('reponsepromo').innerHTML; //On récupère le contenu du div pour voir si message d'erreur après traitement php

                  if ( not == "<p>Votre discount a bien été ajouté !</p>" ) { //Si pas de message d'erreur, on lance l'affichage de la promo

                     $.post("include/gestion-promos/gestion_promo.php",
                        { id_camp: "<?php print ( $_GET['camp'] ); ?>", action: "readProm" },
                        function(html){
                           $("#reponsepromo").fadeOut(6000);
                           $("#adpromotion").fadeOut(4000); //on fait disparaître le div en dégradé
                           $("#disparait").empty(); //On vide le div qui dit éventuellement qu'il n'y a pas encore de promo
                           $("#addajaxpromo").append(html);//On charge le message d'erreur en provenance du script PHP de traitement
                        }
                     ); //-- $.post

                  }

            } //--\\success
         }); //--\\$.ajax


En fait, je récupère le résultat de la requête dans une variable, et je compare avec le résultat attendu pour vérifier le succès ou non. ensuite, si c'est le cas, j'appelle un autre script qui exécute une autre action dans un deuxième temps, via un autre script :
Code: Tout sélectionner
var not = document.getElementById('reponsepromo').innerHTML; //On récupère le contenu du div pour voir si message d'erreur après traitement php
      if ( not == "<p>Votre discount a bien été ajouté !</p>" ) { //Si pas de message d'erreur, on lance l'affichage de la promo


Donc, si le message généré par php est le message de succès attendu, alors ensuite on exécute un nouveau script qui récupère la dernière insertion dans la BDD puis l'insère dans le DOM

Comme à chaque ligne sont associées des actions (delete, edit...) et qu'il faut que les éléments insérés en ajax soient reconnus par le framework pour pouvoir ensuite agir dessus sans recharger la page, j'utilise l'excellent plugin live query

$("#submitpromo").livequery('click',function() {
});

Voilà, donc en fait, j'arrive très bien à faire ce que je veux, mais je me demande s'il n'existe pas d'autres méthodes plus simples, plus propres que de comparer le code html de la réponse du script, pour savoir la suite à donner.

Toute la difficulté dans ces cas là, c'est de gérer plusieurs actions à plusieurs endroits, au sein d'une même page. Je sais en clair récupérer la réponse serveur, mais pas plusieurs réponses simultanées, et les différencier. Je suis donc pour l'instant obligé de procéder ainsi. A moins que quelqu'un ne connaisse une autre technique qui m'aurait échappée.

Si personne a mieux, ça pourra donner des idées à certains pour leurs scripts.

J'espère avoir été clair.

Merci.

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité