Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour , j'ai fais une installation modulaire comme ceci :
-application
--configs
---application.ini
---navigation.xml
--layouts
---site.phtml
---admin.phtml
--modules
---site
----bootstrap(module)
---admin
----bootstrap(module)
-Bootstrap(principal)
Pour récupérer un layout différent pour site et admin , j'ai effectuer à travaer un plugin une function presdispatch qui récupére le nom du module courant et tout fonctionne pas de soucis.
Maintenant dans mon Bootsrap du module admin, je souhaite charger un menu avec Zend_navigation , donc je créer mon fichier navigation.xml
Dans le bootstrap du module j'ajoute ceci :
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initNavigation() { $view = $this->bootstrap('layout')->getResource('layout')->getView(); $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); $view->navigation(new Zend_Navigation($config)); }
J'ai une fatal error
Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Resource matching "layout" not found'
Voici mon application.ini
[production] ;On affiche pas les erreurs en production phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 resources.frontController.throwExceptions = false bootstrap.path = APPLICATION_PATH "/Bootstrap.php" ;On défini le nom de class du Bootstrap principal bootstrap.class = "Bootstrap" ;On défini le chemin des modules resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.modules[] = "" ;On défini le module par défault resources.frontController.defaultControllerName = "index" resources.frontController.defaultAction = "index" resources.frontController.defaultModule = "site" ;On enregistre un namespace dans autoload autoloaderNamespaces.ep = "EP_" ;On défini le chemin du dossier application/layouts resources.layout.layoutpath = APPLICATION_PATH "/layouts" ;Plugins créer qui va cherché le nom du module courant pour affecter le bon layout resources.frontController.plugins.definirlayout = "EP_Controller_Plugin_Definirlayout" [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.throwExceptions = true
Apparement il ne trouve pas le layout
Hors ligne
normal, tu es dans Module_Bootstrap et pas dans le bootstrap par défaut
par exemple :
$this->getApplication()->getBootstrap()->bootstrap('layout')->getResource('layout')->getView();
Dernière modification par nORKy (18-03-2010 08:52:05)
Hors ligne
merci de ta réponse le code que tu m'as donné génére une erreur
Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Invalid method "getBootstrap"
Et à quoi sert d'avoir un bootstrap par module ci-celui-ci ne se comporte pas comme le Bootstrap principal ?
Pourtant j'ai lu un peu partout que les bootstrap modules hérité du bootstrap principal
Dernière modification par poseiidon (18-03-2010 11:19:51)
Hors ligne
En fouillant un peu j'ai résolu le probléme en remplaçant :
resources.layout.layoutpath = APPLICATION_PATH "/layouts"
par
admin.resources.layout.layoutpath = APPLICATION_PATH "/layouts"
;On défini le chemin du dossier application/layouts admin.resources.layout.layoutpath = APPLICATION_PATH "/layouts" ;Plugins créer qui va cherché le nom du module courant pour affecter le bon layout resources.frontController.plugins.definirlayout = "EP_Controller_Plugin_Definirlayout"
Pourtant une chose que je ne pige pas mon erreur avant et que le Bootstrap module ne trouvé pas le layout.
Pourtant j'ai créer un Plugin en presDispatch qui lui recupére le nom du module courant afn affecter le bon layout au modules et cela marche
Donc je me pose une question logique Ma function presDispatch demarre t'elle vraiment Avant le lancement du bootstrap module ?
Et biensur une raison qui aussi contredit ma logique et quand je rajoute admin.resources cela fonctionne bien.
Donc je ne comprend pas pourquoi je suis obligé de definir le module admin dans mon application.ini alors que c'est le role de la function que je lance en presDisptach.
Ca fonctionne mais je n'est pas envi d'avancé plus loin sans comprendre la logique , sinon à coup sur je vais me planté plus loin. Donc merci à ce qui pourront m'éclairé ou me filé un lien qui comprend la logique de démarrage modulaire. Merci
Hors ligne
Bonjour,
J'espère apporter quelques éléments de réponses à tes questions :
Il faut bien comprendre le fonctionnement du Zend Framework et de l'ordre dans lequel sont exécutés les processus.
Tu trouveras ici un bon support pour commencer : http://www.docstoc.com/docs/22437345/Zend-Framework-151
Sache que toutes les étapes présentes sur ce graphique ont lieu après que les bootstraps aient été exécutés.
Cela répond à l'une de tes questions : ton plugin adaptant le layout selon le module a donc lieu après l'exécution des bootstraps et non avant ou pendant.
Le point crutial à comprendre au niveau des bootstraps est le suivant :
1/ Sont exécutées en premier lieu toutes les méthodes _init<Name>() du bootstrap du module par défaut
2/ Sont exécutées ensuite tous les plugins de ressource du bootstrap du module par défaut dans l'ordre dans lequel ils sont déclarés dans la configuration. Il peut donc s'agir de "translate", "router", "modules", "layout", "db", ...
L'un de ces plugins engendre un traitement particulier, il s'agit de "modules", qui va opérer pour chaque module de l'applicaton les étapes 1 et 2 précédentes.
En bref, tous les bootstraps sont chargés au démarrage de l'application, et ce, avant n'importe quel traitement visualisable sur le graphique ci-dessus, et donc également peu importe le module que tu as appelé via l'URL (l'analyse de l'URL pour détecter le module appelé ne se fait qu'après le chargement de tous les bootstraps donc).
Il faut savoir que tu peux changer l'ordre de déclenchement des modules en utilisant la méthode bootstrap() d'un objet bootstrap, permettant ainsi d'accéder à une ressource de bootstrap sans attendre qu'elle ait été déclenchée dans l'ordre défini dans la configuration.
Il est donc possible dans une méthode _init<Name>() d'un module "A" d'exécuter un $this->bootstrap('layout') pour forcer l'exécution du plugin de ressource layout et de pouvoir récupérer son instance, et ce, pour le compte du module "A".
Il faut savoir ici que chaque module possède ses propres ressources, donc si tu veux accéder à partir du bootstrap du module "B" à une ressource chargée par le bootstrap du module "A", "C" ou "D" tu n'y arriveras pas en appelant la méthode getResource('layout') sur l'objet courant $this (bootstrap en cours) mais en appelant la méthode sur le bootstrap possesseur du plugin.
Dans le cas qui t'était proposé tu peux utiliser :
$myLayout = $this->getApplication()->bootstrap('layout')->getResource('layout')
afin de récupérer l'objet 'layout' du module par défaut (NB : s'il n'a pas encore été initialisé (ex: s'il est situé après le plugin de resource 'modules' dans la configuration) alors la méthode ->bootstrap('layout') s'en chargera (fameux changement d'ordre des déclenchements))
Si ça marche en ajoutant un plugin de ressource 'layout' à ton module 'admin' c'est que tu as tout simplement demandé le déclenchement d'une ressource propre à ton module, et tu arrives donc à le récupéré via getResource().
Note ici que c'est de la chance qu'il n'y ait pas d'effet de bord : en effet le plugin de ressource "layout" récupère le layout via un singleton, ce qui fait que tu récupères le layout qui avait été instancié dans le module par défaut. Reste que la ressource a été lancée deux fois (1 seule aurait suffit à ce stade) et que pour d'autres ressources cela n'aurait pas fonctionné de manière aussi transparente : tu aurais eu des instances différentes d'objets entre chaque module.
En espérant que cela éclaire un tant soit peu !
Dernière modification par mixomatis (18-03-2010 17:28:10)
Hors ligne
Coïncidence : en cours de lecture je tombe à l'instant sur un article qui est plutôt intéressant pour comprendre l'utilité des modules / plugins : http://weierophinney.net/matthew/archiv … Donts.html
Hors ligne
JE te remercie , d'avoir pris ton temps pour m'expliqué le processus.
Maintenant tout fonctinne comme une horloge et je suis passé au tuto du Zend_layout merci de toutes ces precisions que je garde précieusement
Hors ligne