FAQ Zend Framework

FAQ Zend FrameworkConsultez toutes les FAQ
Nombre d'auteurs : 16, nombre de questions : 39, dernière mise à jour : 15 juin 2021
Sommaire→Zend_ViewIl faut appeler la méthode setEscape() de la Vue, dans la méthode init() du contrôleur :
class IndexController extends Zend_Controller_Action
{
...
function init()
{
...
$this->view->setEscape('utf8_encode');
...
}
...
}Oui, il est possible d'utiliser un moteur de gabarits (template engine) avec Zend_View. La Vue (du point de vue du Zend Framework) est donc un script en PHP pur, qui utilise un gabarit en HTML pur (selon la syntaxe du moteur choisi).
N'importe quel moteur de gabarits peut convenir. C'est à vous de choisir celui qui vous convient le mieux.
Lien : Comparatif : Les principaux moteurs de template en PHP, par Guillaume Rossolini
Si votre site a un header (doctype, css, menu...) et un footer (menu de bas de page, infos...) commun à toutes les pages, une façon simple de l'implémenter est d'intégrer le code suivant à chaque script de vue :
<?php echo $this->render('header.phtml'); ?>
// ici le contenu de votre page
<?php echo $this->render('footer.phtml'); ?>Mais ce n'est pas du tout DRY (Don't Repeat Yourself, ne vous répétez pas). Nous vous proposons donc d'utiliser un template principal qui affiche en bonne place le contenu du script d'action appelé.
Notre but est non pas de faire un render() de l'header et du footer dans chaque script de vue, mais plutôt d'utiliser un template principal qui affiche le contenu du script d'action appelé.
Le Zend_Controller_Action_Helper_ViewRenderer est un code qui automatise le render d'un template fondé sur l'action appelée. Il est très utile, mais il fait un render du template d'action, pas du template principal. Il s'agit donc d'étendre le Zend_Controller_Action_Helper_ViewRenderer pour qu'il intègre notre template principal. On en profitera pour modifier automatiquement le suffixe par défaut des scripts de vue (.phtml) en .tpl.php.
Le template principal du site s'appelle site.tpl.php et se situe dans views/scripts. Il pourrait ressembler à ceci :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title><?php echo $this->escape($this->pageTitle);?></title>
<link rel="stylesheet" href="<?php echo $this->baseUrl; ?>/css/site.css"
type="text/css" media="screen" />
</head>
<body>
<div id="header">
<?php echo $this->menu(); /* menu view helper */ ?>
</div>
<div id="content">
<?php echo $this->render($this->actionScript); ?>
</div>
<div id="footer">
Copyright 2007 Rob Allen
</div>
</body>
</html>$this->actionScript est le script associé à l'action courante qui est automatiquement déterminée par Zend_Controller_Action_Helper_ViewRenderer. Par exemple, pour l'action index du contrôleur index, le script d'action est views/scripts/index/index.tpl.php.
Nous devons étendre le Zend_Controller_Action_Helper_ViewRenderer :
<?php
class Controller_Action_Helper_ViewRenderer
extends Zend_Controller_Action_Helper_ViewRenderer
{
/**
* Nom du template principal. Par défaut : 'site.tpl.php'.
*
* @var string
*/
protected $_layoutScript = 'site.tpl.php';
/**
* Constructeur
*
* Configure le suffixe des scripts de vue à "tpl.php" sauf si
* un autre suffixe est passé dans les paramètres $options
*
* @param Zend_View_Interface $view
* @param array $options
* @return void
*/
public function __construct(Zend_View_Interface $view = null,
array $options = array())
{
if (!isset($options['viewSuffix'])) {
$options['viewSuffix'] = 'tpl.php';
}
parent::__construct($view, $options);
}
/**
* Configure le template principal
*
* @param string $script
*/
public function setLayoutScript($script)
{
$this->_layoutScript = $script;
}
/**
* Renvoie le nom du template principal
*
* @return string
*/
public function getLayoutScript()
{
return $this->_layoutScript;
}
/**
* Renvoie le script d'action et l'assigne à la vue pour l'utiliser
* dans le template principal. Fait un render() du template principal
* et complète le body de l'objet Response.
*
* @param string $script
* @param string $name
*/
public function renderScript($script, $name = null)
{
$this->view->baseUrl = $this->_request->getBaseUrl();
if (null === $name) {
$name = $this->getResponseSegment();
}
// affecte le nom du script d'action à la vue
$this->view->actionScript = $script;
// Fait un render() du template principal
// et complète le body de l'objet Response.
$layoutScript = $this->getLayoutScript();
$layoutContent = $this->view->render($layoutScript);
$this->getResponse()->appendBody($layoutContent, $name);
$this->setNoRender();
}
}Tout ce qu'il nous reste à faire est de modifier notre bootstrap (fichier d'amorce) pour que notre nouveau ViewRenderer soit utilisé à la place de celui par défaut. On ajoute donc les lignes suivantes dans index.php avant la première instanciation du FrontController :
<?php
// Utilise notre ViewRenderer action helper
require_once('../application/(default/)views/helpers/ViewRenderer.php');
$viewRenderer = new Controller_Action_Helper_ViewRenderer();
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);C'est tout ! Notre script d'action contient juste le code HTML spécifique à l'action, et notre template principal est rendu automatiquement avec le code HTML de l'action au bon emplacement !


