2009-06-23 6 views
0

Je vais commencer depuis le début. Je construis un plugin wordpress qui fait double emploi, en ce sens qu'il peut être inséré dans un post via un shortcode, ou ajouté comme un widget sidebar. Tout ce qu'il fait est la sortie de certains js pour faire des demandes jquery.post à un fichier php local. Le fichier php local fait une demande à un service web pour certaines données. (Je devais le faire de cette façon au lieu d'interroger directement le service web avec jquery.ajax car l'url contient une clé de licence qui serait publique si elle était placée dans le js).script php reçoit deux requêtes ajax, n'en renvoie qu'une seule?

Quoi qu'il en soit, lorsque je visualise une page dans le blog wordpress qui a à la fois le widget sidebar et la sortie du plugin via shortcode seulement une des demandes fonctionne. Je veux dire que cela fonctionne en ce sens qu'il reçoit une réponse du script php. Une fois la page chargée, ils fonctionnent tous les deux normalement quand on leur dit manuellement.

Affichage de la page Web -> envoyer 2 demandes de publication à mon script php -> les deux éléments doivent être remplis, mais un seul doit l'être.

Mon script php est juste:

<?php 
    if(isset($_POST["zip"])) { 
     // build a curl object, execute the request, 
     // and basically just echo what the curl request returns. 
    } 
?> 

assez basique.

voici quelques js certaines personnes voulaient voir:

function widget_getActivities(zip){ 
    jQuery("#widget_active_list").text(""); 
    jQuery.post("http://localhost/wordpress/wp-content/ActiveAjax.php", { zip: zip}, 
     function(text) { 
      jQuery(text).find("asset").each(function(j, aval){ 
       var html = ""; 
       html += "<a href='" + jQuery(aval).find("trackback").text() + "' target='new'> " + jQuery(aval).find("assetName").text() + "</a><b> at </b>"; 

       jQuery("location", aval).each(function(i, val){ 
        html += jQuery("locationName", val).text() + " <b> on </b>"; 
       }); 

       jQuery("date", aval).each(function(){ 
        html += jQuery("startDate", aval).text(); 
       <!--jQuery("#widget_active_list").append("<div id='ActivityEntry'>" + html + " </div>");--> 
       jQuery("#widget_active_list") 
        .append(jQuery("<div>") 
         .addClass("widget_ActivityEntry") 
         .html(html) 
         .bind("mouseenter", function(){ 
          jQuery(this).animate({ fontSize: "20px", lineHeight: "1.2em" }, 50); 
         }) 
         .bind("mouseleave", function(){ 
          jQuery(this).animate({ fontSize: "10px", lineHeight: "1.2em" }, 50); 
        }) 
        ); 

       }); 
      }); 
     }); 
} 

imaginer Maintenant, il y a une autre fonction identique à celui-ci, sauf tout ce qui est précédé d' « Widget_ » est pas préfixé. Ces deux fonctions sont appelées séparément via:

jQuery(document).ready(function(){ 
    w_zip = jQuery("#widget_zip").val(); 
    widget_getActivities(w_zip); 
    jQuery("#widget_updateZipLink").click(function() { //start function when any update link is clicked 
     widget_c_zip = jQuery("#widget_zip").val(); 
     if (undefined == widget_c_zip || widget_c_zip == "" || widget_c_zip.length != 5) 
      jQuery("#widget_zipError").text("Bad zip code"); 
     else 
      widget_getActivities(widget_c_zip); 

    }); 
}) 

Je peux voir dans mes journaux apache que les deux demandes sont en cours. Je suppose que c'est une condition de course, mais ça n'a pas de sens. Je suis nouveau à tout cela, des idées?

EDIT: J'ai trouvé une solution sous-optimale. J'ai mon widget détecter si le plugin est également utilisé sur la page, et si c'est le cas, il attend pendant 3 secondes avant d'exécuter la requête. Mais j'ai le sentiment que la même chose se produira si plusieurs clients exécutent une requête de page en même temps qui déclenche l'une des requêtes à mon script PHP, parce que je crois que le problème est dans le script PHP, ce qui est effrayant.

