Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'arrives bien à récupérer le controlleur, mais j'aimerais aussi récupérer l'action du controlleur, avant d'arriver dans le controlleur (dans le fichier bootstrap, donc l'action qui 'devrait' être appelée)
class MachinController extends Zend_Controller_Action { public function indexAction() { } }
(dans ce cas, le 'index', voire le 'indexAction' )
Idem : j'aimerais récupérer la route qu'il va emprunter, dans le cas où les routes sont comme ceci :
foreach($menu_menu as $k => $v) { $router->addRoute( $v['route'], new Zend_Controller_Router_Route( $v['url'], array( 'controller' => $v['controller'], 'action' => $v['action'], 'module' => $v['module'], ) ) ); }
Comment savoir quelle sera la route 'courante' ?
Merci par avance,
Hors ligne
Salut kiemtso,
j'ai pas bien compris ce que tu désires faire. Récupérer l'action qui va être éxecutée? (la pauvre )
Si tel est le cas, tu dois voir du côté des "routes" réalisées lors du dispatch de l'application. Pour cela, crées un plugin et enregistre le lors du bootstrap de ton application, dans la méthode run() de ton boostrap.
public function run() { $errorHandler = new Zend_Controller_Plugin_ErrorHandler(); $front = Zend_Controller_Front::getInstance(); $default = $front->getDefaultModule (); if (null === $front->getControllerDirectory ( $default )) { throw new Zend_Application_Bootstrap_Exception ( 'No default controller directory registered with front controller' ); } //ADDED the route plugin registration. $front->registerPlugin(new Mon_Plugin_BiRoute()); //<----ici $front->setParam ( 'bootstrap', $this ); $front->dispatch (); }
En fait, lors du dispatch, ton frontController réalise dans l'ordre la méthode routeStartup des plugins qui ont été enregistrés, la méthode route du routeur, la méthode routeShutdown des plugins enregistrés, la méthode dispatchLoopStartup des plugins, la predispatch et va ensuite appeler le dispatch du dispatcher de ton application (j'espère que jusque la tu m'as suivi, parce que moi pas! )
La requete est formatée suivant l'URI lors de l'appel à la méthode route du routeur. Si tu veux donc intervenir il faut le faire après. Tu peux le faire avec le plugin personnalisé que tu as précedemment enregistré lors du bootstrap, lors du routeShutdown() de ce dernier, via l'objet request passé en paramètre lors du routeShutdown(Zend_Controller_Request_Abstract $request).
J'espère avoir été assez clair lors de l'explication
Je te laisse explorer un peu par toi même comment trouver les infos que tu cherches dans la requête si tu bloques hésites pas
Dernière modification par Gorgoth (05-03-2010 09:37:40)
Hors ligne
J'arrives à récupérer ceci :
$fc = Zend_Controller_Front::getInstance(); $controller = $fc->getRequest()->controller; $action = $fc->getRequest()->action;
Seulement, j'aimerais le récupérer beaucoup plus tôt dans l'exécution du programme, pas seulement à partir du controlleur du front
Hors ligne
ce que tu viens d'écrire, tu le réalises quand? Précise un peu plus stp que je puisse t'aider
Hors ligne
Bonjour,
Pour prendre un exemple :
je vais chercher dans la base de données la configuration de la page en question, en fonction du controlleur et de l'action.
Donc, dans la base, ca ressemble à ca :
id
controller_id
action_id
configuration
L'idée est de récupérer le plus tôt possible ce champ dans la base. J'en ai besoin 'avant' le controlleur, vu que celui-ci prend les options de configuration.
Alors je pourrais toujours le mettre dans le controlleur, sauf que : lorsqu'il y a beaucoup de controlleurs, c'est pénible de l'écrire dans chaque.
Il doit y avoir une méthode pour récupérer les infos avant, pour que chaque controlleur ait l'info lorsqu'il est instancé.
Voilà,
Merci,
Hors ligne
Utilise donc comme expliqué un plugin dans le routeShutdown() ou fias un controller avec tes traitements dans la méthode init, et fait hériter tous tes controllers de celui ci.
Ce genre de problématique (effectuer un traitement commun au démarrage de tous les controllers) a déjà été abordé plusieurs fois sur ces forums.
Hors ligne