Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Voilà, je fais une application de gestion et j'aimerais faire un truc sympa dans celle-ci. Je m'explique. J'ai une page avec une liste de client (tableau). Pour chaque client j'ai une icône "Archiver" qui pointe sur "/customer/archive/id/...". Ce que j'aimerais c'est faire un appel AJAX de cette action et ensuite faire apparaître un message dans la page courante pour dire que ça c'est bien passé (un peu comme dans l'admin de wordpress 2).
Je pense donc faire un petit javascript dans l'événement onClick de mon image pour faire l'appel AJAX vers l'action (jusque là pas trop de problème) mais ce que j'aimerais c'est que le framework me revoie le code javascript que je vais insérer dans la page (via document.getElementById('message').body = ...) et qu'il ne cherche pas /customer/archive.phtml
Quelqu'un petu-il m'aider ?
Merci d'avance
Dernière modification par Seb (02-01-2008 10:44:31)
Hors ligne
Salut,
Si j'ai bien compris, tu as un tableau html, sur chaque ligne, tu souhaites mettre une action 'Archiver', et si l'archivage s'est bien passé, tu souhaites afficher un message de succès ?
Dans un premier temps, je te conseille d'imaginer le cas ou l'action ne retourne pas un succès.
Dans ce cas, il faudra prevoir un message de succès, mais aussi un message d'erreur.
Tout cela n'a pas vraiment rapport avec ZF, m'enfin :
Pour tes requêtes ajax, je te conseille des outils comme Prototype (++++) ou jQuery... te permettant de faire des requêtes ajax assez simplement :
Par exemple, avec prototype, on peut imaginer une fonction similaire (assez simplifié dans l'exemple)
function archiveById(id) { new Ajax.Request('/customer/archive/' + id) { { method : 'get', onSuccess: function(transport) { var response = transport.responseText || false; if(response == 'success') { $('myDivMessage').update("Archivage effectué avec succès"); } else { $('myDivMessage').update("Erreur lors de l'archivage"); } }, onFailure: function(){ $('myDivMessage').update("Erreur lors de l'archivage"); } }); }
Dans cet exemple, tu devras mettre un onclick="archiveById('<?php echo $row['id']; ?>')" sur les ligne de ton tableau.
Ensuite, dans l'action ArchiveAction de ton controller CustomerController, tu devras récupérer/filtrer/valider l'id, effectuer l'action d'archivage, et renvoyer une valeur "success" pour succès, ou "failed" pour une erreur (voir function js ci-dessous).
Comme je te l'ai dit, c'est assez simplifier, mais personnelement, je pense que la meilleures de solutions, c'est de renvoyer une réponse formattée en json similaire à celle-ci :
{ status : 'sucess', msg : 'custom message for success action' }
Ce qui te permettrait de gérer le message d'erreur via php, et non directement en js (pour traduire avec Zend_Translate par exemple).
Hors ligne
Phoenix17 a écrit:
Ensuite, dans l'action ArchiveAction de ton controller CustomerController, tu devras récupérer/filtrer/valider l'id, effectuer l'action d'archivage, et renvoyer une valeur "success" pour succès, ou "failed" pour une erreur (voir function js ci-dessous).
Merci pour ta réponse. J'ai réussi à presque tout faire mais mon soucis vient de ceci justement. Tu aurais un bout de code pour moi ? Je voudrais envoyer la réponse en JSON mais surtout éviter que le ViewRenderer cherche un archive.phtml.
Merci
Hors ligne
Bun il y a deux solutions :
- ne pas utiliser l'action helper ViewRenderer au profit de Zend_View,
- utiliser la méthode setNoRender() du ViewRenderer qui desactivera le rendu de la vue
Dernière modification par Phoenix17 (02-01-2008 20:47:29)
Hors ligne
Merci pour ta réponse, c'est le setNoRender() que je n'arrivais pas à trouver. Je vais chercher un tuto sur Zend_View (je pensais que c'était le même que ViewRenderer) pour voir ce qu'il y a de mieux.
Hors ligne
Le ViewRenderer n'est qu'un action helper qui utilise Zend_View il me semble. Ce sont donc 2 choses complémentaires (je crois qu'il n'y a que Zend_View qui peut s'utiliser seul).
Hors ligne
Bonjour,
Pourquoi ne pas utiliser xajax : pas de javascript a écrire.
C'est une bonne librairie, à mon avis, et simple à utiliser avec le zend framework.
Hors ligne
c'est a dire.... explique un peu ou ce n'est pas propre
Hors ligne
Je ne sais pas si tu utilise de l'HTML ou plutot XHTML/CSS la différence du 2ième cas réside dans le fait que la mise en forme du document est séparé de celui ci (XHTML->document, CSS-> mise en forme).
Dans la même optique, le Javascript représente le comportement du document, il doit donc être externalisé pour ne pas poller le document avec des attributs onclick à ralonge.
Et xajax (d'après le snippet que j'ai vu sur la homepage) genère du javascript dans les onclick...
Le comportement est donc mélangé au document. C'est donc "pas propre"
Hors ligne
bonjour,
je n'etais pas present recemment je n'ai pas pu repondre à ton post
>> xajax (d'après le snippet que j'ai vu sur la homepage) genère du javascript dans les onclick...
>>Le comportement est donc mélangé au document. C'est donc "pas propre" smile
oui tout appel ajax sera sur un evenement javascript (on change, onclick) xajax ou non (c'est pas xajax qui le génère ),
Je pense que je n'ai pas du comprendre ta phrase.
code généré :
declaration de fonction ...
verification des import javascript ...
donc je ne vois toujours pas ce qui est sale.
sinon pour exemple voici le code generé par xajax sur un exemple :
<script type="text/javascript" charset="UTF-8"> /* <![CDATA[ */ try { if (undefined == xajax.config) xajax.config = {}; } catch (e) { xajax = {}; xajax.config = {}; }; xajax.config.requestURI = "/GestionCompte/index/serviceAjax/"; xajax.config.statusMessages = false; xajax.config.waitCursor = true; xajax.config.version = "xajax 0.5 Beta 4"; xajax.config.legacy = false; xajax.config.defaultMode = "asynchronous"; xajax.config.defaultMethod = "POST"; /* ]]> */ </script> <script type="text/javascript" src="/library/xajax/xajax_js/xajax_core.js" charset="UTF-8"></script> <script type="text/javascript" charset="UTF-8"> /* <![CDATA[ */ window.setTimeout( function() { var scriptExists = false; try { if (xajax.isLoaded) scriptExists = true; } catch (e) {} if (!scriptExists) { alert("Error: the xajax Javascript component could not be included. Perhaps the URL is incorrect?\nURL: library/xajax/xajax_js/xajax_core.js"); } }, 2000); /* ]]> */ </script> <script type='text/javascript' charset='UTF-8'> /* <![CDATA[ */ xajax_updateInfosPseudo = function() { return xajax.request( { xjxfun: 'updateInfosPseudo' }, { parameters: arguments } ); }; xajax_verifiePseudoExiste = function() { return xajax.request( { xjxfun: 'verifiePseudoExiste' }, { parameters: arguments } ); }; xajax_updateCles = function() { return xajax.request( { xjxfun: 'updateClesAjax' }, { parameters: arguments } ); }; xajax_updateMail = function() { return xajax.request( { xjxfun: 'updateMailAjax' }, { parameters: arguments } ); }; xajax_updateQuestion = function() { return xajax.request( { xjxfun: 'updateQuestionReponseAjax' }, { parameters: arguments } ); }; /* ]]> */ </script> <script type="text/javascript"> xajax.callback.global.onRequest = function() {xajax.$('conteneur').className='conteneur_wait';xajax.$('conteneur').style.display = 'block';xajax.$('LeMessage').innerHTML='Execution en cours';} xajax.callback.global.beforeResponseProcessing = function() {xajax.$('conteneur').style.display='none';} </script>
Hors ligne
Su le coup ton code n'est pas vraiment "sale".
Ce que je défini comme du code sale, c'est lorsque l'on a du javascript inline cad:
<a href="#" onclick="alert('test'); return false;">Lien de test</a>
Du code propre serait:
//HTML <a id="lienDeTest" href="#">Lien de test</a> //Javascript (dans un fichier externe) (avec Jquery) $(function() { $('#lienDeTest').bind('click', function() { alert('test'); return false; } });
Quand je dis que le document doit être séparé du comportement c'est simplement qu'il faut le mettre dans un fichier externe (à la limite dans un balise <script>... à la limite). Utiliser les onclick, onchange HTML c'est "sale"!
Tu me suis là?
Hors ligne
Tu me suis là?
Vi je te suis
Su le coup ton code n'est pas vraiment "sale".
c'est pas mon code c'est celui généré par Xajax
merci de ces précisions,
j'avoue que je ne suis pas à ce degrés d'exigence sur l'appel du code javascript :
<a href="#" onclick="mafunction()">Lien de test</a>
me va bien.
Hors ligne
C'est vrai que sur des petits codes javascript ça va très bien.
Après quand tu commence à avoir pas mal de javascript (RIA par exemple), ça devient lourd à maintenir.
Avoir tout ses codes js regrouper c'est quand même plus facile à faire évoluer.
Enfin tu le veras bien par toi même un jour où l'autre (ou pas).
Sinon, voici un petit lien sympa: http://www.zendframeworkinaction.com/20 … axcontext/
Hors ligne