+0

Difficile à dire sans plus d'info ou de code. Vous pouvez utiliser le panneau Net de Firebug sous Firefox pour voir le trafic que le navigateur envoie et reçoit (y compris les en-têtes de requête/réponse), très pratique pour le débogage d'Ajax. – MSpreij

+0

J'ai utilisé firebug, mon script php renvoie 200 OK, mais l'un d'entre eux n'a pas de contenu ... Je n'ai aucune idée de ce que cela signifie. Et étonnamment, ils retournent tous les deux une réponse valide, donc il semble que le jquery.post soit étranglé d'une manière ou d'une autre. –

Répondre

1

Pas assez d'informations vraiment pour moi vraiment comprendre quoi que ce soit ...

Mais une chose est d'essayer d'obtenir Firebug et de voir quelle est la réponse pour chacune des demandes.

Une autre question pourrait être ... Remplissez-vous par identifiant? Si c'est le cas, cela peut être dû au fait que vous avez deux fois le même identifiant sur une même page, ce qui chamboule tout. Si vous l'avez en ligne, il serait beaucoup plus facile de vous aider.


Edit:

Quelques commentaires ... je ne sais pas si quelque chose sera résolu par cette ... Mais ...

<!--jQuery("#widget_active_list").append("<div id='ActivityEntry'>" + html + " </div>");--> 

Pour autant que je sais le type de commentaire que vous utilisez là-bas n'est efficace que lorsqu'il est utilisé en html et pourrait être en train de bousiller votre Javascript. Remplacez-le par //

jQuery("#widget_active_list").append(jQuery("<div>") 
            .addClass("widget_ActivityEntry") 
            .html(html) 
            .bind("mouseenter", function(){ 
              jQuery(this).animate({ fontSize: "20px", lineHeight: "1.2em" }, 50); 
            }) 
            .bind("mouseleave", function(){ 
              jQuery(this).animate({ fontSize: "10px", lineHeight: "1.2em" }, 50); 
            }) 
          ); 

Deuxièmement ...ce bloc entier est imbriqué dans le dernier .chaque qui ne semble pas avoir d'effet cependant, il n'est pas impossible que cela dérange. Enfin, même si cela ne fait pas vraiment la différence, vous devriez probablement définir le type de réponse à xml. En utilisant à la fois les en-têtes http en PHP et en utilisant le dernier argument de la fonction. à savoir

header("Content-Type: application/xml"); 

et

jQuery.post("http://localhost/wordpress/wp-content/ActiveAjax.php", { zip: zip}, thefunctionhere, xml); 

Si cela ne suffit pas, ma suggestion pour une solution sous-optimale, est d'utiliser une requête get à la place, et ajouter un paramètre aléatoire qui n'a pas été prise en compte aux deux demandes, mais faites-en la même chose pour chaque requête, mais différente chaque fois que vous allez sur la page. De cette façon, le navigateur mettra en cache la requête pour le premier, et ne questionnera pas le serveur une seconde fois, mais il ne le mettra pas en cache lorsque la personne reviendra sur la page.

+0

Je me suis assuré d'avoir des identifiants séparés où je les utilise pour différencier entre widget et plugin. Plus comme je l'ai dit si je fais un rechargement de page, un seul fonctionne, mais j'ai des boutons de "mise à jour" pour chacun, donc si je force celui qui n'a pas fonctionné, il met à jour correctement ... –

+0

Vous n'avez pas encore assez de réputation pour commenter votre message, mais sous l'onglet net, sous chaque requête, il devrait y avoir 3 onglets - paramètres, en-tête et réponse - que dit-il dans l'onglet réponse? – Thomas

+0

ils retournent tous deux la bonne réponse attendue, comme je l'ai commenté. J'utilise ensuite jquery pour mettre à jour ma page avec les réponses. Quel est étrange, est celui qui n'a pas de contenu-longueur est celui qui met à jour la page ... –