Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 17-03-2010 17:13:07

poseiidon
Membre
Date d'inscription: 11-06-2009
Messages: 32

Bootstrap module et zend_navigation

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 :


Code:

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

Code:

Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Resource matching "layout" not found'

Voici mon application.ini

Code:

[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

 

#2 18-03-2010 08:51:48

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: Bootstrap module et zend_navigation

normal, tu es dans Module_Bootstrap et pas dans le bootstrap par défaut
par exemple :

Code:

$this->getApplication()->getBootstrap()->bootstrap('layout')->getResource('layout')->getView();

Dernière modification par nORKy (18-03-2010 08:52:05)


----
Gruiiik !

Hors ligne

 

#3 18-03-2010 10:50:29

poseiidon
Membre
Date d'inscription: 11-06-2009
Messages: 32

Re: Bootstrap module et zend_navigation

merci de ta réponse le code que tu m'as donné génére une erreur

Code:

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

 

#4 18-03-2010 12:53:41

poseiidon
Membre
Date d'inscription: 11-06-2009
Messages: 32

Re: Bootstrap module et zend_navigation

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"

Code:

;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

 

#5 18-03-2010 17:23:49

mixomatis
Nouveau membre
Date d'inscription: 17-11-2009
Messages: 2

Re: Bootstrap module et zend_navigation

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 : 

Code:

$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

 

#6 18-03-2010 17:45:55

mixomatis
Nouveau membre
Date d'inscription: 17-11-2009
Messages: 2

Re: Bootstrap module et zend_navigation

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

 

#7 19-03-2010 16:02:00

poseiidon
Membre
Date d'inscription: 11-06-2009
Messages: 32

Re: Bootstrap module et zend_navigation

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages