Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-07-2007 10:59:36

verboz
Membre
Lieu: France, Lille
Date d'inscription: 26-06-2007
Messages: 24
Site web

Ajax+Zend Framework A RC2

Salut tout le monde,
Bon, je veux travailler avec ajax là. Bon pour le template, j'ai sous classer le view comme ça:
class MyView extends Zend_View {
    protected function _run()
    {
        include dirname(__FILE__)."/template/header.phtml";
        include func_get_arg(0);
        include dirname(__FILE__)."/template/footer.phtml";
    }
}
$view = new MyView();
$viewRenderer = Zend_Controller_Action_HelperBroker::getExistingHelper('viewRenderer');
$viewRenderer->setView($view)
             ->setViewSuffix('phtml');

Bon mon problème, c'est quand je fais un render dans mon controlleur, ça me retourne le résultat finale, c'est à dire toute la page avec le header et le footer et moi qui ne veut que la partie formulaire, je n'ai pas besoin du header et du footer (j'ai un div dans lequel j'affiche le résultat).

Quelqu'un aurait-il une idée?

Hors ligne

 

#2 01-07-2007 11:57:21

verboz
Membre
Lieu: France, Lille
Date d'inscription: 26-06-2007
Messages: 24
Site web

Re: Ajax+Zend Framework A RC2

Bon, j'ai trouvé une solution, peut être pas belle mais ça fonctionne, j'ai développé un plugin et dans ce dernier, je teste, si l'action que je veux faire nécéssite une inclusion de header et du footer, ou est ce que je veux que juste le formulaire s'affiche.
Si vous avez une meilleur solution, elle est la bienvenue.

Cordialement

Hors ligne

 

#3 01-07-2007 15:35:00

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: Ajax+Zend Framework A RC2

Bonjour,

j'utilise une solution, difficile à expliquer en quelques mots mais voici les grandes lignes :

J'ai un template pour chaque bout de html suceptible d'être rendu suite à un appel (Ajax ou autre).

Dans un fichier de config, j'ai une entrée pour chacun de ces templates.

Pour chaque section dans ce fichier de config (une section éq. un template), j'ai plusieurs infos :

* le container qui recevra la réponse (généralement un div dans le html)
* les sub templates potentiels (je reviendari la dessus plus tard)
* les callback éventuels (cad après insertion de la réponse dans l'interface, les callbacks sont objets javascript dont les méthodes sont à appliquer sur le contenu retourné, mais ceci sort du cadre de ta question...)

Le but est de garder le javascript, le plus léger possible, c'est le serveur (la partie View du MVC qui fait le boulot).

Donc je reçois un request de l'utilisateur, dans l'action du controller, je lance le rendering du template approprié. Si ce dernier a des sub templates, ils sont traités automatiquement.

A la fin du traitement, dans le response object je construis un objet (codé en JSON) qui comprend  le html à rafraichir sur la page PLUS le container qui doit recevoir ce html (+ les callbacks à appliquer si nécessaire).

Donc dans ton cas, si j'ai une page comme suit :

<div id="main">
  <div id="header">
     ici le menu par exemple
  </div>

  <div id="content">
      <div id="zone1">
         blabla de la zone1
     </div>
      <div id="zone2">
         blabla de la zone2
     </div>
  </div>

  <div id="footer">
     nbre users connectés, le temps qu'il fait, le nombre de sans papiers expulsés le mois dernier...
  </div>
</div>

Imaginons que que dans le menu du header, je clique sur une action qui doit mettre à jour la Zone2 :

Je me retrouvez dans EditZone2Action du controller, là je lance $this->render('Zone2');

Grâce au fichier de config, je retrouve dans le response Object du html que je sais que je dois mettre dans un container appelé Zone2.

Un objet est créé, le javascript reçoit la réponse de son appel Ajax, je fais :

$(myObjet.container).innerHtml = myObjet.content; // content est le html retrouné

Voilà, le tour est joué, j'ai mis à jour une petite partie de ma page sans me soucier du header ou du footer, ni de la zone1 du div Content.

J'ai basé tout ça sur des conventions de nom qui fait que c'est bien automatisé, et c'est marche bien.

Ce système est basé sur les articles et le proposal de Padraic (je le préfère au proposal Zend_Layout) , adapté à ma sauce et à mes besoins.

C'est assez flexible et pour l'instant je n'ai pas rencontré de souci majeur.

Je voudrais ajouter que ce qui m'a conduit à envisager ça sous cet angle, est le fait qu'une action peut engendrer le rendu de plusieurs parties distinctes sur l'interface. Pour moi, vu comment le MVC est implémenté, c'était un non sens de passer d'un controller à un autre pour rendre chacune de ces parties.

Donc en imaginant que l'action prise en exemple plus haut nécessite le rendu de la Zone2 mais aussi d'une portion d'un  menu gauche (qui serait un pager disons), je lance $this->render('Zone2', 'MenuGauchePager');

J'ai choisi de déléguer le traitement vers les vues plutôt que dans les controllers.

En espérant que ceci n'est pas trop confus, n'hésite pas si tu veux des éclaircissements, ça pourra mettre en évidence des points faibles que je pourrais ne pas avoir loupés.

A+

fred

Dernière modification par fred wolf (01-07-2007 15:46:08)

Hors ligne

 

#4 01-07-2007 17:12:47

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Ajax+Zend Framework A RC2

Bonjour Fred, Verboz,

Idem, je vais essayer de décrire ma méthode, mais ça n'est pas facile non plus. Par rapport à la version de Fred, c'est beaucoup plus en javascript et beaucoup moins en PHP...

Quand j'envoie une page dans le navigateur, il me faut 2 templates (j'utilise smarty, mais ça ne change rien au principe) :
- le HTML de ma page
- un fichier JS qui est inséré dans le header de ma page

Le fichier JS indique chacun des éléments dynamiques de ma page (bouton de submit, bouton d'activation, onchange sur un formulaire, n'importe quoi qui provoque un évenement javascript). Ce fichier JS dit pour chaque évènement qui nous intéresse :
"appelle en ajax le service qui est à l'URL http://monsite/service/MaCommande"

Pour chaque URL du type .../service/MaCommande, j'appelle un controlleur particulier qui récupère les données envoyées en POST et appelle une fonction "execute(params)" de la classe Kitpages_Command_xxx_MaCommande.

La commande traite les données envoyées. Eventuellement elle appelle une autre action pour récupérer un code HTML. La commande renvoie un tableau avec : un code retour ("OK", "FAIL",...) et un contenu (un tableau associatif ou une string)
Le ServiceController encode en JSON la réponse de la commande et renvoie le tout au navigateur.

La réponse du service est captée par le Javascript de la page. Suivant le code retour, le javascript peut effectuer l'action qu'il souhaite (notamment il raffraichir une zone avec le contenu reçu depuis la commande...)

Cette architecture est ce que j'appelle un MVC coté client : chaque composant actif de la page contient un modèle, une vue et un controlleur. C'est le principe des interfaces lourdes (swing, swt,...).

J'ai un exemple qui tourne en prod : http://www.euromapping.com (faites pas gaffe au graphisme, il devrait changer d'ici 15 jours...). Le MVC client est assuré en Javascript avec le fichier Kitpages.js (j'adore javascript... j'y peux rien ça me rappelle les délires de perl...)

Hum... désolé si c'est pas super clair, mais c'est pas non plus super facile à expliquer...

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#5 02-07-2007 10:53:49

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: Ajax+Zend Framework A RC2

Bonjour Philippe,

Cette architecture MVC coté client,  qu'entends-tu par la partie Modèle, ça concerne les données côté client uniquement ou tu as un lien possible avec le serveur ? J'ai lu pas mal de trucs là-dessus ces derniers temps...

A+

Fred

Hors ligne

 

#6 02-07-2007 10:57:32

Damien
Membre
Lieu: Tassin la Demi Lune
Date d'inscription: 22-03-2007
Messages: 88

Re: Ajax+Zend Framework A RC2

J'utilise DOJO pour cette partie javascript "dynamique" et son dojo.io.bind

ça donne ça :

Code:

function commun_onPostFormulaire(form, urlAction)
{
    dojo.io.bind({
        url: urlAction,
           method: "POST",
           load: commun_traiterFormulaire,
           error: commun_traiterErreurs,
           formNode: dojo.byId(form)
    });
}

Cette fonction est appelée lors de la soumission du formulaire avec l'id du formulaire (form) et une url pour l'action du type /module/contrôleur/action/

Ensuite j'ai 2 fonctions qui permettent de traiter le formulaire sans erreur et une pour traiter les erreurs.

Code:

function commun_traiterFormulaire(type, data, evt) {
    commun_cacherAttente();
    
    var donnees = data;
    commun_traiterJSON(donnees);
}

function commun_traiterErreurs(type, message) {
    commun_afficherErreurDialog("Erreur inconnue (" + message + ")");
}

La fonction commun_traiterErreurs fait appel à une fonction qui permet d'afficher une boite de  dialogue avec l'erreur javascript.

Les données du formulaire sont traitées dans la fonction commun_traiterJSON qui s'occupe de traiter les erreurs fonctionnelles et de faire les redirections (elle est un peu compliquée) :

Code:

function commun_traiterJSON(data) {
    
    libFloatErreur = "";
    var json = dojo.json.evalJson(data);
    if ( json.etat == "OK" ) {
        if ( json.redirect ) {
            // parcours des redirections éventuelles
            for (var i in json.redirect) {
                redirection = json.redirect[i];
                commun_IHMRedirect(redirection.zone, redirection.url);
            }
        }
        
        if ( json.js ) {
            // parcours des js éventuelles
            for (var i in json.js) {
                eval(json.js[i]);
            }
        }
    } else {
        dialogErreur = false;
        dialogTexte = "";
        // parcours des erreurs
        if ( json.erreurs ) {
            for (var i = 0; i < json.erreurs.length; i++) {
    
                type   = json.erreurs[i].type;
                champErreur   = json.erreurs[i].champ;
                libelleErreur = json.erreurs[i].libelle;
                
                if (type == "CHAMP") {
                    libFloatErreur = libFloatErreur + " - " + libelleErreur + "<br>";
                    commun_afficherErreurChamp(champErreur + "_label", libelleErreur);
                } else if (type == "ONGLET") {
                    commun_afficherErreurOnglet(champErreur);
                } else if (type == "DIV") {
                    libFloatErreur = libFloatErreur + " - " + libelleErreur + "<br>";
                    commun_afficherErreurDIV(champErreur, libelleErreur);
                } else if (type == "DIALOG") {
                    libFloatErreur = libFloatErreur + " - " + libelleErreur + "<br>";
                    dialogErreur = true;
                    dialogTexte += '<li>' + libelleErreur + '</li>';
                }
            }
            
            if ( dialogErreur ) {
                commun_afficherErreurDialog(dialogTexte);
            }
        }
        else if ( json.js ) {
            // parcours des js éventuelles
            for (var i in json.js) {
                eval(json.js[i]);
            }
        }
         else {
             libFloatErreur = libFloatErreur + " - " + json + "<br>";
            commun_afficherErreurDialog("Erreur inconnue : " + json);
        }
        
        // Affichage du div comportant les erreurs
        divPaneErreurs = dojo.byId("divPaneErreurs");
        if(divPaneErreurs) {
            divPaneErreurs.innerHTML = 
                                    '<img src="/images/icons/ico_warning.gif" '
                                    + 'align="absmiddle" border="0" hspace="2" name="icoWarningDiv">'
                                    + "<font color='red'><b>"+json.action + "</b></font><hr>"+ libFloatErreur;
            
            if(! dojo.widget.byId("paneErreurs").isShowing() && !dialogErreur) {
                dojo.widget.byId("paneErreurs").show();
            }
        }
    }
}

Voila, en gros, dans le contrôleur, on traite les données reçues et on encode en json un tableau associatif qui est de la forme :
$retour["etat"] qui prend les valeurs OK ou KO
$retour["js"] qui est un tableau de commande javascript
$retour["redirect"] qui est un tableau associatif sous la forme $retour["redirect"][x]["zone"] pour l'id du div à mettre à jour et $retour["redirect"][x]["url"] pour l'url de mise à jour
$retour["erreurs"] qui est un tableau des erreurs fonctionnelles (essentiellement) qui peuvent être de type différent genre une erreur sur un champ du formulaire, une erreur de type dialog qui affichera une boite de dialogue, ...

Voila, si vous avez des questions ou des remarques, je suis preneur. Je pense que la fonction commun_traiterJSON peut être améliorée et optimisée.

Hors ligne

 

#7 02-07-2007 11:21:43

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Ajax+Zend Framework A RC2

Fred,

