Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-06-2007 20:50:24

gfabio
Nouveau membre
Date d'inscription: 29-06-2007
Messages: 3

[Zend_View][RC3] Gestion des layouts

Salut à tous,

Je déteste les répétitions header/footer dans les vues :

Code:

<?php echo $this->render('header.phtml'); ?>

<p>Ici mon contenu</p>

<?php echo $this->render('footer.phtml'); ?>

C'est ultra redondant. Rails et Symfony supportent les layouts et ça, c'est le bien. Je n'ai rien trouvé de "prêt-à-l'emploi" ou de similaire dans le framework Zend. Si vous avez implementé un système de ce type, je serais curieux de savoir comment.

Le projet que je développe actuellement repose sur une structure modulaire de type Symfony (puisque c'est à mes yeux la structure la plus adaptée) :

Code:

apps
    frontend
        modules
            default
                controllers
                views
                    scripts
                    helpers
                    filters
            blog
                controllers
                views
                    scripts
                    helpers
                    filters
        config
        templates

J'ai donc un template "layout.php" dans "apps/frontend/templates". J'aimerais pouvoir implémenter l'équivalent avec Zend Framework. C'est-à-dire inclure automatiquement les vues des différents modules/controllers dans la section "content" du layout via un magique $this->content_for_layout (c'est un exemple) :

Code:

<html>
<head>
    <title>Mon Super Layout Zend Framework</title>
</head>
<body>
<div id="header">
    <h1>Mon Super Layout Zend Framework</h1>
</div>
<div id="content">
    <?php $this->content_for_layout; ?>
</div>
</body>
</html>

Vos idées et astuces sont les welcome smile Merci d'avance pour vos réponses.

Hors ligne

 

#2 30-06-2007 14:06:00

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: [Zend_View][RC3] Gestion des layouts

Ouhhh, alors là mon gars tu mets les pieds dans le plat. C'est un sujet de discussion houleux qui agite en ce moment le petit monde Zendien. Aucune décision n'est actuellement prise, deux camps s'affrontent (cf. les proposals Zend_Layout vs Zend_View Enhanced, A ma gauche Ralph Schlinder, A ma droite Padraic Brady, le fier Irlandais).
Le premier prône un système de layout axé quand même sur les controllers et les actions, le deuxième propose un découpage plus net entre les controlleurs et les views, celles-ci ayant dans sa solution, un peu plus de liberté, dans le sens où elles sont à même de charger les data dont elles ont besoin et où elles peuvent être imbriquées à l'infini.

Et au milieu de tout ça, nous avons Matthew O'Phinney, concepteur du MVC (avec d'autres bien sûr) qui propose pour l'instant un système trés centré autour des controlleurs et des actions, qui par convention, appelle directement les view scripts correspondants. Il a rajouté récemment le ViewRenderer, qui doit, en théorie, encore plus automatiser le processus et nous faciliter la tâche (hé,hé,hé...).

Voilà, voilà.

Ah oui, le principal : dans ton cas, le Two Step View correspond exactement à ce que tu veux faire. C'est une proposition de Matthew (l'arbitre). Une recherche rapide dans les liens suivants tu permettras de trouver une tonne d'exemples et d'explications :

les tutoriaux,
le forum, tu tapes two step view dans la zone de recherche et tu trouveras ton bonheur.

Bon courage,
Fred

Dernière modification par fred wolf (30-06-2007 14:11:51)

Hors ligne

 

#3 30-06-2007 14:54:15

gfabio
Nouveau membre
Date d'inscription: 29-06-2007
Messages: 3

Re: [Zend_View][RC3] Gestion des layouts

Absolument nickel smile Un grand merci pour toutes ces infos ! Je pense avoir trouvé mon bonheur tongue

Gilles

Hors ligne

 

#4 01-07-2007 20:11:43

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: [Zend_View][RC3] Gestion des layouts

J'ai eu aussi le meme problème, j'ai aussi lu tous les threads concernant le 2 steps views mais je n'ai jamais vraiment été emballé. Puis j'ai trouvé comment faire avec le ZF d'origine et une méthode relativement simple.

Voila un exemple d'implementation : http://titerm.free.fr/ZF/samples.zip

Si tu as besoin de plus d'info, n'hesite pas.

Hors ligne

 

#5 02-07-2007 13:52:33

verboz
Membre
Lieu: France, Lille
Date d'inscription: 26-06-2007
Messages: 24
Site web

Re: [Zend_View][RC3] Gestion des layouts

Salut Titerm,
Moi j'ai besoin de plus d'infos :p.
Est ce qu'on utilisant Zend_layout, je peux décider est ce que je peux afficher une partie ou non dans mon template.

Y'aurait-il un tutorial en Français sur Zend_layout?

Cordialement

Hors ligne

 

#6 02-07-2007 14:35:07

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: [Zend_View][RC3] Gestion des layouts

je ne peux pas de donner d'info sur zend_layout. Il est tjs en dev, et moi, j'avais besoin de trouver une solution tout de suite.  D'ou la solution que je propose qui s'appuie sur le ZF natif.

Dans la solution que je propose, ce que tu demande est possible et très facile mettre en oeuvre.

Voici une breve description de ma solution.

Mon pb était qu'une vue est associé a chaque action (cad une vue dinstincte par module/controller/action)
Donc, je suis parti du principe que la vue du ZF, ca serait le layout. Je force donc la vue a utiliser via setScriptAction() dans l'init du controller.

Afin de pouvoir gerer plusieurs layout de facon automatique, j'ai définie un fichier ini dans lequel je dit quel layout utiliser en fonction du module/[controller]/[action].
De cette facon, je peux attribuer un layout a un module complet, et dire que pour tel controller ou tel action de tel controller, j'utilise un autre layout.

Pour chaque layout, dans ce meme fichier ini, je définie quel sera la liste des composants par default ( un composant, c'est un fragment de page, genre le banner, le menu, la pub, etc... chaque petite entitée fonctionnelle de ta page).

De la meme facon, une action peut surcharger ou non quels seront les composants a inclure dans le layout.
En générale, dans mes layouts, il y a au moins un bloc vide qui correspond a ce que doit afficher la page, c'est le composant central. Dans l'action, il suffit de d'indiquer le nom du composant en l'affectant au bloc du layout.
$this->view->components['central'] = array('compFAQ') par exemple
de la meme facon, si tu ne veux pas afficher la pub alors qu'elle est afficher par défault dans le layout
$this->view->components['pub'] = array();


Le zip est vraiment un truc brut de fonderie mais ca donne une idée du principe.
Y a 4 layouts et 4 composants,

J'ai une arbo simplifié
/config ou se trouve les ini (le layout.ini par exemple)
/controllers/ ou se trouve les helpers et les modules
/views ou se trouve les composants et les layouts


Le layout.ini a le format suivant
;;
;; Layout list per     modules (<modules>.layout),
;;                    module.controller (<module>.<controller>.layout)
;;                    module.controller.action (<module>.<controller>.<action>.layout)
;;

[layouts]
; Layout pour le module default
default.layout            = layout1
; Layout pour le module module1
module1.layout            = layout2
; Layout pour le controller test du module module1
module1.test.layout        = layout3
; Layout pour l'action foo du controller test du module module1
module1.test.foo.layout    = layout4

; Liste des composants a inclure dans chaque bloc et pour chaque layout
[components]
layout1.bloc2[]     = comp2
layout1.bloc2[]     = comp3
layout1.bloc2[]     = comp1
layout1.bloc2[]     = comp4
layout1.bloc3[]     = comp1
layout1.bloc3[]     = comp2
layout1.bloc3[]     = comp3

layout2.bloc2[]     = comp1
layout2.bloc2[]     = comp4
layout2.bloc3[]     = comp2
layout2.bloc3[]     = comp3

layout3.bloc2[]     = comp1
layout3.bloc2[]     = comp2
layout3.bloc2[]     = comp3
layout3.bloc3[]     = comp4

layout4.bloc2[]     = comp3
layout4.bloc3[]     = comp4

[componentsPath]
path                 = views/composants/ 


Voila, si ca peut t'être utile... smile

Hors ligne

 

#7 25-08-2007 03:58:38

poppy
Membre
Lieu: Toulouse
Date d'inscription: 07-08-2007
Messages: 92
Site web

Re: [Zend_View][RC3] Gestion des layouts

bonjour,

voila je vien de me maitre au MVC de ZF et je voudré fair la même chose que gfabio, j'ai une habitude de codé avec smarty ex:

la variable $PAGE = news|contact|article|annonce|etc..

puis dans mon index.php je fait un include('./'.$page.'.php'); et un $tpl->assign("PAGE", $page);

et pour changer de page je fait index.php?page=contact

je vouder fair la même chose en MVC

Code:

<html>
<head>
[...]
</head>

<body>
    <div id="header"></div>
    <div id="menu">
        <ul>
        [...]
        </ul>
    </div>
    <div id="content">
        {include file="$PAGE.html" name=$PAGE}
    </div>
    <div id="footer"></div>
</body>
</html>

si vous pouvez me montré un tuto pour maitre sa en place!! j'ai chercher "Two Step View" est j'ai trouver Xend mai je ne c'est pas comment l'implémanté !!

Cordialement,
Axel


Société : Audiofanzine
Config : iMac 27" @ 3,06 Ghz Intel Core 2 Duo, 4Go de Ram + écran 22"

Hors ligne

 

#8 25-08-2007 14:16:47

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Zend_View][RC3] Gestion des layouts

j'ai donné une solution à l'utilisation de template dans ZF ici => http://www.z-f.fr/forum/viewtopic.php?id=359

pour ton problème de partie commune voici ce qu'on fait dans plusieurs moteurs de vue

