Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-08-2011 14:52:02

Zariel
Nouveau membre
Date d'inscription: 12-08-2011
Messages: 8

Application modulaire et bootstrap des modules

Bonjour à tous! smile
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. hmm

Voici le Bootstrap de mon module Default :

Code:

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 :

Code:

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. sad
Merci à vous et bonne journée ! big_smile

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

 

#2 12-08-2011 18:54:11

Alcide_
Membre
Lieu: Brest
Date d'inscription: 20-03-2010
Messages: 31
Site web

Re: Application modulaire et bootstrap des modules

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 :

Code:

[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

 

#3 13-08-2011 10:43:49

Zariel
Nouveau membre
Date d'inscription: 12-08-2011
Messages: 8

Re: Application modulaire et bootstrap des modules

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

 

#4 13-08-2011 12:24:15

Zariel
Nouveau membre
Date d'inscription: 12-08-2011
Messages: 8

Re: Application modulaire et bootstrap des modules

glenn.c a écrit:

à tu une fonction nommée "_initView()" dans ton bootstrap (pour pouvoir l'appeler avec $this->bootstrap() ) ?

Ouep, la suivante :

Code:

[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

Code:

<?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 :

Code:

[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. smile

Dernière modification par Zariel (13-08-2011 12:28:28)

Hors ligne

 

#5 13-08-2011 13:17:15

Alcide_
Membre
Lieu: Brest
Date d'inscription: 20-03-2010
Messages: 31
Site web

Re: Application modulaire et bootstrap des modules

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 wink ).

Code:

[lang=php]
protected function _initView(){
    /*code*/
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer');
    $viewRenderer->setView($view);
    return $view;
}

Hors ligne

 

#6 13-08-2011 15:09:17

Zariel
Nouveau membre
Date d'inscription: 12-08-2011
Messages: 8

Re: Application modulaire et bootstrap des modules

Nickel le coup du viewRenderer ça marche au top. wink

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

 

#7 14-08-2011 11:09:22

Alcide_
Membre
Lieu: Brest
Date d'inscription: 20-03-2010
Messages: 31
Site web

Re: Application modulaire et bootstrap des modules

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

 

#8 14-08-2011 19:32:52

Zariel
Nouveau membre
Date d'inscription: 12-08-2011
Messages: 8

Re: Application modulaire et bootstrap des modules

Franchement merci. Tu gères ! big_smile 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. smile

Hors ligne

 

#9 15-08-2011 13:25:39

Alcide_
Membre
Lieu: Brest
Date d'inscription: 20-03-2010
Messages: 31
Site web

Re: Application modulaire et bootstrap des modules

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é! big_smile

Hors ligne

 

#10 15-08-2011 16:19:09

Ender
Membre
Date d'inscription: 01-09-2009
Messages: 52

Re: Application modulaire et bootstrap des modules

Zariel a écrit:

Franchement merci. Tu gères ! big_smile 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. smile

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. smile

Hors ligne

 

#11 15-08-2011 16:39:20

Zariel
Nouveau membre
Date d'inscription: 12-08-2011
Messages: 8

Re: Application modulaire et bootstrap des modules

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 ! big_smile

Hors ligne

 

#12 19-08-2011 18:32:22

Demyio
Nouveau membre
Date d'inscription: 19-08-2011
Messages: 2

Re: Application modulaire et bootstrap des modules

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 à :

Code:

[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

 

#13 19-08-2011 23:08:42

Demyio
Nouveau membre
Date d'inscription: 19-08-2011
Messages: 2

Re: Application modulaire et bootstrap des modules

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 :

Code:

[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

 

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