Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'ai un petit problème avec ZF ou JQuery, je ne sais pas trop.
Pour effectuer mes tests, j'ai un évènement "onmouseover" sur un lien <a> qui appelle une fonction JS. Cette dernière effectue une requete AJAX. Le script appelé doit simplement retourner le message "Ajax Ok".
Lorsque je teste mon bout de code, firebug m'indique bien que l'appel ajax est correctement effectué et me retourne la réponse attendue "Ajax Ok". Cependant je ne trouve pas le moyen d'exécuter la fonction JS qui devrait être appeler en cas de succès.
La fonction JS placer dans layout.phtml :
function tooltips() { $.ajax({ type:"POST", url:"index/ajax/format/xml", success: function(msg){ console.log('success : ' + msg); } }) } // eo tooltips();
Mon controller :
<?php class IndexController extends Zend_Controller_Action { public function init() { $contextSwitch = $this->_helper->getHelper('contextSwitch'); $contextSwitch->addActionContext('ajax','xml')->initContext(); } //eo init(); [...] public function ajaxAction() { $this->view->resultatAjax = 'Ajax Ok'; } // eo ajaxAction(); } ?>
Et enfin ma vue dédiée à l'action ajaxAction (ajax.xml.phtml) :
<?php echo $this->resultatAjax; ?>
Mon code JS me parait correct, mais ZF me donne le résultat attendu. Bref je suis perdu
Dernière modification par exotux (06-07-2008 18:37:00)
Hors ligne
C'est dans success justement...
La fonction que tu as définis dans success, c'est la fonction qui sera appelée si tout s'est déroulé correctement.
Donc si tu fais qqch du style :
function tooltips() { $.ajax({ type:"POST", url:"index/ajax/format/xml", success: function(msg){ console.log('success : ' + msg); $('#mon_contenu').replaceWith(msg) } }) } // eo tooltips();
Evidemment, tu dois avoir (dans ce cas), un bloc ayant pour identifiant mon_contenu (id='mon_contenu').
Hors ligne
Merci de ta réponse.
Le truc c'est que je ne rentre pas dans la fonction définie avec success. Aucun message n'apparait dans la console. J'ai ajouté ton bout de code au cas où mais le résultat est le même. Je ne rentre pas dans cette fonction et je ne sais pas pourquoi. Sans doute que tout ne se fait pas correctement mais je n'ai aucun message d'erreur
Dernière modification par exotux (06-07-2008 13:13:01)
Hors ligne
Alors, utilisant ZF et JQuery je vais te donner ma façon de procéder.
Côté JS :
J'appelle la fonction test de mon controlleur ajax. Le résultat renvoyé par le contrôleur est exécuté en pop-up dès le retour (avec un alert).
function tooltips() { $.ajax({ type:"POST", url:"/ajax/test", success: function(returnData){ alert(returnData); } }) }
Côté contrôleur : Le contrôleur va renvoyer un simple "blablabla". Donc en exécutant la fonction, tu aura un message "alert" te disant "blabla". Le exit permet de forcer le contrôleur à ne pas chercher la vue. Sans exit, le "alert" aurait affiché le contenu de la view associée au contrôleur.
<?php class IndexController extends Zend_Controller_Action { public function testAction(){ echo 'blablalba'; exit; } }
En modifiant ton JS de cette façon, le contenu de la view sera "inséré" dans ton élement dont l'ID est "résultats".
A chaque fois que ta fonction sera relancée, la div résultat sera remise à jour par le renvoi de ta view.
function tooltips() { $.ajax({ type:"POST", url:"/ajax/test", success: function(returnData){ $('#resultats').html(returnData); } }) }
Hors ligne
T'as méthode fonctionne mais ne me convient pas complètement.
Je ne peux pas utiliser une vue pour afficher le résultat du script "ajax", l'utilisation d'un echo directement dans le controller suivi d'un exit me parait un peu barbare. Si je retire le exit, c'est toute la page qui est renvoyée (j'utilise zend_layout) et là c'est le chaos . J'ai l'impression de supprimer le modèle MVC pour faire ce que je veux. Pas top il me semble, pas très propre.
Avec la méthode que j'utilise, j'indique le format de sortie du script (xml) mais ce dernier affiche seulement une bête chaine de caractères. L'appel ajax fonctionne, en tout cas du coté serveur, puisque j'obtiens la chaine correctement. Mais bizarrement l'appel de la fonction success ne se fait pas... et le pire c'est que c'est LOGIQUE. Il faut que ma vue affiche du XML !
Je commence par modifier ma vue pour rajouter l'entête XML qui va bien :
<?php echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; echo "<data>{$this->resultatAjax}</data>"; ?>
Je test et ça fonctionne. Il manquait simplement une vrai structure XML. Bon, mais dans mon cas, j'ai juste besoin d'une réponse texte basique pour afficher dans un alert().... Visiblement le helper contextSwitch ne connait par défaut que XML et JSON mais il possible de créer son propre format
Donc dans mon controller je vais donc créer un context "text" :
public function init() { $contextSwitch = $this->_helper->getHelper('contextSwitch'); $contextSwitch->addContext('text', array( 'suffix' => 'text' )); $contextSwitch->addActionContext('ajax','text')->initContext(); } //eo init();
Je renomme ma vue ajax.xml.phtml par ajax.text.phtml pour avoir un "type" de vue associé à mon context "text". La vue affiche une simple chaine.
<?php echo $this->resultatAjax"; ?>
Enfin, je change l'url interrogée par mon script JS url:"index/ajax/format/xml", par url:"index/ajax/format/text".
function tooltips(elt) { $.ajax({ type:"POST", url:"index/ajax/format/text", success: function(returnData){ console.log('success : ' + returnData); $('#action').html(returnData); } }) } // eo tooltips();
Et hop ça fonctionne ! Merci d'avoir pris le temps de me répondre, ça ma permis d'avancé !
Hors ligne
Moi j'ai implémenté le moteur de template PHPTAL avec ZF, donc mes vues sont gérées différents, c'est certainement pour ça que ma méthode me suffit amplement.
Tant mieux en tout cas si tu as réussi à faire ce que tu veux.
Hors ligne