Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
Je construit actuellement le squelette de mon site. Pour l'instant, j'ai un fonctionnement par module et multilingue.
Je commence à regarder le principe des layouts pour inclure mon header et mon menu automatiquement.
Quelques précision :
- Le header doit être identique sur tout le site.
- Le menu est spécialisé par module.
J'ai donc suivit le cours de "developpez" => http://julien-pauli.developpez.com/tuto … nd-layout/
J'ai choisit l'insertion de layout par le helper de vue "ActionHelper".
J'ai donc ceci dans mon bootstrap
Zend_Layout::startMvc($config->layout);
Voilà mon fichier de configuration:
[general] db.adapter = PDO_MYSQL db.config.host = localhost db.config.username = root db.config.password = **** db.config.dbname = site1 layout.layout = template layout.contentKey = contenu layout.layoutPath = ./../application/modules/news/views/layouts layout.layoutModule = news
Voici le code du fichier template.phtml:
<?php echo $this->action('header','index','news') ?> <?php echo $this->layout()->contenu?>
et voilà l'arborescence :
|->site1
|->application
|->models
|->modules
|->news
|->controllers
|->views
|->layout
|->template.phtml
|->scripts
|->affichage
|->index.phtml
|->library
|->Zend
|->public
|->index.php
Donc comme vous pouvez le voir, j'ai configurer mon repertoire de layout pour pointer vers le dossier suivant
=> \application\modules\news\views\layouts
Le problème est que je pointe vers le module news. Donc cela marche bien pour le menu que j'inclus dans les pages de ce module mais comment faire pour les autres modules ?
Comment faire également pour le header qui doit être identique sur toutes les pages?
En faite ma question est de façon générale : Quelle est le meilleur moyen d'insérer des layouts dans une appli par module?
Avez vous un modules spécial qui possède tous les layouts et tous les "templates" ?
Merci d'avance pour votre aide.
Hors ligne
Tu as la réponse sous tes yeux
regarde le prototype de la fonction $this->action($action, $controller, $module)
Tu peut atteindre l'action que tu veux qq soit son lieu.
donc, header tu peux le laisser comme il est, et pour ton menu :
$this->action('menu', 'index', Zend_Controller_Front::getInstance()->getRequest()->getModuleName());
D'ailleurs, je crois qu'on peut faire
$this->action('menu', 'index'); et le framework utilise le module courant
Hors ligne
C'est même mieux, car utiliser le frontController dans la vue... c'est pas trop l'esprit du MVC !
MVC and Why You Should Care
Hors ligne
Mr.MoOx a écrit:
C'est même mieux, car utiliser le frontController dans la vue... c'est pas trop l'esprit du MVC !
Heu... Qu'est ce qui est mieux que quoi ?
Hors ligne
$this->action('menu', 'index');
que ca
$this->action('menu', 'index', Zend_Controller_Front::getInstance()->getRequest()->getModuleName());
Hors ligne
Oki. C'est ce que je pensais.
Donc pour conclure:
J'ai créée un module mep (mise en page) dans lequel je met tous les layouts généraux. Dans mon cas, il y aura par exemple le header.phtml et je l'appelle depuis tous les autres modules de cette façon:
$this->action('header','index','mep');
Pour les layouts propres au module, je l'appel de cette façon:
$this->action('menu', 'index');
Je pense que c'est la meilleure façon d'avoir quelque chose de souple.
Sauf contre indication, je pars dans ce sens.
Merci encore pour votre aide. (vraiment utile ce forum )
Dernière modification par slaughter (28-04-2008 10:42:57)
Hors ligne
Il me vient une autre question :
Pourquoi passer par le fichier template.phtml pour fusionner les différentes vues et ne pas inclure directement les vues de mise en page (menu, header) directement dans la vue du module.
Dans mon cas je pourrais avoir dans le fichier \application\modules\news\views\script\affichage\index.phtml le contenu suivant:
- mon code html
- l'introduction de mon header <?php echo $this->action('header','header','mep');?>
- l'introduction de mon menu <?php echo $this->action('menu', 'index');?>
- la création du contenu dans la page.
exemple :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title><?php echo $this->escape($this->title); ?></title> <link rel="stylesheet" type="text/css" media="screen" href="<?php echo $this->baseUrl;?>/styles/site.css" /> </head> <body> <?php echo $this->action('header','header','mep');?> <?php echo $this->action('menu', 'index');?> <div id="content"> <h1><?php echo $this->escape($this->title); ?></h1> Voilà le contenu de ma page. </div> </body> </html>
ça marche tout aussi bien et cela est encore plus souple. Je peux inclure des vues dans n'importe quelle partie du contenu de la page.
Ne pensez vous pas que c'est la meilleure solution?
Dernière modification par slaughter (28-04-2008 21:41:09)
Hors ligne
Mais tu fais comme tu veux.
Comme je viens de le dire dans un autre poste, zend offre la liberté à l'utilisateur de choisir son organisation.
Perso, mon header est le même partout, donc, le DRY m'incite à le mettre dans layout.html
De plus, je te rappelle que tu as des aides du vue pour le doctype, les metas, title, etc...
Hors ligne
Oui, bien sur, je fait comme je veux. Mais "comme je veux" n'est pas forcément la bonne solution à long terme. C'est pour cela que je viens sur ce forum faire appel à des utilisateurs qui ont plus de recule que moi sur le ZF.
Ces deux solutions sont quand même vraiment différentes et il doit bien avoir des avantages et des inconvénients pour chacune de ces solutions...
Hors ligne
Y'a pas d'avantage ou d'inconvénient. La, je pense pas qu'on parle de bonne ou de mauvaise solution, mais d'alternative
Si ca ne te gène pas de mettre dans tous tes .phtml des
<?php echo $this->action('header','header','mep');?>
alors, pourquoi pas.
Moi, je préfère le mettre une seule fois dans mon layout.phtml
Hors ligne
Je trouve également que cela est plus propre d'avoir toute la "fusion" dans la fichier layout.phtml mais cela ne permet pas d'alterner entre les views que tu rajoutes et le contenu réelle de la page. Je ne sais pas si je suis très clair.
En gros ce n'est pas possible d'avoir dans le layout.phtml:
<?
echo $this->action('header','index','mep');
echo $this->layout()->contenu; //debut du contenu
echo $this->action('menu1','index','mep'); //un menu inséré dans le milieu du contenu
echo $this->layout()->contenu; //suite du contenu
echo $this->action('footer','index','mep');
?>
Ce code est évidemment complètement faux mais c'est pour montrer un peu la situation.
Maintenant que j'ai pu faire le pour et le contre, il ne me reste plus qu'à choisir.
Hors ligne
Biensur, ceci est un autre cas
il faut mettre echo $this->action('menu1','index','mep'); dans la vue de ton contenu
A chaque cas sa solution
Hors ligne
Oki. C'est bien ce que je pensais. Donc maintenant que j'ai compris le principe des différents composants, il me reste à choisir la meilleure façon de les utiliser.
Pour cela j'ai besoin de votre aide.
Une page se compose de cette manière.
-un header html => unique pour chaque page (titre de la page, mots clés etc)
-une bannière => identique sur tout le site
-un menu droit => unique à chaque module (menu de navigation dans le module)
-Le contenu => unique pour chaque page
-un pied de page => identique sur tout le site
Quelle est pour vous la meilleure façon de mettre cela en place?
Mon problème se situe dans le header html. Au départ je voulais avoir un "template" et inclure les différentes vues:
<?
echo $this->action('banniere','index','mep'); //mep est le module ou je créer les vues générales
echo $this->action('menu1','index','mep'); //un menu
echo $this->layout()->contenu; //le contenu
echo $this->action('footer','index','mep');
?>
Mais, de cette façon, je ne vois pas comment inclure mon header html.
Avez vous une piste?
Hors ligne
N'oublie pas les aides de vues pour ton header HTML ! (ce qui est entre <head> et </head>)
Voici une astuce simple :
voici un layout :
<?php $this->headLink()->appendStylesheet('/styles/'.$this->domain_name.'/styles.css'); ?> <?php $this->headTitle($this->hotspot_name, 'PREPEND'); ?> <?php $this->headTitle($this->domain_name, 'PREPEND'); ?> <?php $this->headTitle()->setSeparator(' / '); ?> <?php echo $this->doctype('XHTML1_STRICT') ?> <html> <head> <?php echo $this->headMeta() ?> <?php echo $this->headTitle() ?> <?php echo $this->headLink() ?> <?php echo $this->headScript() ?> <?php echo $this->headStyle() ?> </head> <body> <?php echo $this->layout()->content;?> </body> </html>
Dit toi que l'action (et donc la vue) qui est exécuter/rendu dans 'content' est générée AVANT layout.phtml
De ce fait, dans ton content tu peut mettre ca :
<?php $this->headTitle("horaires invalides"); ?> <h1>horaires invalides</h1> <p> La définition de vos plages horaires ne vous permettent pas d'accéder à ce hotspot maintenant. </p>
Ce qui fait que le rendu final sera (j'ai abrégé certains parties)
<!DOCTYPE ... <head> <title>pc-joff / Hotspot 1 / horaires invalides</title> <link href="/styles/pc-joff/styles.css" ... </head> <body> <h1>horaires invalides</h1> <p> La définition de vos plages horaires ne vous permettent pas d'accéder à ce hotspot maintenant. </p>
Ainsi, avec ca, ca t'évite de coller des <head></head> dans toutes tes vues et de mettre juste le nécessaire.
Je l'ai fait avec title, mais tu peux le faire avec les metas, les styles, etc...
Hors ligne
PARFAIT. C'est exactement ce que je recherchais. J'ai n'avais pas compris que les variables 'content' pouvait être utilisé dans la vue du 'layout'.
Je vais tester ça dès que je peux...
Merci beaucoup!!!
Hors ligne
Pages: 1