Note: Attention à vos implémentations de Zend_View
Même si Zend_Layout vous permet d'utiliser votre propre
objet de vue (implémentant Zend_View_Interface), vous pouvez
rencontrer des problèmes si votre vue n'a pas accès à certaines aides de vue, en
particulier les aides "layout" et "placeholder".
Zend_Layout effectue des affectations de variables sur la vue
via ces aides.
Si vous avez besoin d'un objet Zend_View personnalisé
qui ne supporte pas ces aides de vue, vous devrez alors trouver un moyen de passer
les variables du layout à la vue. Par exemple, en étendant l'objet
Zend_Layout et en rédéfinissant la méthode
render() en passant des variables à la vue. Aussi, vous pouvez créer
votre propre plugin qui s'occupe de passer ces variables avant le rendu du
layout.
De même, si votre implémentation de la vue permet l'extension via des plugins,
vous pouvez à tout moment accéder aux variables du layout grâce à l'aide placeholder en utilisant la
clé "Zend_Layout" :
span style="color: #ff0000;">'Zend_Layout'
Plugin de contrôleur frontal personnalisé
Lorsqu'utilisé avec les composants MVC, Zend_Layout
enregistre un plugin de contrôleur frontal qui se charge du rendu du layout juste avant
la fin de la boucle de distribution. Ceci convient à la majorité des cas, si cependant
vous avez besoin de construire votre propre plugin, passez son nom dans l'option
pluginClass
de la méthode startMvc().
Votre plugin doit alors étendre
Zend_Controller_Plugin_Abstract, et devrait accepter un objet
Zend_Layout lors de sa construction.
La classe par défaut du plugin est
Zend_Layout_Controller_Plugin_Layout.
Aide d'action personnalisée
Si les composants MVC sont utilisés, alors Zend_Layout
enregistre une classe d'aide d'action dans le gestionnaire d'aides (helper broker). Par
défaut, il s'agit de Zend_Layout_Controller_Action_Helper_Layout.
Cette aide agit comme un proxy vers l'instance de Zend_Layout et
permet d'y accéder dans vos actions.
Si vous voulez utiliser votre propre classe, celle-ci devra alors étendre
Zend_Controller_Action_Helper_Abstract. Passez le nom de la
classe dans l'option helperClass
de la méthode
startMvc().
Résolution de chemin de script personnalisé (inflecteur)
Zend_Layout utilise
Zend_Filter_Inflector pour établir une chaine de filtre
permettant la résolution du nom du layout, vers le fichier y correspondant. Par défaut,
les règles "Word_CamelCaseToDash" suivie de "StringToLower" sont utilisées. Le suffixe
"phtml" est ensuite ajouté :
Vous pouvez personnaliser l'inflecteur de 3 manières différentes : Modifier la
cible et/ou le suffixe grâce à des accesseurs dans Zend_Layout ;
Modifier les règles de l'inflecteur associé à Zend_Layout ; Ou
encore créer votre propre inflecteur et le passer à
Zend_Layout::setInflector().
Example #1 Utilisation des accesseurs pour modifier l'inflecteur
L'inflecteur par défaut de Zend_Layout utilise des
marqueurs statiques pour la cible et le suffixe. 2 accesseurs vous sont donc
proposés :
// Affecte une cible à l'inflecteur:
$layout->setInflectorTarget('layouts/:script.:suffix');
// Affecte le suffixe:
$layout->setViewSuffix('php');
Example #2 Modification directe de l'inflecteur de Zend_Layout
Les inflecteurs fonctionnent avec un cible et plusieurs règles. La cible par
défaut utilisée pour Zend_Layout est ":script.:suffix" ;
":script" représente le nom du script de layout, et ":suffix" est une règle
statique.
Imaginons que vous vouliez que le suffixe du script de layout soit "html", et
que vous vouliez séparer les mots en CasseMélangée ou en notationCamel avec des
tirets-bats au lieu des tirets. De plus, vous voulez chercher vos scripts dans un
sous-dossier "layouts" :
$layout->getInflector()->setTarget('layouts/:script.:suffix''suffix', 'html''Word_CamelCaseToUnderscore'));
Example #3 Inflecteur personnalisé
Dans la plupart des cas, modifier l'inflecteur sera suffisant. Vous pouvez
cependant créer votre propre inflecteur, pour l'utiliser à différents endroits par
exemple, et le passer à Zend_Layout:
span style="color: #ff0000;">'layouts/:script.:suffix'':script''Word_CamelCaseToUnderscore'),
'suffix' => 'html'
));
$layout->setInflector($inflector);
Note: L'inflecteur peut être désactivé
L'inflecteur peut être désactivé si vous spécifiez, par exemple, un chemin
absolu pour un script utilisé par Zend_Layout. Les méthodes
enableInflector() et disableInflector() vous y
aideront.