Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Voilà, je me lance avec le MVC de Zend et j'ai une question à vous poser (après avoir lu plusieurs post, pas de réponse précise).
Question : j'ai une application comportant plusieurs modules qui partagent le même répertoire Model (pour mutualiser les classes métiers entre les différents modules).
L'arborescence serait du type :
<Racine-application>
<applications>
<default>
<controllers>
<models>
<views>
<module1>
<controllers>
<views>
<module2>
<controllers>
<views>
<module3>
<controllers>
<views>
Pouvez-vous me dire que mettre en plus dans le bootstrap pour lui indiquer que
- j'ai plusieurs modules ?
- j'ai un unique Model pour tous ces controlleurs ?
Merci d'avance pour votre aide.
kaboume.
Hors ligne
Bonjour,
C'est assez simple à faire. dans ton bootstrap tu ajoutes à ton controller pour les modules :
$front->addModuleDirectory('/applications');
Et pour ton répertoire models unique, il suffit d'ajouter le dossier dans le set_include_path :
set_include_path( 'applications/default/models/' . PATH_SEPARATOR . get_include_path() );
A+,
Damien
Dernière modification par Ysaak (21-09-2007 13:27:52)
Hors ligne
Bonjour ysaak,
Merci pour ta réponse.
J'ai finalement pris l'arborescence suivante :
<Racine-application>
<models>
<applications>
<module1>
<controllers>
<views>
<module2>
<controllers>
<views>
<module3>
<controllers>
<views>
J'ai bien intégrer tes modifs dans mon bootstrap :
<?php error_reporting(E_ALL|E_STRICT); date_default_timezone_set('Europe/Paris'); set_include_path('.' . PATH_SEPARATOR . './library' .PATH_SEPARATOR . './models/' .PATH_SEPARATOR . get_include_path()); include "./library/Zend/Loader.php"; Zend_Loader::loadClass('Zend_Controller_Front'); Zend_Loader::loadClass('Zend_Controller_Request_Http'); // setup controller $frontController = Zend_Controller_Front::getInstance(); $frontController->throwExceptions(true); $frontController->setControllerDirectory('./applications'); // run! $frontController->dispatch(); ?>
Mais lorsque je visualise dans IE à l'adresse http://localhost/module1/index/, j'ai l'erreur suivante :
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (module1) C:\wamp\www\library\Zend\Controller\Dispatcher\Standard.php:193 Stack trace: #0 C:\wamp\www\library\Zend\Controller\Front.php(911): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 C:\wamp\www\index.php(21): Zend_Controller_Front->dispatch() #2 {main} thrown in C:\wamp\www\\library\Zend\Controller\Dispatcher\Standard.php on line 193
Aurai-je oublié de préciser quelque chose ?
Dernière modification par kaboume (21-09-2007 15:01:05)
Hors ligne
Bonjour kaboume,
Il faut faire un
$front->addModuleDirectory('/applications');
et pas un setControllerDirectory.
cf message d'Ysaak.
A+, Philippe
Hors ligne
J'ai pas fait gaffe!
En effet, ça marche!
Merci à tous les 2!!!!!!!!!!!!
Hors ligne
Un plugin risque de faire son apparition un jour, il s'appelle modelLoader, et servira notamment à autoloader les modèles dans les controleurs, ou à partager "proprement" ses modèles entre controleurs de différents modules.
Pour le moment, cette technique est tout à fait juste et valable
Hors ligne
Rebonjour,
Je reviens sur ce post pour savoir comment récupérer le nom du module dans lequel je me trouve.
En effet, j'ai couplé mon MVC avec Smarty et j'ai besoin de pointer vers le bon répertoire de tempate (qui correspond au module) pour sélectionner ma vue.
Merci d'avance.
kaboume
Hors ligne
Salut kaboume,
Pour récupérer le nom du module dans lequel tu te trouve, il faut utiliser la méthode : getModuleName() de l'objet Request.
Il existe la même chose pour le controller et l'action.
@+
Hors ligne
Salut Ysaak,
Merci bcp!
Ca marche!
A+
Hors ligne
Bonjour,
Je n'arrive pas à faire fonctionner mon arborescence avec mes modules.
J'utilise l'arboresence suivante :
/application
/models
/modules
/admin
/controllers
/views
/default
/controllers
/views
/library
/public
Dans mon bootstrap :
<?php error_reporting(E_ALL|E_STRICT); date_default_timezone_set('Europe/Paris'); set_include_path( '.'.PATH_SEPARATOR. './application/models'.PATH_SEPARATOR. './library'.PATH_SEPARATOR. get_include_path() ); require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Controller_Front'); $frontController = Zend_Controller_Front::getInstance(); $frontController->addModuleDirectory('./application/modules'); $frontController->throwExceptions(true);
Lorsque que je vais sur mon http://localhost/, tout va bien. Il me sort bien le controller IndexController du module default mais lorsque je vais sur http://localhost/admin :
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Admin_IndexController")'
Quelqu'un a t'il une idée ?
Merci
Hors ligne
Hello,
Peux-tu donner le code de ton controleur Index de ton module Admin ?
Hors ligne
Ce message d'erreur signifie que le dispatcher a bien trouver le fichier du controller mais que la classe qu'il est censé contenir n'a pas été définie. En gros, assure toi que tu n'as pas fait d'erreur dans le nom de la classe et dans la casse.
Ta classe devrait se nommer Admin_IndexController. Attention aux majuscules.
Hors ligne
Ahhhh !
Merci messieurs ! En effet, il suffisait de renommer ma classe Admin_IndexController...
Bonne journée.
Hors ligne
Bonjour,
J'ai suivi exactement l'arborescence et le bootstrap de dug et j'ai le message d'erreur suivant à l'url http://localhost/admin :
Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in
Je pense que je dois avoir un problème au niveau de mon Admin_IndexController ou de l'organisation de mes fichiers.
Voici le code de mon Admin_IndexController :
class Admin_IndexController extends Zend_Controller_Action { function init(){ $this->initView(); $this->view->baseUrl = $this->_request->getBaseUrl(); } public function __call($method, $args) { $this->_forward('index'); } function indexAction() { $this->render(); } }
Au niveau de la vue, j'ai bien un répertoire index avec un le fichier index.phtml dans view de admin.
Spécialement, je ne vois pas ce que j'ai loupé. Si quelqu'un avait une piste...
Hors ligne
Hello,
Ta classe soit s'appeler en effet Admin_IndexController mais le fichier contenant ta classe doit s'appeler IndexController.
Donnc tu dois avoir ton controller dans :
/application
/models
/modules
/admin
/controllers
/default
IndexController.php
Dis moi si ca marche.
A+
Hors ligne
Oui c'est une des bizarrerie dans le nommage de des Classes dans ZF
A+JYT
Hors ligne
Effectivement, cela venait d'un problème de nommage de mon fichier de la classe Admin_IndexController. J'avais essayé différents nommages sauf celui-ci. Il faut bien préfixer le nom de la classe avec le nom du module mais pas le nom du fichier de la classe. Merci pour votre aide.
Maintenant je voudrais spécifier un module par défaut dans mon bootstrap. Voici mon nouveau bootstrap :
error_reporting(E_ALL|E_STRICT); date_default_timezone_set('Europe/Paris'); set_include_path( '.'.PATH_SEPARATOR. './application/models'.PATH_SEPARATOR. './library'.PATH_SEPARATOR. get_include_path() ); require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Controller_Front'); Zend_Loader::loadClass('Zend_Controller_Router_Route'); $frontController = Zend_Controller_Front::getInstance(); $frontController->addModuleDirectory('./application/modules'); // spécifier le module par défaut $frontController->setDefaultModule('default'); $frontController->setDefaultControllerName('index'); $frontController->setDefaultAction('index'); $frontController->throwExceptions(true); $frontController->dispatch();
Mais quand je vais à l'URL http://localhost/toto, je ne suis pas redirigé vers le module defaut, controler index, action index. J'ai ce message d'erreur :
Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (toto)' in
J'ai dû oublier quelque chose dans mon bootstrap ou dans ma fonction _call de mon Admin_IndexController ($this->_forward('index'). Pour être plus clair, je voudrais que dans le cas de mauvaise url (mauvais module, mauvais controller, mauvaise action), l'utilisateur soit redirigé par défaut vers une action d'un controller d'un module (suis-je clair).
Hors ligne
Hello,
Je pense que setDefaultModule() défini le module par défaut appelé lmorsque tu lance http://localhost.
Toit, ce que tu veux, c'est définir un module dans le cas d'une erreur de module (ex : module n'existe pas dans ton cas).
Je ne sais pas s'il existe une méthode spécifique pour définir ce module "d'erreur" ou s'il faut que dans ton code, tu catch l'exception et que tu redirige vers le module souhaité.
Si tu trouves, je suis preneur.
A+
Hors ligne
En faisant un catch sur Zend_Controller_Dispatcher_Exception, on peut effectivement effectuer une redirection vers le module/controller/action par defaut ou une URL.
Par contre, j'aimerais bien récupérer le module, le controller et l'action dans le lequel où on se trouve. Il a été dit plus bas qu'il existait les méthodes : getModuleName(), getControllerName() et getActionName() de l'objet Request. Mais je n'arrive pas à le mettre en place dans mon bootstrap. Un peu d'aide serait le bien venu...
Hors ligne
Pages: 1