Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous!
Je post ici car j'ai un petit problème lors du développement de mon application grâce à ZF. En effet, j'ai fait choisi de faire une application modulaire, et je possède un layout pour chaque module. Ça j'ai réussi à le configurer, mais le problème est que je n'arrive pas à définir les placeholders dans le Bootstrap de chaque module.
Voici le Bootstrap de mon module Default :
class Default_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initPlaceholders() { $this->bootstrap('View'); $view = $this->getResource('View'); /* Feuilles de style globales du module */ $view->headLink()->appendStylesheet('/css/application_default.css'); /* Header et footer */ $view->render('_header.phtml'); $view->render('_footer.phtml'); $view->placeholder('header'); $view->placeholder('footer'); return $view; } }
Je souhaiterais donc pouvoir insérer le contenu des fichiers _header et _footer, dans le layout. Le problème c'est que ça ne marche pas du tout ! J'obtiens une belle erreur du genre :
Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Resource matching "View" not found' in /home/zariel/workspace/projet/library/Zend/Application/Bootstrap/BootstrapAbstract.php:692 Stack trace: #0 /home/zariel/workspace/projet/library/Zend/Application/Bootstrap/BootstrapAbstract.php(627): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('View') #1 /home/zariel/workspace/projet/library/Zend/Application/Bootstrap/BootstrapAbstract.php(584): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap('View') #2 /home/zariel/workspace/projet/application/modules/default/Bootstrap.php(7): Zend_Application_Bootstrap_BootstrapAbstract->bootstrap('View') #3 /home/zariel/workspace/projet/library/Zend/Application/Bootstrap/BootstrapAbstract.php(667): Default_Bootstrap->_initPlaceholders() #4 /home/zariel/workspace/projet/library/Zend/Application/Bootstrap/BootstrapAbstract.php(620): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('placeholders') #5 /home/zariel/workspace/projet/library/Zend/App in /home/zariel/workspace/projet/library/Zend/Application/Bootstrap/BootstrapAbstract.php on line 692
Donc voila, j'implore votre aide ! Car là je sèche.
Merci à vous et bonne journée !
EDIT : Petite précision, le code ci-dessus fonctionne dans le Bootstrap principal, fin si on enlève les 4 lignes pour inclure header et footer, et qu'on met le reste tel quel dans le Bootstrap principal, ça fonctionne. Si on enlève également les 4 lignes dans le Default_Bootstrap, ça met la même erreur.
Dernière modification par Zariel (12-08-2011 15:00:06)
Hors ligne
Alors... première question concernant cette portion de code :
$this->bootstrap('View');
$view = $this->getResource('View');
à tu une fonction nommée "_initView()" dans ton bootstrap (pour pouvoir l'appeler avec $this->bootstrap() ) ?
si oui retourne-elle une instance de Zend_View (pour pouvoir la récupérer avec $this->getResource() ) ?
tu peux tester l'existence d'une ressource avec la méthode "hasResource()" de ton bootstrap.
Ensuite, je ne pense pas que l’utilisation de "render" et de "placeholder" ait vraiment sa place dans le bootstrap.
Je te conseillerais plutôt d'utiliser l'aide de vue "partial" directement dans ton script de layout.
En exemple :
[lang=php] /* *default.phtml */ <?=$this->partial('/path/to/header.phtml'); ?> <?=$this->layout()->content; ?> <?=$this->partial('/path/to/footer.phtml'); ?>
Ce n'est pas la seul solution mais sûrement la plus simple dans ton cas vu que tu n'as pas l'air d'avoir besoin de réaliser des traitements avant le rendu de tes vues partielles.
Dernière modification par glenn.c (13-08-2011 09:51:54)
Hors ligne
glenn.c a écrit:
Ce n'est pas la seul solution mais sûrement la plus simple dans ton cas vu que tu n'as pas l'air d'avoir besoin de réaliser des traitements avant le rendu de tes vues partielles.
Qu'entends-tu par traitement?
Hors ligne
glenn.c a écrit:
à tu une fonction nommée "_initView()" dans ton bootstrap (pour pouvoir l'appeler avec $this->bootstrap() ) ?
Ouep, la suivante :
[lang=php]protected function _initView() { $view = new Zend_View(); /* Doctype utilisé */ $view->doctype('HTML5'); /* Titre de la page */ $view->headTitle('ProjetTest') ->setSeparator(' - '); /* Meta */ $view->headMeta()->setCharset('utf-8'); /* Feuilles de style globales du site et icône */ $view->headLink(array('rel' => 'shortcut icon', 'href' => '/images/favicon.ico'), 'APPEND'); $view->headLink()->appendStylesheet('/css/application.css'); /* Scripts globaux du site */ $view->headScript()->appendFile('/js/jquery-1.6.2.js'); return $view; }
Donc oui je retourne bien une instance de Zend_View si je ne dis pas de connerie.
Concernant le header et le footer j'ai simplement fait un coup de
<?php echo $this->render('_header.phtml') ?>
dans le layout, ce qui est bien plus simple.
Néanmoins subsite le problème de l'inclusion d'une feuille de style CSS pour toutes les vues du module Default, via le Bootstrap. Le code suivant ne fonctionne donc toujours pas :
[lang=php]class Default_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initTest() { $this->bootstrap('View'); $view = $this->getResource('View'); /* Feuilles de style globales du module */ $view->headLink()->appendStylesheet('/css/application_default.css'); return $view; } }
Voila voila.
Dernière modification par Zariel (13-08-2011 12:28:28)
Hors ligne
Par "traitement" j'entends l'exécution de code métier pour générer/récupérer des valeurs à transmettre à la vue, en gros tu n'as pas besoin d'appeler la méthode d'un contrôleur pour effectuer le rendu de ta vue.
Pour l'utilisation du "render" je dis excellente idée ! beaucoup moins gourmand en ressource que l'aide de vue, surtout que tes scripts "header" et "footer" on l'air d'être statique (on en revient à ce que je dis plus haut).
Car l'aide de vue "partial" deviendrait plus intéressante si tu avais besoin de passer à ta vue partielle des variables avec une portée limitée à ce script.
Ton problème de vue vient sûrement du fait que la vue que tu configures dans ta méthode "initView()" n'est pas utilisée pour le rendu de tes actions.
Il faudrait que tu passes ta vue à l'aide d'action "ViewRenderer" à la fin de ta méthode (avant le "return" bien sûr ).
[lang=php] protected function _initView(){ /*code*/ $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer'); $viewRenderer->setView($view); return $view; }
Hors ligne
Nickel le coup du viewRenderer ça marche au top.
Par contre, tu as dit :
Pour l'utilisation du "render" je dis excellente idée ! beaucoup moins gourmand en ressource que l'aide de vue, surtout que tes scripts "header" et "footer" on l'air d'être statique (on en revient à ce que je dis plus haut).
Car l'aide de vue "partial" deviendrait plus intéressante si tu avais besoin de passer à ta vue partielle des variables avec une portée limitée à ce script.
En l’occurrence, pour le moment j'ai juste voulu mettre en place grossièrement la structure globale. J'ai donc comme tu le dis des scripts header et footer statics. Mais le fait est que je souhaiterais, dans le header, afficher des résultats en fonction de ce qui se trouve dans ma base de données. Penses-tu que je devrais utiliser partial plutôt que render du coup, tout du moins pour le header?
Hors ligne
Dans ce cas, je te conseillerais plutôt de jouer avec la pile d'action (ActionStack).
Tu pourras exécuter plusieurs d'actions (après l'action principale) et effectuer les rendus dans des segments différents.
Zend_Layout et ActionStack (J.Pauli)
Performance de rendu (doc ZF)
Action Helpers (doc ZF)
Hors ligne
Franchement merci. Tu gères ! Tu pourrais pas me dire comment tu fais pour savoir tout ça? Genre t'as pioché des trucs un peu partout, lu un tuto spécial, lu, relu et compris entièrement la doc? xD
Mais en tout cas, merci.
Hors ligne
La majorité des questions que tu te poseras trouveront une réponse dans la doc, je te conseil de prendre du temps pour la lire entièrement et surtout ne jamais hésiter à se plonger directement dans le code de la librairie, c'est le meilleur tuto' que j'ai trouvé!
Hors ligne
Zariel a écrit:
Franchement merci. Tu gères ! Tu pourrais pas me dire comment tu fais pour savoir tout ça? Genre t'as pioché des trucs un peu partout, lu un tuto spécial, lu, relu et compris entièrement la doc? xD
Mais en tout cas, merci.
Quand tu utilises ZF depuis un moment, tu apprends à le connaître et tu acquiers également une façon de raisonner et de voir les choses particulière.
Hors ligne
Okey merci beaucoup pour vos conseils, je crois qu'il me reste plus qu'à bouffer la doc du ZF. :p
Bonne journée, et merci encore !
Hors ligne
Bonjour.
J'essaye d'ajouter des modules à mon application et je suis confronté au même problème que Zariel.
Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Resource matching "view" not found'
J'ai effectué les modifications suivantes à mon application.ini
;remplacer
;resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
;ajouter
resources.modules[] = ""
resources.frontcontroller.defaultmodule = "site"
J'ai créé la structure de répertoire qui va bien, préfixé mes controllers avec le nom du module, etc… Si j'enlève des fichiers de bootstrap des modules les appels à :
[lang=php] $this->bootstrap('view'); $view = $this->getResource('view');
tout fonctionne bien (les css et quelques trucs en moins biensûr)
J'ai essayé le coup du viewRenderer mais rien n'y fait. Ca fait 1 heure que je suis dessus et je ne trouve pas de solution. Vos conseils seront les bienvenues.
Hors ligne
Bon finalement j'ai trouvé une solution à mon problème mais je ne comprend pas pourquoi ça ne fonctionnait pas pour moi alors que pour Zariel ça fonctionnait !
Pour ceux qui serait confronté au même problème voici le code qui fonctionne :
[lang=php] $this->getApplication()->bootstrap('view'); $view = $this->getApplication()->getResource('view');
En y réfléchissant, je me dis que c'est peut être normal de devoir passer par getApplication() vu que le bootstrap des module n'étend pas Zend_Application_Bootstrap_Bootstrap mais Zend_Application_Module_Bootstrap.
Si toutefois quelqu'un pouvait confirmer mes dires, ou m'expliquer le pourquoi du comment, je lui en serai gré.
Hors ligne
Pages: 1