Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'utilise un plugin dans lequel je définie Zend_Registry::set('maclé', 'mavaleur'). Cette clé est accessible partout sauf dans le Bootstrap.php. Comment faire pour récupérer une valeur de mon plugin et la transmettre mon bootstrap ?
Hors ligne
C'est normal que ta variable ne soit pas accessible dans ton bootstrap, car les plugins sont exécutés après le bootstrap.
Si tu mets un petit bout de code, on pourra peut être t'aider
Hors ligne
Merci pour ta réponse.
En fait mon code ce trouve dans ce sujet ici :
http://www.z-f.fr/forum/viewtopic.php?id=4496
J'ai compris que le plugin était lancé après mon bootstrap, par contre je ne sais pas comment m'en dépêtrer du coup.
Hors ligne
Salut,
Pourquoi ne pas initialiser Zend_Translate dans ton plugin ?
public function routeShutdown(Zend_Controller_Request_Abstract $request) { $lang = $request->getParam('lang', ''); $lang = strtolower($lang); if ($lang !== 'en' && $lang !== 'fr') { $request->setParam('lang', 'fr'); $lang = 'fr'; } $locale = 'fr_FR'; switch ($lang) { case 'en': $locale = 'en_US'; break; case 'fr': $locale = 'fr_FR'; break; } // Récupère le Bootstrap $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); $bootstrap->bootstrap('Locale'); $localeResource = $bootstrap->getResource('Locale'); $localeResource->setLocale($locale); // TODO: charger csv en fonction du module ou autre pour pouvoir éclater les csv et alléger le traitement $filePath = str_replace(chr(92), chr(47), APPLICATION_PATH . '/../etc/langs/' . $locale . '/home.csv'); $translate = new Zend_Translate('csv', $filePath, $lang); Zend_Registry::set('Zend_Translate', $translate); $view = $bootstrap->getResource('View'); $view->setTranslator($translate); }
Ou tu peux sinon utiliser un plugin de ressource pour ta locale et ton translate, mettre tes paramètres dans le fichier ini, et charger ensuite d'abord ta locale (bootstrap('locale')) et ensuite ton translate.
A+ benjamin.
Hors ligne
Merci Delprog pour ta réponse.
En fait je pensais passer par le boostrap à cause des routes qui y sont définies : le Translate doit être réalisé avant car mes routes sont traduites.
Ton code une fois adapté au mien indique une erreur 'Could not find a translator' pour Zend_Controller_Router_Route. Cette erreur me semble normale puisque mes routes sont définies dans mon bootstrap et que mon translate maintenant est dans un plugin.
Les routes peuvent-elles être définies dans un plugin ?
Hors ligne
Après pas mal de tests, j'en arrive à la conclusion qu'il est impossible de définir les routes dans un plugin.
class Plugin_Route extends Zend_Controller_Plugin_Abstract { public function routeShutdown(Zend_Controller_Request_Abstract $request) { Zend_Loader::loadClass('Zend_Controller_Router_Rewrite'); $router = new Zend_Controller_Router_Rewrite(); $route = new Zend_Controller_Router_Route( "/:@language/:@controller/:@action/*", array( "language" => Zend_Registry::get('Zend_Locale'), "module" => "frontend", "controller" => "index", "action" => "index" ), array('language' => '[a-z]{2}') ); $route->assemble(array('controller'=>birds', 'action'=>'list', 'language'=>'en')); $router->addRoute("birds",$route); $frontController = Zend_Controller_Front::getInstance(); $frontController->setRouter($router); } }
Ce code fonctionnait lorsqu'il était dans mon bootstrap _initRoutes() et que la fonction d'initialisation _initTranslate() était juste au-dessus.
Lorsque j'ai créé le plugin Translate.php, il manquait le Translator par défaut pour les _initRoutes().
J'ai donc tenté de mettre mes routes dans un plugin Route.php (ci-dessus), et depuis mes routes de la forme /language/controller/action ne fonctionnent plus. Evidemment je n'ai aucun problème pour les routes "d'origine" qui sont de la forme /module/controller/action. Seules mes routes rewrited ne fonctionnent plus.
Etant débutant, j'avoue ne pas comprendre comment sortir de ce problème.
Hors ligne
Salut,
je pense que la partie de code que tu nous présentes devrait plutôt être écrite dans la méthode routeStartup au lieu de routeShutdown => Zend_Controller_Plugin
++
Hors ligne
Salut,
J'ai essayé en routeStartup, mais le résultat est le même.
J'ai tenté mon Translate en routeStartup ensuite avec mon Route en routeShutdown, et même chose.
Mon Translate.php doit obligatoirement s'effectuer avant mon Route.php car mes routes sont traduites et donc le rewrite utilise mon Translate.
Quand ça coince ...
Hors ligne
Tu peux définir l'index de ton plugin dans la pile du plugins broker.
Hors ligne
Salut 3uclide,
Je défini déjà l'ordre d'execution en faisant l'appel aux plugins dans mon Bootstrap.D'abord Translate, et ensuite Routes. Malheureusement mes routes traduites ne fonctionnent pas lorsque je les définies dans un plugin.
Lorsque tout était dans mon Bootstrap (Translate puis Routes), cela marchait.
C'est la récupération de la langue dans l'url qui m'impose de sortir du bootstrap.
Je pense que ZF ne permet pas d'avoir un site multilingue avec des urls traduites et d'autoriser en même temps un accès direct à une page intérieure traduite.
Dernière modification par Flizer (30-12-2009 11:43:03)
Hors ligne