Zend Framework placeholders
Par SandRock le vendredi 25 juillet 2008, 16:03 - Dev - Lien permanent
Cela fait maintenant 5 mois que je travaille avec Zend Framework. J'ai des idées d'articles intéressants dont voici le premier : les placeholders utilisés avec Zend_Layout et Zend_View.
Pour information : Zend_View est une class permettant d'afficher une view dans un contexte MVC, elle est directement liée à une Zend_Controller_Action et permet d'afficher des données à l'utilisateur final. Zend_Layout est le système de template natif de ZF, il permet de définir un layout (application/views/scripts/layout.phtml) dans lequel la view principale sera affichée. Exemple :
<?php echo '<?' ?>xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>My Website</title> </head> <body> <div id="header"></div> <div id="nav"></div> <div id="content"> <?php echo $this->layout()->content; ?> </div> <div id="footer"></div> </body> </html>
Ceci est un layout comprennant les élements XHTML de base et présente 4 block : header, nav, content, footer qui serviront à la mise en page. Le problème qui se pose est celui-ci : . C'est là que les placeholders interviennent (traduire par "emplacements réservés").
De base, ZF propose un placeholder de base accessible depuis une view ou depuis un layout par <?php $this->placeholder('myPlaceholder') ?>. Il y a aussi les placeholders prédéfinis HeadLink, HeadMeta, HeadScript, HeadStyle, HeadTitle. Voici le layout précédent adapté :
<?php // application/views/scripts/layout.phtml $this->headTitle()->prepend('My Website'); $this->headTitle()->setSeparator(' - '); echo '<?' ?>xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title><?php echo $this->headTitle() ?></title> <?php echo $this->headStyle() ?> <?php echo $this->headScript() ?> </head> <body> <div id="header"></div> <div id="nav"><?php echo $this->placeholder('nav') ?></div> <div id="content"> <?php echo $this->layout()->content; ?> </div> <div id="footer"></div> </body> </html>
On remarque l'ajout de 4 placeholders. Voici comment y accéder depuis une view :
- Définition directe du contenu via les méthodes :
$this->headTitle('My Title');$this->headTitle->prepend('text');$this->headTitle->append('text');
- Enregistrement :
$this->placeholder('myPlacerholder')->captureStart('APPEND');$this->placeholder('myPlaceholder')->captureEnd();
<?php // application/views/scripts/articles/show.phtml $this->headTitle("Showing article"); $this->placeholder('nav')->captureStart(); ?> <a href="...">Index</a> - <a href="...">Articles</a> - <a href="">Visualisation</a> <?php $this->placeholder('nav')->captureEnd(); $this->headScript()->captureStart(); ?> /* Some javascripts specifics to this page... */ <?php $this->headScript()->captureEnd(); ?>
Ce que l'on a fait dans cette view :
- On a définit un titre pour la page, comme spécifié dans le layout le titre final de la page sera : "My Website - Showing article"
- Le placeholder de navigation sera complété par quelques liens.
- Le placeholder pour les scripts contiendra des petits scripts spécifiques à la page
Je tiens à préciser que les placeholders prédéfinis ajouteront automatiquement les balises xhtml. Pour terminer : un layout utilisant headStyle d'un façon très pratique (utilisation de 2 types de médias css : print et screen) :
<?php $this->headStyle()->captureStart() ?> @import url(<?php echo $front->getBaseUrl() ?>/css/generic.css); @import url(<?php echo $front->getBaseUrl() ?>/css/global.css); @import url(<?php echo $front->getBaseUrl() ?>/js/lib/jquery-ui-1.5.2/jquery-ui-themeroller.css); img.ui-datepicker-trigger{position:relative; left:-21px; top:2px;} <?php $this->headStyle()->captureEnd(); $this->headStyle()->captureStart(Zend_View_Helper_Placeholder_Container_Abstract::APPEND, array('media' => 'print')) ?> @import url(<?php echo $front->getBaseUrl() ?>/css/generic.css); @import url(<?php echo $front->getBaseUrl() ?>/css/print.css); <?php $this->headStyle()->captureEnd(); echo $this->headStyle(); ?>
Convaincu ? Vous utilisez une autre technique ? J'espère que cet article vous aura été profitable, 2 autres sont en préparation.
Commentaires
c'est intéressant de voir les choses sous un autre angle; Merci pour ton explication; je débute et j'utilise la documentation zend officielle et j'avoue que des fois j'ai comme l'impression qu'ils ne veulent pas qu'on utilisent leurs travaux car ils sont souvent si evasifs dans les explications.Merci
No soucy :)