Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
nouvel utilisateur du Zend Framework dans un cadre professionnel, j'ai pour tâche la réalisation d'un projet relativement complexe.
Pour respecter les normes de développement de l'entreprise et respecter aussi la structure de l'application imposée, voici les contraintes que je n'arrive pas à résoudre :
- structure modulaire :
application/
modules/
module1/
controleur.php
vues/
module2/
controleur.php
vues/
Voici la structure à respecter. Il faut aussi que le nom des actions de chaque contrôleur ne porte pas de suffixe (suffixe "Action" par défaut dans le Zend Framework). Il faut aussi que le nom des fichiers contrôleurs soit toujours le même, soit "controleur.php", et que le nom de la classe du contrôleur (par défaut ici "Modules1_IndexController") soit tout simplement conforme à ceci : "Module1Controller".
J'ai regardé dans la documentation Zend, et également directement les fichiers de codes du Front_Controller de Zend, et la seule solution que j'ai trouvé pour répondre à mes attentes est de modifier directement cette partie de la librairie Zend (méthodes "formatControllerName" et "formatActionName" de la classe abstraite "Zend_Controller_Dispatcher_Abstract").
Cela m'ennuie de modifier la librairie Zend pour des questions de maintenabilité ultérieur (en cas de mise à jour du framework par exemple). Je pense qu'il doit exister des méthodes de paramétrage pour ce cas mais je ne les ai pas trouvé.
Merci par avance pour l'aide que vous pourrez m'apporter.
Hors ligne
Vois la section 12.11. Utilisation de conventions de dossiers modulaires de la doc, tu trouveras surement les méthodes de re-nommage des controllers, modules, etc ...
Hors ligne
il faut surcharger le dispatcher
par contre si tu ne mets pas Action dans tes action et que tu n emets rien toutes les méthodes publique de ta classe controller seront exposées comme action donc impossible d'avoir des méthode de travail partagées par plusieurs action et contrôleurs
A+JYT
Hors ligne
Merci pour cette réponse. En effet, j'ai surchargé le dispatcher et ça fonctionne à merveille. J'ai un dernier petit souci cependant. Mon application n'affiche que le template du module défaut. Il passe bien par mon action, mais n'affiche pas son template mais le template du module défaut.
Ce que j'aimerai faire, c'est récupérer dans mon index.php le nom du module appelé. J'ai essayé la méthode suivante :
$moduleName = $frontController->getRequest()->getModuleName();
Mais il m'affiche un message comme quoi j'appelle la méthode "getModuleName" sur un non-objet.
Comment puis-je récupérer le nom de mon module appelé dans mon index ?
Hors ligne
Bonjour,
Dans ton index (bootstrap je suppose) tu ne peux pas encore connaitre le module appelé via Zend, seulement à la Mano en fonction de l'url.
Tu peux le faire qu'à partir du moment où le dispatcher du frontcontroller a commencé son boulot. Via un plugin de controlleur par exemple, dans lequel tu pourras connaitre les infos nécessaires durant toutes les phases du dispatching.
J'ai pas trop de temps là pour donner plus de détails, tu devrais trouver toutes les infos nécessaires sur les plugins dans les forums ou dans la doc ZF.
A+ benjamin.
Dernière modification par Delprog (29-04-2009 12:35:38)
Hors ligne
Je suis en train d'écrire mon plugin mais j'ai encore quelques petits soucis. Voici le code de mon plugin :
require_once 'Zend/Controller/Plugin/Abstract.php'; class Wsa_Controller_Plugin_AutoView extends Zend_Controller_Plugin_Abstract { public function __construct() { } public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); if (null === $viewRenderer->view) { $viewRenderer->initView(); } $view = $viewRenderer->view; $view->addScriptPath(MODULE_DIR . DIRECTORY_SEPARATOR . $request->getModuleName() . DIRECTORY_SEPARATOR . 'vues'); } }
Et voici le code de mon index (pas encore découpé en bootstrap pour l'instant) :
$frontController = Zend_Controller_Front::getInstance(); $frontController->registerPlugin(new Wsa_Controller_Plugin_AutoView); $frontController->setDispatcher(new Wsa_Controller_Dispatcher_Standard); $frontController->setModuleControllerDirectoryName(''); $frontController->addModuleDirectory(MODULE_DIR); Zend_Layout::startMvc(array( 'layoutPath' => APP_DIR . DIRECTORY_SEPARATOR . 'vues', 'layout' => 'index' ) ); $view = new Zend_View(); // Initialisation de la vue principale //$view->setScriptPath(MODULE_DIR . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'vues'); // repertoire par défaut des vues $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); $viewRenderer->setView($view) ->setViewBasePathSpec(':moduleDir/vues') // facultatif => comportement par défaut ->setViewScriptPathSpec(':action.:suffix')// par défaut : :controller/:action.:suffix ->setViewScriptPathNoControllerSpec(':controller/:action.:suffix') // facultatif => comportement par défaut ->setResponseSegment('body'); Zend_Controller_Action_HelperBroker::addHelper($viewRenderer); $frontController->throwExceptions(true); // run! $frontController->dispatch();
Ca pourrait presque fonctionner sauf que ça a exactement le même comportement qu'à la base, ça affiche toujours le template du module défaut
Si je suis passé à côté de quelque chose de gros comme une maison, merci de me faire signe !
Hors ligne
C'est bon j'ai trouvé Il suffisait tout simplement de supprimer les trois lignes suivantes pour laisser le comportement de ZF par défaut :
->setViewBasePathSpec(':moduleDir/vues') // facultatif => comportement par défaut ->setViewScriptPathSpec(':action.:suffix')// par défaut : :controller/:action.:suffix ->setViewScriptPathNoControllerSpec(':controller/:action.:suffix') // facultatif => comportement par défaut
Voilou si ça peut aider...
Hors ligne