Code:

   protected function _run()
   {
      // récupère le chemin complet du template demandé
      $name = func_get_arg(0);
      // le template principal est considéré à la racine des templates
      // de l'application (ou du module).
      if (!isset($this->_ets->_mainTemplate)) $this->setMainTemplate(dirname(dirname($name)) . '/main.html');
      // initialiser ets
      require_once("TemplatesEngines/Ets/Ets.php");
      // on indique à l'arbre de données d'Ets quel est le template à inclure
      $this->_ets->_content = $name;
      $this->_ets->_templatesDir = dirname(dirname($name)) . '/';

      // rendu de la page
      printt($this->_ets, $this->_ets->_mainTemplate);
   }

on peut faire pareil avec phtml

Code:

   protected function _run()
   {
      // récupère le chemin complet du template demandé
      $name = func_get_arg(0);
      // le template principal est considéré à la racine des templates
      // de l'application (ou du module).
      if (!isset($this->_mainTemplate)) $this->setMainTemplate(dirname(dirname($name)) . '/main.phtml');
      // on indique à l'arbre de données quel est le template à inclure
      $this->_content = $name;
      $this->_templatesDir = dirname(dirname($name)) . '/';

      // rendu de la page
     include $this->_mainTemplate;
   }

et donc aussi avec smarty

le main template est un fichier placé à la racine des templates application/scripts/main.phtml dans le cas de phtml par exemple

ce main template contient l'entête le menu le pied tout ce qui est commun éventuellement paramétré par des variables de la vue (ex: $this->view->menu = true;)
et il inclus le template désigné par $this->_content (dans la vue)
voici l'exemple avec ets

Code:

{mask:main}
<html>
<head>
<style type="text/css">

body {
    background-color: #ccffcc;
}

</style>
</head>
<body>
<h1>ZF Multi Renderer : Ets</h1>
L'affichage est rendu par Easy Template System avec le message suivant passé en paramètre : <br>
- {message}

{include:{_content}}
</body>
</html>
{/mask}

et avec phtml

Code:

<html>
<head>
<style type="text/css">

body {
    background-color: #ccffcc;
}

</style>
</head>
<body>
<h1>ZF Multi Renderer : Phtml</h1>
L'affichage est rendu par Php avec le message suivant passé en paramètre : <br>
- <?php echo $this->message; ?>


<?php include $this->_content; ?>
</body>
</html>

je te laisse imaginer la chose en smarty
A+JYT

Dernière modification par sekaijin (25-08-2007 14:19:37)

Hors ligne

 

#9 25-08-2007 14:47:25

poppy
Membre
Lieu: Toulouse
Date d'inscription: 07-08-2007
Messages: 92
Site web

Re: [Zend_View][RC3] Gestion des layouts

je te remerci wink


Société : Audiofanzine
Config : iMac 27" @ 3,06 Ghz Intel Core 2 Duo, 4Go de Ram + écran 22"

Hors ligne

 

#10 28-08-2007 05:06:36

poppy
Membre
Lieu: Toulouse
Date d'inscription: 07-08-2007
Messages: 92
Site web

Re: [Zend_View][RC3] Gestion des layouts

bonsoir,

apré avoir testé vos codes, j'ai testé Zend_Layout est sa marche super voila ce que j'ai fait

index.php

Code:

<?php

error_reporting(E_ALL|E_STRICT);
date_default_timezone_set('Europe/Paris');

// WEBAPP_DIR."/Application/layouts/scripts/index.phtml
define("LAYOUT_DIR", WEBAPP_DIR."/Application/layouts");
[...]
require_once 'Zend/Loader.php';
spl_autoload_register(array('Zend_Loader', 'autoload'));

Zend_Layout::setup(array('path' => LAYOUT_DIR.'/'));

//Configure the viewrenderer/layout system to render content into index.phtml automatically
Zend_Layout::setDefaultLayoutName('index');



$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory(WEBAPP_DIR . '/Application/controller');

$front->throwExceptions(true);



try {
    $front->dispatch();
} catch (Zend_Exception $e) {
    echo "Récupère exception: " . get_class($e) . "<br />\n";
    echo "Message: " . $e->getMessage() . "\n";
}

?>

index.phtml

Code:

<!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" lang="fr">

<head>
    <title>Test Layout</title>
</head>

<body>
    <div id="header">
        <p>Header</p>
    </div>
    <div id="content">
        <?php echo $this->content; ?>
    </div>
    <div id="footer">
        <p>Footer</p>
    </div>
</body>

</html>

voila si sa peu aidé

Dernière modification par poppy (28-08-2007 05:56:48)


Société : Audiofanzine
Config : iMac 27" @ 3,06 Ghz Intel Core 2 Duo, 4Go de Ram + écran 22"

Hors ligne

 

#11 28-08-2007 09:16:36

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Zend_View][RC3] Gestion des layouts

c'est effectivement une voie que je n'avais encore exploré et qui semble être une généralisation de ce que je faisais avant Z-F
je pense que je vais voir comment intégrer ça à mon approche multi-renderer qui doit permettre à terme de choisir son moteur de template sans avoir à développer de code.

merci
A+

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