Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Une question : si j'ai bien compris, j'ai un bootstrap.php par module, non ?
Dans ce cas il y a des directives que je dois mettre dans les deux, oui ?
Et pareil pour application.ini
Je trouve ça louche...
Je pense être passé à coté de quelque chose là.
Hors ligne
à par le module 'default' on a bien un bootstrap par module avec comme structure de base:
class <Modulename>_Bootstrap extends Zend_Application_Module_Bootstrap {}
dans ce cas tu hérites de toutes les directives de ton /application/Bootstrap.php, mais tu peux les réécrire si tu veux dans /application/modulename/Bootstrap.php
Dernière modification par lucien (05-05-2009 10:25:16)
Hors ligne
Pourquoi le module Default n'a pas de Bootstrap...
Dans cette structure si je vire le bootstrap de default, ben ça ne marche plus, non ? :
application admin config controllers forms helpers layouts models views bootstrap.php ventes config controllers forms helpers layouts models views bootstrap.php default config controllers forms helpers layouts models views bootstrap.php public .htaccess index.php scripts tests
Si je te suis j'aurais au moins un bootstrap dans mon module ventes et admin, j'aurais donc les directives suivantes dans les deux ? :
public function initRoutes() { $router = $this->_front->getRouter(); $router->addRoute( "communaute", new Zend_Controller_Router_Route( "/:communaute/:module/:controller/:action/*", array( "communaute" => "general", "module" => "default", "controller" => "index", "action" => "index" ) ) ); } public function initControllers() { $this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default'); $this->_front->addControllerDirectory($this->_root . '/application/admin/controllers', 'admin'); $this->_front->addControllerDirectory($this->_root . '/application/admin/controllers', 'ventes'); }
Comment éviter cette redondance ?
Hors ligne
Ceci est TA structure, mais je crois que la norme prévue par le ZF est un peu différente :
Ton module par défaut est la répertoires parents de tes modules.
En gros, le répertoire 'application' EST un module, sauf qu'il peut contenir un répertoire 'modules' avec X modules
Hors ligne
Disons que j'ai tiré cette structure des exemples donnés sur le site Zend et Developpez, et jusque là j'étais satisfait de cette compartimentation des modules...
Il semble en effet que la tendance ne soit plus celle là.
Donc si j'ai une structure comme celle que tu indiques :
application admin config controllers forms helpers layouts models views bootstrap.php ventes config controllers forms helpers layouts models views bootstrap.php config controllers forms helpers layouts models views bootstrap.php public .htaccess index.php scripts tests
Cela signifie t-il que je peux me passer des deux bootstrap qui sont sous les modules admin et ventes ?
Et que je peux virer la ligne
$this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default');
de initControllers ?
Et pour les fichiers config.ini, même chose, ils peuvent aussi être supprimés des modules admin et ventes ?
Sauf si bien entendu on a des particularités à ce niveau. Sauf que la doc officielle me laisse songeur sur l'utilisation des fichiers ini et leur possible remplacement par du php.
J'avoue ne pas avoir une vision aussi claire qu'avant avec cette nouvelle version, je ne doute pas que tu vas me dire que le problème vient de moi, mais pour avoir lu d'autre forums, http://www.nabble.com/Zend-Framework-Co … 16154.html par exemple, j'ai vu que je n'étais pas le seul mal comprenant...
Quoiqu'il en soit, merci pour tes conseils.
J'ai trouvé ce lien : http://konductasoluciones.blogspot.com/ … dules.html
c'est en espagnol, mais pour le code ce n'est pas un problème.
Dernière modification par Jean-Marc Rigade (05-05-2009 09:13:51)
Hors ligne
en plus de la structure décrite dans ton dernier lien, tu peux ajouter dans chaque dossier de module un dossier 'forms', 'plugins', 'services', etc.. , et si tu préfixe correctement tes classes, elles seront automatiquement reconnues.
pour avoir une listes des types de ressources par défaut, tu peux regarder la classe Zend_Application_Module_Autoloader.
tu peux, bien sûr, les modifier, en supprimer ou en ajouter, par exemple dans l'un de tes bootstrap:
protected function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader(...); $autoloader->removeResourceType('dbtable'); $autoloader->removeResourceType('service'); $autoloader->addResourceType('table', 'models/tables', 'Model_Table'); }
sinon c'est toujours possible d'avoir des fichiers de config en php :
return array( 'phpsettings' => array( 'display_startup_errors' => 1, 'display_errors' => 1, 'error_reporting' => E_ALL ), 'autoloadernamespaces' => array( '0' => 'Core_', '1' => 'Site_' ), 'bootstrap' => array( 'path' => APPLICATION_PATH.'/Bootstrap.php', 'class' => 'Bootstrap' ), 'resources' => array( 'modules' => array('forum', 'admin'), 'frontcontroller' => array( 'moduledirectory' => APPLICATION_PATH.'/modules', 'throwexceptions' => 'true', 'params' => array( // ) ), 'layout' => array( 'layout' => 'layout', 'layoutPath' => APPLICATION_PATH.'/layouts' ), 'db' => array( 'adapter' => 'pdo_mysql', 'isdefaulttableadapter' => 'true', 'params' => array( 'hostname' => 'localhost', 'username' => 'user', 'password' => 'pass', 'dbname' => 'database', 'profiler' => array( 'enabled' => 'true', 'class' => 'Zend_Db_Profiler_Firebug' ) ) ) ) );
Dernière modification par lucien (05-05-2009 10:17:45)
Hors ligne
Ok !!!
Pas mal du tout, en effet...
Merci beaucoup pour tes lumières, sympa.
Hors ligne
Juste un détail, tus obligé d'avoir un bootstrap par module si tu veux que l'autoloader de ressources pour module soit chargé automatiquement par Zend_Application (sans avoir à instancier Zend_Application_Module_Autoloader)
Biensur, en supposant que tu respectes la structure défini par ZF.
Hors ligne
Mon but n'est certainement pas de sortir de ce qui est défini par Zend au contraire.
Donc au final, le contenu minimum d'un bootstrap.php ?
require_once 'Zend/Loader/Autoloader.php'; $autoloader = Zend_Loader_Autoloader::getInstance();
Hors ligne
Comment ca marche le bootstrap par module ?
Dans le dossier /modules/admin j'ai crée un fichier Bootstrap.php avec le code :
<?php class Admin_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initControllers() { ................. } }
et rien n'est initialisé pour le module admin. J'ai manqué une étape mais je vois pas ou .
Dernière modification par alien7 (12-05-2009 22:59:49)
Hors ligne
dans ton .ini il faut mettre resources.modules[] = pour que la resource de module soit chargé et donc que tes bootstraps soient exécutés
Hors ligne
Merci nORKy, ca marche maintenant. Mais j'ai un autre souci. Dans mon Bootstrap du module Admin, si je definit la method suivante :
<?php class Admin_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initView() { exit('stop'); $layout = Zend_Layout::getMvcInstance()->setLayout('admin'); } }
Maintenant si je rentre l'url du module default et bien le Bootstrap du module Admin est aussi execité ce qui provoque aussi un exit du code dans le module default.
Bizarre non ?
Ce que j'aimerais, c'est initalisé les controllers sans surchager Zend_Controller_Action, est ce possible avec Zend_Application ?
Merci
Dernière modification par alien7 (13-05-2009 14:12:20)
Hors ligne
non, ce n'est pas bizarre.
Lorsque tu bootstrap ton application, tu ne connais pas encore la requête, donc, tu ne sais pas quel module/action/controller va être exécuté.
Donc, touts modules qui possèdent une classe bootstrap, son bootstrapé.
Ce que tu cherches à faire (changer le layout en fonction du module) doit être réalisé dans un plugin.
Le bootstrap de module permet surtout de séparer une logique de code, pas de modifier le comportement de l'application en fonction du module demandé
Hors ligne
D'accord, merci pour l'explication.
Ce que j'aimerais, c'est initalisé les controllers sans dériver la class Zend_Controller_Action, est ce possible avec Zend_Application ?
Dernière modification par alien7 (13-05-2009 16:07:28)
Hors ligne
Ca dépends ce de que tu apelles initialisés.
Il faut savoir qu'avec la bootstrap fourni avec le ZF (que tu dois surment étendre), tes controllers on comme invokeArgs ton bootstrap d'application.
Prenons un exemple (que j'utilise) :
Certains modules ont des paramètres spécifiques, par exemple des chemins de répertoires :
;application.ini ; je possède un module nommé 'superv' resources.modules[] = superv.xmldirectory = "/usr/local/etc/superv/xml"
Je veux récupéré cette conf dans mon module (actuellement, j'ai pas trouvé mieux)
class Superv_DsensorController extends Zend_Controller_Action { protected $_options = array(); public function init() { $moduleBootstraps = $this->getInvokeArg('bootstrap') ->getPluginResource('modules') ->getExecutedBootstraps(); $this->_options = $moduleBootstraps['superv']->getOptions(); }
Ton controller a accès à ses options dans $this->_options. (echo $this->_options['xmldirectory'])
On peut surement améliorer cela, mais c'est déjà un bon début
Dernière modification par nORKy (13-05-2009 14:52:48)
Hors ligne
En fait pour l'instant je surcharge la method init() en héritant de la class Zend_Controller_Action, et dans tous mes controller je fais un parent::init();
J'aurai pensé qu'avec le Zend_Application cela soit simplifié
Dernière modification par alien7 (13-05-2009 16:06:35)
Hors ligne
pas besoin de faire parent::init();
Hors ligne
Juch a écrit:
pas besoin de faire parent::init();
Explique toi parce que si j'enleve parent::init() ca ne marche pas.
Hors ligne
Hello,
Il dit cela car la méthode init() de Z_C_A est vide donc il n'est pas nécessaire de l'appeler.
A+
Hors ligne
Ok je mets mon code alors :
class Model_Class_Action extends Zend_Controller_Action { public function init() { ............ } }
Tous mes controller dérive de cette class ci-dessus:
class IndexController extends Model_Class_Action { public function init() { parent::init(); // suite de l'init } }
Voilà comment je fais, je sais pas si c'est propre mais en tous cas ca marche. Là on est d'accord il faut bien parent::init().
Autre chose, je vois pas ou renger cette class, je la renge pour l'instant dans le dossier Model_Class, est ce correct ?
Merci
Hors ligne
Hello,
OK dans ce cas pour le parent::init()
Pour le rangement, je mets dans le dossier /library : dans 'Model/Class/Action.php'
A+
Hors ligne
Jean-Marc Rigade a écrit:
Pourquoi le module Default n'a pas de Bootstrap...
Dans cette structure si je vire le bootstrap de default, ben ça ne marche plus, non ? :Code:
application admin config controllers forms helpers layouts models views bootstrap.php ventes config controllers forms helpers layouts models views bootstrap.php default config controllers forms helpers layouts models views bootstrap.php public .htaccess index.php scripts testsSi je te suis j'aurais au moins un bootstrap dans mon module ventes et admin, j'aurais donc les directives suivantes dans les deux ? :
Code:
public function initRoutes() { $router = $this->_front->getRouter(); $router->addRoute( "communaute", new Zend_Controller_Router_Route( "/:communaute/:module/:controller/:action/*", array( "communaute" => "general", "module" => "default", "controller" => "index", "action" => "index" ) ) ); } public function initControllers() { $this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default'); $this->_front->addControllerDirectory($this->_root . '/application/admin/controllers', 'admin'); $this->_front->addControllerDirectory($this->_root . '/application/admin/controllers', 'ventes'); }Comment éviter cette redondance ?
Juste une remarque toute bete mais qui peut faire gagner du temps:
Ca fonctionnait en local mais pas sur mon serveur Linux.
C'est comme ca que je me suis apercu (en regardant les sources Zend) que le fichier bootstrap doit s'appeler "Bootstrap.php" et non "bootstrap.php".
Hors ligne
Pages: 1