File: Zend_Layout-Advanced.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (249 lines) | stat: -rw-r--r-- 10,947 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.layout.advanced">
    <title>Zend_Layout, utilisation avancée</title>

    <para>
        <classname>Zend_Layout</classname> permet d'être utilisé de manière plus
        pointu.
    </para>

    <para>Vous pouvez agir sur ces éléments :</para>

    <itemizedlist>
        <listitem>
            <para>
                <emphasis>Objet de vue personnalisé.</emphasis>
                <classname>Zend_Layout</classname> accepte tout objet de vue implémentant
                l'interface <classname>Zend_View_Interface</classname>.
            </para>
        </listitem>

        <listitem>
            <para>
                <emphasis>Plugin contrôleur frontal personnalisé.</emphasis>
                <classname>Zend_Layout</classname> est livré avec un plugin qui rend le layout
                automatiquement avant de renvoyer la réponse (utilisation <acronym>MVC</acronym>). Vous pouvez injecter
                votre propre plugin.
            </para>
        </listitem>

        <listitem>
            <para>
                <emphasis>Aide d'action personnalisée.</emphasis>
                <classname>Zend_Layout</classname> est livrée avec une aide d'action qui devrait en
                théorie suffire dans la majorité des cas. C'est un proxy vers l'objet
                <classname>Zend_Layout</classname>. Vous pouvez cependant utiliser votre propre
                classe d'aide.
            </para>
        </listitem>

        <listitem>
            <para>
                <emphasis>Résolveur de chemin de script personnalisé</emphasis>.
                <classname>Zend_Layout</classname> vous permet d'utiliser votre <link
                linkend="zend.filter.inflector">inflecteur</link> pour la résolution des scripts de
                layout ou de modifier l'inflecteur par défaut.
            </para>
        </listitem>
    </itemizedlist>

    <sect2 id="zend.layout.advanced.view">
        <title>Objets de vue personnalisés</title>

        <para>
            <classname>Zend_Layout</classname> accepte des objets de vue implémentant
            <classname>Zend_View_Interface</classname> ou étendant
            <classname>Zend_View_Abstract</classname> pour le rendu du script de layout. Passez le
            en paramètre au constructeur ou à <methodname>startMvc()</methodname>, ou utilisez l'accesseur
            <methodname>setView()</methodname> :
        </para>

        <programlisting language="php"><![CDATA[
$view = new My_Custom_View();
$layout->setView($view);
]]></programlisting>

        <note>
            <title>Attention à vos implémentations de Zend_View</title>

            <para>
                Même si <classname>Zend_Layout</classname> vous permet d'utiliser votre propre
                objet de vue (implémentant <classname>Zend_View_Interface</classname>), vous pouvez
                rencontrer des problèmes si votre vue n'a pas accès à certaines aides de vue, en
                particulier les aides "layout" et <link
                linkend="zend.view.helpers.initial.placeholder">"placeholder"</link>.
                <classname>Zend_Layout</classname> effectue des affectations de variables sur la vue
                via ces aides.
            </para>

            <para>
                Si vous avez besoin d'un objet <classname>Zend_View</classname> 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
                <classname>Zend_Layout</classname> et en rédéfinissant la méthode
                <methodname>render()</methodname> 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.
            </para>

            <para>
                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 <link
                linkend="zend.view.helpers.initial.placeholder">placeholder</link> en utilisant la
                clé "Zend_Layout" :
            </para>

            <programlisting language="php"><![CDATA[
$placeholders = new Zend_View_Helper_Placeholder();
$layoutVars   = $placeholders->placeholder('Zend_Layout')
                             ->getArrayCopy();
]]></programlisting>
        </note>
    </sect2>

    <sect2 id="zend.layout.advanced.plugin">
        <title>Plugin de contrôleur frontal personnalisé</title>

        <para>
            Lorsqu'utilisé avec les composants <acronym>MVC</acronym>, <classname>Zend_Layout</classname>
            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
            <code>pluginClass</code> de la méthode <methodname>startMvc()</methodname>.
        </para>

        <para>
            Votre plugin doit alors étendre
            <classname>Zend_Controller_Plugin_Abstract</classname>, et devrait accepter un objet
            <classname>Zend_Layout</classname> lors de sa construction.
        </para>

        <para>
            La classe par défaut du plugin est
            <classname>Zend_Layout_Controller_Plugin_Layout</classname>.
        </para>
    </sect2>

    <sect2 id="zend.layout.advanced.helper">
        <title>Aide d'action personnalisée</title>

        <para>
            Si les composants <acronym>MVC</acronym> sont utilisés, alors <classname>Zend_Layout</classname>
            enregistre une classe d'aide d'action dans le gestionnaire d'aides (helper broker). Par
            défaut, il s'agit de <classname>Zend_Layout_Controller_Action_Helper_Layout</classname>.
            Cette aide agit comme un proxy vers l'instance de <classname>Zend_Layout</classname> et
            permet d'y accéder dans vos actions.
        </para>

        <para>
            Si vous voulez utiliser votre propre classe, celle-ci devra alors étendre
            <classname>Zend_Controller_Action_Helper_Abstract</classname>. Passez le nom de la
            classe dans l'option <code>helperClass</code> de la méthode
            <methodname>startMvc()</methodname>.
        </para>
    </sect2>

    <sect2 id="zend.layout.advanced.inflector">
        <title>Résolution de chemin de script personnalisé (inflecteur)</title>

        <para>
            <classname>Zend_Layout</classname> utilise
            <classname>Zend_Filter_Inflector</classname> 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é :
        </para>

        <itemizedlist>
            <listitem>
                <para>"foo" sera transformé en "foo.phtml".</para>
            </listitem>

            <listitem>
                <para>"FooBarBaz" sera transformé vers "foo-bar-baz.phtml".</para>
            </listitem>
        </itemizedlist>

        <para>
            Vous pouvez personnaliser l'inflecteur de 3 manières différentes : Modifier la
            cible et/ou le suffixe grâce à des accesseurs dans <classname>Zend_Layout</classname> ;
            Modifier les règles de l'inflecteur associé à <classname>Zend_Layout</classname> ; Ou
            encore créer votre propre inflecteur et le passer à
            <methodname>Zend_Layout::setInflector()</methodname>.
        </para>

        <example id="zend.layout.advanced.inflector.accessors">
            <title>Utilisation des accesseurs pour modifier l'inflecteur</title>

            <para>
                L'inflecteur par défaut de <classname>Zend_Layout</classname> utilise des
                marqueurs statiques pour la cible et le suffixe. 2 accesseurs vous sont donc
                proposés :
            </para>

            <programlisting language="php"><![CDATA[
// Affecte une cible à l'inflecteur:
$layout->setInflectorTarget('layouts/:script.:suffix');

// Affecte le suffixe:
$layout->setViewSuffix('php');
]]></programlisting>
        </example>

        <example id="zend.layout.advanced.inflector.directmodification">
            <title>Modification directe de l'inflecteur de Zend_Layout</title>

            <para>
                Les inflecteurs fonctionnent avec un cible et plusieurs règles. La cible par
                défaut utilisée pour <classname>Zend_Layout</classname> est ":script.:suffix" ;
                ":script" représente le nom du script de layout, et ":suffix" est une règle
                statique.
            </para>

            <para>
                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" :
            </para>

            <programlisting language="php"><![CDATA[
$layout->getInflector()->setTarget('layouts/:script.:suffix')
                       ->setStaticRule('suffix', 'html')
                       ->setFilterRule(array('Word_CamelCaseToUnderscore'));
]]></programlisting>
        </example>

        <example id="zend.layout.advanced.inflector.custom">
            <title>Inflecteur personnalisé</title>

            <para>
                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 à <classname>Zend_Layout</classname>:
            </para>

            <programlisting language="php"><![CDATA[
$inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
$inflector->addRules(array(
    ':script' => array('Word_CamelCaseToUnderscore'),
    'suffix'  => 'html'
));
$layout->setInflector($inflector);
]]></programlisting>
        </example>

        <note>
            <title>L'inflecteur peut être désactivé</title>

            <para>
                L'inflecteur peut être désactivé si vous spécifiez, par exemple, un chemin
                absolu pour un script utilisé par <classname>Zend_Layout</classname>. Les méthodes
                <methodname>enableInflector()</methodname> et <methodname>disableInflector()</methodname> vous y
                aideront.
            </para>
        </note>
    </sect2>
</sect1>