Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 02-01-2008 10:29:44

Seb
Membre
Lieu: Thuin (Belgique)
Date d'inscription: 19-11-2007
Messages: 62
Site web

Ajax MVC et ViewRenderer

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)


Sébastien Bervoets

Hors ligne

 

#2 02-01-2008 19:56:40

Phoenix17
Membre
Lieu: Nancy
Date d'inscription: 09-04-2007
Messages: 73
Site web

Re: Ajax MVC et ViewRenderer

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)

Code:

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 :

Code:

{
   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

 

#3 02-01-2008 20:26:27

Seb
Membre
Lieu: Thuin (Belgique)
Date d'inscription: 19-11-2007
Messages: 62
Site web

Re: Ajax MVC et ViewRenderer

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


Sébastien Bervoets

Hors ligne

 

#4 02-01-2008 20:47:15

Phoenix17
Membre
Lieu: Nancy
Date d'inscription: 09-04-2007
Messages: 73
Site web

Re: Ajax MVC et ViewRenderer

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

 

#5 03-01-2008 09:00:44

Seb
Membre
Lieu: Thuin (Belgique)
Date d'inscription: 19-11-2007
Messages: 62
Site web

Re: Ajax MVC et ViewRenderer

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.


Sébastien Bervoets

Hors ligne

 

#6 03-01-2008 09:30:47

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Ajax MVC et ViewRenderer

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

 

#7 03-01-2008 10:48:16

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: Ajax MVC et ViewRenderer

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

 

#8 03-01-2008 10:55:04

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Ajax MVC et ViewRenderer

>> Pourquoi ne pas utiliser xajax : pas de javascript a écrire MAIS du php qui le génère en code inline...
On a vu plus propre.

Hors ligne

 

#9 03-01-2008 10:58:57

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: Ajax MVC et ViewRenderer

c'est a dire.... explique un peu ou ce n'est pas propre wink

Hors ligne

 

#10 03-01-2008 12:43:58

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Ajax MVC et ViewRenderer

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" smile

Hors ligne

 

#11 08-01-2008 15:15:43

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: Ajax MVC et ViewRenderer

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 :

Code:

<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

 

#12 08-01-2008 16:21:39

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Ajax MVC et ViewRenderer

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:

Code:

<a href="#" onclick="alert('test'); return false;">Lien de test</a>

Du code propre serait:

Code:

//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

 

#13 08-01-2008 18:44:07

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: Ajax MVC et ViewRenderer

Tu me suis là?

Vi je te suis wink

Su le coup ton code n'est pas vraiment "sale".

c'est pas mon code c'est celui généré par Xajax wink

merci de ces précisions,
j'avoue que je ne suis pas à ce degrés d'exigence sur l'appel du code javascript :

Code:

<a href="#" onclick="mafunction()">Lien de test</a>

me va bien.

Hors ligne

 

#14 08-01-2008 20:27:01

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Ajax MVC et ViewRenderer

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages