IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

View helper action et les plugins de controller


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Par défaut View helper action et les plugins de controller
    Bonjour à tous,

    voici mon cas :
    - j'ai plusieurs modules dans mon application et pour chaque j'ai un fichier de langues tmx. ça marche très bien
    - j'ai une classe qui étend Zend_Controller_Plugin_Abstract avec une méthode predispatch qui va charger le fichier de langue correspondant à mon module (pour éviter de charger tous mes fichiers de langages de tous mes modules)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    class TOTO_Controller_Plugin_TranslatorLoader extends Zend_Controller_Plugin_Abstract
    {
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
            $moduleName = $request->getModuleName();
     
            $tmxfile = APPLICATION_PATH  . DIRECTORY_SEPARATOR . 'modules' 
                                         . DIRECTORY_SEPARATOR . $moduleName 
                                         . DIRECTORY_SEPARATOR . 'languages'
                                         . DIRECTORY_SEPARATOR . $moduleName . '.tmx';
     
            if(is_file($tmxfile))
            {
     
                $tr = Zend_Registry::get('Zend_Translate');
                $tr->addTranslation( array( 'content' => $tmxfile)  );
            }
        }
    }
    Les problèmes commencent si j'utilise le view helper action() pour charger dans un module B le résultat se trouvant dans un module A : le plugin va charger le fichier de langue du module B mais pas celui du module A.

    Je pensais qu'en appelant action, on repassait par le dispatch et donc que mon plugin serait appelé de nouveau pour le module A.

    est-ce un problème de configuration à mon niveau ou est-ce que forcément, quand on passe par le view helper 'action', le trio module/controller/action demandé ne fera pas appel aux plugins de controller car ils ont déjà été exécuté ?

    par avance merci

  2. #2
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Bonjour,
    Comment peux tu être sur que ça ne fonctionne pas ?

    Peut tu nous fournir un exemple concret ?
    Les traduction sont identique dans chaque module ? Tu es sur que la première traduction n'est pas appelé et que ça n'écrase pas celle ci ?

    Je te dis ça car pour ma part la position des modules a son importance, donc possibilité de surcharge et un module est prioritaire par rapport aux autres.

  3. #3
    Membre actif
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Par défaut
    Déjà, merci de t'intéresser à mon cas.

    Je sais que cela ne fonctionne pas car j'ai foutu un Zend_Debug::dump à l'intérieur de mon plugin et il ne s'affiche qu'une fois, avec les informations du module "parent".
    Il n'est pas appelé de nouveau au moment où le view helper 'action' est exécuté.

    Au départ, je pensais qu'il y avait des flags dans le dispatcher qui empêchait les action plugins d'être exécuté plus d'une fois. Mais en inspectant le fonctionnement du view helper et surtout du dispatcher, on se rend compte qu'il ne repasse pas dans une bouche du predispatch du controller en question.

    Donc ce que j'en comprend :
    - un controller plugin n'est exécuté qu'une fois,
    - le view helper 'action' ne conduit visiblement pas à faire une nouvelle request "complète", on refait que le dispatch du controller en question, les controller plugins ne sont pas appelé de nouveau.

    est-il possible de changer cela ?

    par avance merci

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Intéressant ton cas, qui donne envie de se plonger dans les entrailles du ZF. J'ai jeté un oeil à ce que tu dis, tout ce que je te dirais ici est très théorique car je n'ai pas mon poste de travail sous la main, donc pas pu tester...

    Le view helper Action utilise directement le dispatcher :
    http://framework.zend.com/svn/framew...per/Action.php

    Alors que si j'en crois le code, c'est le FrontController qui fait se déclencher les plugins :
    http://framework.zend.com/svn/framew...ller/Front.php

    Du coup, effectivement l'appel à l'helper Action ne semble pas déclencher les actions des plugins...

    Quelques trucs qui me viennent, ils te seront peut-être utiles à contourner le problème :
    - Tu n'as vraiment pas d'autre choix que ce view helper ? L'ActionHelper actionStack() marche peut-être différemment, ou tu peux peut-être utiliser _forward() ?
    - Utiliser un ActionHelper plutôt qu'un plugin : il est possible (pas vérifié) que le chargement du contrôleur suffise à les charger et appeler leurs méthodes preDispatch(), alors que les plugins sont chargés par le FrontController.
    - Utiliser un dispatcher maison, qui déclencherait ton plugin, et que tu fournirais au view helper Action en remplacement du dispatcher standard. Honnêtement, je trouve cette solution un brin compliquée...

    En tout cas si tu résous ton soucis, je serais intéressé par ta solution.

  5. #5
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    En appellant une action tu repasse par le preDispatch du conleur de ton action pas celui de ton plugin.

    Tu as la possibilité de créé TOTO_Controller_Action qui étendrait Zend_Controller_Action et dans lequel tu surchargerait la méthode preDispatch en y mettant le chargement de ton fichier langue.

    Sinon tu surcharge ton helper afin que ce soit lui qui charge tes fichiers.

Discussions similaires

  1. [ZF 1.10] La différence entre les plugins et les helpers ?
    Par zizou86 dans le forum MVC
    Réponses: 2
    Dernier message: 27/03/2011, 22h21
  2. [ZF 1.10] Appel du view helper "action" dans une module ne marche pas
    Par ilalaina dans le forum MVC
    Réponses: 7
    Dernier message: 28/10/2010, 10h11
  3. Réponses: 1
    Dernier message: 04/06/2009, 19h45
  4. Réponses: 1
    Dernier message: 02/08/2008, 19h21
  5. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo