FAQ Zend Framework
FAQ Zend FrameworkConsultez toutes les FAQ
Nombre d'auteurs : 16, nombre de questions : 39, dernière mise à jour : 15 juin 2021
Il 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 !