Pour le MVC client, j'ai répondu dans tribune libre (ça commence à sortir franchement du cadre de ce thread...)
http://www.z-f.fr/forum/viewtopic.php?id=243

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#8 02-07-2007 11:34:50

verboz
Membre
Lieu: France, Lille
Date d'inscription: 26-06-2007
Messages: 24
Site web

Re: Ajax+Zend Framework A RC2

Salut,
Merci les gars pour toutes vos réponses, en fait je connaissais cette stratégie d'échange de donnée en Json, mais bon, je voulais pas toucher à mon application trop, pour que le jour où je décide d'enlever l'Ajax de mon application j'aurais pas bcp de chose à modifier (juste l'appel change). Bref, j'utilise Json juste pour encoder des objects que je retourne au client car je vois pas l'intérêt d'encoder du HTML pour le retourner au client.
Si je me trompe, n'hésitez pas, je ne suis pas une référence dans Ajax, peut être que j'ai mal compris.

Bon voilà ce que je fais:

Code:

require_once 'Zend/Controller/Plugin/Abstract.php';

class My_Controller_Plugin_AutoView extends Zend_Controller_Plugin_Abstract {

    private $_lastAction;

    public function __construct() {
        $view = new Zend_View;
        $view->setScriptPath(APP_ROOT.'/views/');
        Zend_Registry::set('view', $view);
    }

    public function preDispatch($action) {
        $this->_lastAction = clone($action);
        return $action;
    }
    public function postDispatch($action) {
        
    }

    public function dispatchLoopShutdown() {
        if($this->_lastAction->getControllerName()!="authent")//Tout se passe ici <========== 1
        {
            require_once(dirname(__FILE__)."/template/header.phtml");
                     
        }
    }
}

Dans la partie 1, on pourrais penser à un tableau et vérifier si le nom du controlleur existe dans le tablau ou non, si oui alors, on inclus le template(header+footer+autre chose) sinon, on laisse vide et de cette façon on auras que le code de la vue qui est retourné.

Je vois que cette solution est meilleur, pas la peine d'encoder et de décoder et on pourrais facilement enlever le fonctionnement Ajax (Cas des navigateurs sur les portables,....)

Cordialement

Hors ligne

 

#9 02-07-2007 12:07:37

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Ajax+Zend Framework A RC2

Fredwolf comment vas tu faire pour le référencement et les url de tes pages ? car avec ton système quasi toutes tes pages ont la même url donc pour le réferencement c'est moyen et pour copier coller une url pour linker vers ton site c'est pareil ....

Hors ligne

 

#10 02-07-2007 12:42:00

verboz
Membre
Lieu: France, Lille
Date d'inscription: 26-06-2007
Messages: 24
Site web

Re: Ajax+Zend Framework A RC2

Le pb d'ajax est le référencement et le debugage, c'est quelque de nouveau et qui n'est pas pris en considération par les moteurs de recherche, donc ce n'est pas un pb qui concerne la méthode de Fred. Autres limites d'Ajax: B2B, les bouttons de navigation (reglé avec jquery en utilisant le plugin Hiajax). Donc personnellement, j'utilise ajax mais pas dans la navigation (exemple, soumission d'un formulaire, lightbox, vérification, mise à jour dans la base de données, des trucs de ce genre).

Cordialement

Hors ligne

 

#11 02-07-2007 13:20:51

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Ajax+Zend Framework A RC2

C'est bien pour ca que c'est pas terrible d'utiliser ajax pour la navigation dans du contenu

Hors ligne

 

#12 02-07-2007 16:58:42

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: Ajax+Zend Framework A RC2

Bonjour les gars,

En fait je développe uniquement des applications de gestion, intranets. Mes obligations sont surtout la rapidité d'éxecution, d'affichage et une interface puissante. Moins les sites sont référencés, mieux je me porte (heureux homme, non ? smile, et en plus je ne me soucie de faire tourner les applis uniquement que sur un, voire deux navigateurs...). Ce sont des applications que les utilisateurs manipulent 8 heures par jour...

Mais effectivement pour le référencement, je n'ai qu'une url. Pour ce problème il faut demander à Philippe, qui lui fait des sites ouverts sur le web et utilise Ajax, je ne sais pas comment il se débrouille.

Je crois qu'il faut trouver un bon compromis entre rapidité d'affichage, interface puissante et puis...le référencement smile. Ce pourrait être une discussion à lancer sur le site.

Quant au debuggage, un jour est apparu firebug, extension firefox, c'est magique ! Point  d'arrêt, suivi de variables, pas à pas etc... pour le javascript, unDOM inspector, un truc pour les css, les temps de réponse...Nickel, même avec des bibliothèques genre prototype.js.

A+

Fred

Hors ligne

 

#13 02-07-2007 17:21:27

ndesaleux
Membre
Date d'inscription: 16-04-2007
Messages: 196
Site web

Re: Ajax+Zend Framework A RC2

Je ne comprends pas ces questions AJAX / referencement.

AJAX = JS, point barre.
donc comme tout developpement avec JS, si celui ci n'est pas activé le site doit fonctionner => pas de pb de reférencement. CQFD wink

Un code bien fait devraient :
- 1,n CSS          / couche présentation
- 1,n fichier JS   / couche fonctionnelle
- 1 fichier HTML / couche information

Voila my 2 cents, ceci est de la théorie car la pratique ne permet pas forcement de le faire sad

Hors ligne

 

#14 02-07-2007 17:31:34

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Ajax+Zend Framework A RC2

Le problème avec Ajax, c'est que dès qu'on met le doigt dedans, on est tenté de tout coder à l'intérieur d'une seule et unique page en ne rafraichissant que des zones de pages. Intellectuellement c'est hyper satisfaisant, on peut avoir un code très propre et très homogène. Dans ce cas, un robot d'indexation ne comprend rien et ne voit que la première page.

Là dessus, il n'y a pas de solution magique pour un site public : il faut limiter l'ajax à des éléments dynamiques qui de toute façon n'auraient pas été indexés : formulaire d'indentification, ajout au panier, espace client,...

Par contre si on veut qu'un catalogue de produit soit indexable, pas le choix, il faut oublier javascript et faire des bons liens bien classiques <a href...>.

En ajax, c'est clairement plus confortable de coder une interface d'admin ou un intranet, on peut oublier google très sereinement (Ô bonheur...).

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#15 03-07-2007 08:29:15

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Ajax+Zend Framework A RC2

Tout à fait d'accord avec ton approche philippe. J'utilise ajax dans ces conditions même si il est vrai on aimerait en mettre plus pour le confort utilisateur mais bon ...

Hors ligne

 

#16 03-07-2007 10:41:03

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: Ajax+Zend Framework A RC2

Bonjour,

Juste par curiosité,

comment gérez-vous le cas où le javascript est désactivé sur le poste utilisateur ? Par exemple Philippe, est-ce que tu prévois une solution de rechange pour le formulaire d'indentification ou l'ajout au panier ?

Bonne journée,

Fred

Hors ligne

 

#17 03-07-2007 10:56:42

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Ajax+Zend Framework A RC2

Bonjour,

Non, je ne gère plus le cas où javascript est désactivé. La plupart des gros sites ne fonctionnent plus sans javascript (sfr, orange, voila,...). J'ai tendance à penser que tout le monde active javascript maintenant à part une minorité très petite d'informaticiens...

Cela dit, les parties publiques et éditoriales fonctionnent toujours sans javascript (Google oblige smile )

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#18 03-07-2007 13:15:56

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Ajax+Zend Framework A RC2

Exactement pareil que philippe. En revanche j'aimerais bien connaitre les stats sur les personnes qui désactive js mais à mon avis ca doit pas dépasser 0.1 %. Puis désactiver js c'est complétement contradictoire avec le web, c'est comme si je désactivais les vitres electriques et la clim de ma bagnole ...

Hors ligne

 

#19 24-08-2007 11:02:37

komak
Nouveau membre
Lieu: Tours
Date d'inscription: 24-08-2007
Messages: 1
Site web

Re: Ajax+Zend Framework A RC2

fred wolf a écrit:

Bonjour,

j'utilise une solution, difficile à expliquer en quelques mots mais voici les grandes lignes :

J'ai un template pour chaque bout de html suceptible d'être rendu suite à un appel (Ajax ou autre).

Dans un fichier de config, j'ai une entrée pour chacun de ces templates.

Pour chaque section dans ce fichier de config (une section éq. un template), j'ai plusieurs infos :

....

fred

Bonjour,
L'idée me séduit beaucoup surtout pour une transition en douceur vers une architecture MVC client JS+ZF .
Est il possible d'avoir un exemple de code de votre solution ?
D'avance merci

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