Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1 2
Z_A_Resource_Modules n'est pas appelée par défaut, il me semble qu'elle ne l'est seulement si tu ajoutes en config :
resources.modules[] = '' // ou associée
En retirant cette ligne la resource de plugin 'Modules' ne sera pas appelée, et donc les bootstraps ne seront pas chargés.
Ce que j'ai commencé à faire pour ma part (même cas que toi), au lieu de gérer l'appel des bootstraps des modules dans le bootstrap par défaut, j'ai créé ma classe My_Application_Resource_Modules qui se charge de regarder quels sont les modules activés, et qui (non-implémenté encore) se chargera de charger les bootstraps au cas par cas.
// ajout en config de resourcePaths.My_Application_Resource = LIBRARY_PATH "/My/Application/Resource/" // qui vient complémenter le path de Zend_Application_Resource // appel de la ressourece resources.modules[] = '' // My_Application_Resource est parsé avant Zend_Application_Resource, c'est donc ma ressource "My_*" qui est utilisée à la place de celle de Zend
class My_Application_Resource_Modules extends Zend_Application_Resource_ResourceAbstract { /** * Defined by Zend_Application_Resource_Resource * * @return void */ public function init() { // your stuff return; } }
Après tu peux regarder comme la ressource de ZF fonctionne pour charger les bootstraps en adaptant le code histoire que tu ne charges pas tous les modules comme ici mais seulement les tiens
// class Zend_Application_Resource_Modules /** * Initialize modules * * @return array * @throws Zend_Application_Resource_Exception When bootstrap class was not found */ public function init() { $bootstrap = $this->getBootstrap(); $bootstrap->bootstrap('FrontController'); $front = $bootstrap->getResource('FrontController'); $modules = $front->getControllerDirectory(); $default = $front->getDefaultModule(); foreach (array_keys($modules) as $module) { if ($module === $default) { continue; } $bootstrapClass = $this->_formatModuleName($module) . '_Bootstrap'; if (!class_exists($bootstrapClass, false)) { $bootstrapPath = $front->getModuleDirectory($module) . '/Bootstrap.php'; if (file_exists($bootstrapPath)) { include_once $bootstrapPath; if (!class_exists($bootstrapClass, false)) { throw new Zend_Application_Resource_Exception('Bootstrap file found for module "' . $module . '" but bootstrap class "' . $bootstrapClass . '" not found'); } } else { continue; } } $moduleBootstrap = new $bootstrapClass($bootstrap); $moduleBootstrap->bootstrap(); $this->_bootstraps[$module] = $moduleBootstrap; } return $this->_bootstraps; }
Hors ligne
Je vais tester tout ca.
Merci de ton aide.
Je te tiens au courant.
Hors ligne
Je viens de trouver des exemples excellents de chargements de modules:
http://blog.vandenbos.org/2009/07/07/ze … le-config/
http://blog.vandenbos.org/2009/07/09/ze … n-sources/
Basés sur le blog suivant:
http://blog.keppens.biz/2009/06/zend-fr … onfig.html
David
Hors ligne
Merci pour les liens
Hors ligne
Pas de koi!
Faut bien s'entraider ;-)
Hors ligne
Bonjour,
Tout d'abord, merci pour ce post qui m'a éclaircit les idée sur ce sujet.
Mais il me reste encore des zones d'ombres?
voici mon arborecence :
application
+-admin
+-controllers
+-models
+-views
-Bootstrap.php
+-config
-application.ini
+-default
+-controllers
+-models
+-views
-Bootstrap.php
-Bootstrap.php
le bootstrap "général" :
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader(array('basePath' => dirname(__FILE__), 'namespace' => 'App_', return $autoloader; } protected function _initDoctype() { $this->bootstrap('view'); $view = $this->getResource('view'); $view->doctype('XHTML1_STRICT'); $view->addHelperPath('../application/views/helpers','App_View_Helper'); } protected function _initHTMLView() { $this->bootstrap('view'); $view = $this->getResource('view'); $view->headLink()->appendStylesheet('/css/mainStyle.css'); $view->headScript()->appendFile('/js/mainFonctions.js','text/javascript'); } }
Le Bootstrap du module default :
class Default_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader(array('namespace' => 'App_', 'basePath' => dirname(__FILE__))); return $autoloader; } }
Le Bootstrap du module Admin :
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader(array('namespace' => 'Admin_', 'basePath' => dirname(__FILE__))); return $autoloader; } protected function _initHTMLView() { $this->bootstrap('view'); $view = $this->getResource('view'); $view->headLink()->appendStylesheet('/css/mainAdmin.css'); $view->headScript()->appendFile('/js/mainAdmin.js','text/javascript'); } }
Ma première question porte sur Zend_Application_Module_Autoloader :
Est ce que je doit comme ici initialiser le basepath et namespace dans le bootstrap général ou le faire dans le Bootstrap du module "Default" ?
La seconde question c'est celle qui me pose de problèmes :
J'aimerais un _initHTMLView() different pour chaque modules, et ne pas l'initialiser dans le bootstrap "général"
mais lorsque je fais ça il ne charge aucuns style ni script ?
voici mon application .ini:
includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" resources.frontController.controllerDirectory.default = APPLICATION_PATH "/default/controllers" resources.frontController.controllerDirectory.admin = APPLICATION_PATH "/admins/controllers" resources.modules[] = autoloaderNamespaces[] = "My_" resources.layout.layoutPath = APPLICATION_PATH "/default/views/layouts" admin.resources.layout.layoutPath = APPLICATION_PATH "/admins/views/layouts" resources.view[] = admin.resources.view[] =
Je ne sait vraiment pas ou j'ai pas bon ? Je suis en train d'apprendre et c'est pas évident, ni très clair
D'ailleurs j'ai vraiment la désagréable sensation de perdre le fil !!
Merci d'avance pour votre aide
Dede
Dernière modification par Dede (23-09-2009 15:12:32)
Hors ligne
1/ Perso, je laisse la ressource module fourni avec le ZF se charger de ca, donc, je ne sais pas te répondre
2/ Il suffit de na pas écrire de fonction _initView dans ton boostrap général (ou alors, j'ai pas compris)
Hors ligne
1/ Comment fait tu pour faire cela ?
2/ j'ai bien essayer de ne pas faire _initHTMLView() dans le Bootstrap principal mais cela ne fonctionne pas ?
Dede
Hors ligne
1/ Rien suffit qu'il y est resources.modules[] = dans ta config et l'autoloader pour module sera créé
2/ hmm.. pas d'explication la..
Hors ligne
Désolé mais ce n'est encore pas clair,
que dois-je mettre dans le _initAutoload() du bootstrap général ? car j'ai bien essayé de supprimer ces deux lignes :
$autoloader = new Zend_Application_Module_Autoloader(array('basePath' => dirname(__FILE__).'/default',
'namespace' => 'App_',
));
return $autoloader;
mais ça ne fonctionne plus du tout, et je pense que c'est normal.
dans cet _initAutoload() "général" j'ai des appel à d'autre fonctions static qui servent dans toute l'appli
Je cherche mais je devient maboul.
Dernière modification par Dede (23-09-2009 16:30:03)
Hors ligne
Pages: 1 2