Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/11/2011, 14h02   #1
Membre du Club
 
Inscription : avril 2003
Messages : 117
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 117
Points : 62
Points : 62
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 :
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
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 20h53   #2
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
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.
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 11h01   #3
Membre du Club
 
Inscription : avril 2003
Messages : 117
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 117
Points : 62
Points : 62
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
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 21h03   #4
Membre confirmé
 
Avatar de Nighty
 
Homme Lucas CORBEAUX
Chef de projet MOE
Inscription : février 2003
Messages : 159
Détails du profil
Informations personnelles :
Nom : Homme Lucas CORBEAUX
Âge : 28
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet MOE

Informations forums :
Inscription : février 2003
Messages : 159
Points : 293
Points : 293
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.
Nighty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 23h19   #5
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
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.
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h38.


 
 
 
 
Partenaires

Hébergement Web