File: quickstart-create-layout.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 (230 lines) | stat: -rw-r--r-- 8,686 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.quickstart.create-layout">
    <title>Créer une layout</title>

    <para>
        Vous avez remarqué que les scripts de vue dans les sections précédentes étaient des
        fragments de <acronym>HTML</acronym>, pas des pages complètes. C'est le design&#160;:
        nous voulons que nos actions retournent du contenu uniquement relatif à elles mêmes et
        non de l'application en général.
    </para>

    <para>
        Maintenant nous devons introduire le contenu généré dans une page entière
        <acronym>HTML</acronym>. Nous utiliserons un layout global pour tout le site dans ce but.
    </para>

    <para>
        Il y a deux designs pattern que le Zend Framework utilise pour les layouts&#160;: <ulink
            url="http://martinfowler.com/eaaCatalog/twoStepView.html">Two Step View</ulink> et
        <ulink
            url="http://java.sun.com/blueprints/corej2eepatterns/Patterns/CompositeView.html">Composite
            View</ulink>. <emphasis>Two Step View</emphasis> est souvent associé au pattern <ulink
            url="http://www.martinfowler.com/eaaCatalog/transformView.html">Transform View</ulink>
        l'idée de base est que les vues de l'application créent une représentation qui est ensuite
        injectée dans une vue plus globale. Le pattern <emphasis>Composite View</emphasis>
        traite avec une vue fabriquée à partir de plusieurs vues applicatives.
    </para>

    <para>
        Dans Zend Framework, <link linkend="zend.layout">Zend_Layout</link> combine les idées de
        ces patterns. Plutôt que chaque vue inclue tout le design, chacune ne contient que ses
        propres données.
    </para>

    <para>
        Par contre vous pourriez avoir besoin occasionnellement d'informations globales dans la vue
        générale. Heureusement, le Zend Framework propose une variété de conteneurs appelés
        <emphasis>placeholders</emphasis> pour permettre de stocker de telles informations depuis
        les scripts de vue des actions.
    </para>

    <para>
        Pour démarrer avec <classname>Zend_Layout</classname>, nous devons d'abord informer le
        bootstrap de l'objet <classname>Layout</classname> (ressource). On peut activer cela au
        moyen de la commande <command>zf enable layout</command>:
    </para>

    <programlisting language="shell"><![CDATA[
% zf enable layout
Layouts have been enabled, and a default layout created at
application/layouts/scripts/layout.phtml
A layout entry has been added to the application config file.
]]></programlisting>

    <para>
        Comme le suggère la commande, <filename>application/configs/application.ini</filename>
        est mis à jour et contient maintenant les informations suivantes dans la section
        <constant>production</constant>&#160;:
    </para>

    <programlisting language="ini"><![CDATA[
; application/configs/application.ini

; Add to [production] section:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
]]></programlisting>

    <para>
        Le fichier <acronym>INI</acronym> final devrait ressembler à ceci&#160;:
    </para>

    <programlisting language="ini"><![CDATA[
; application/configs/application.ini

[production]
; PHP settings we want to initialize
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
]]></programlisting>

    <para>
        Cette directive indique à l'application de chercher les scripts de layout dans
        <filename>application/layouts/scripts</filename>. Si vous examinez votre structure de
        répertoires, vous verrez que ce dossier a été créé pour vous, avec le fichier
        <filename>layout.phtml</filename>.
    </para>

    <para>
        Nous voulons aussi nous assurer que nous avons une déclaration de DocType XHTML pour notre
        application. Pour activer cela, nous devons ajouter une ressource à notre bootstrap.
    </para>

    <para>
        La manière la plus simple d'ajouter une ressource au bootstrap est de définir une méthode
        protégée qui commence par <methodname>_init</methodname>. Dans notre cas, nous voulons
        initialiser le doctype et donc nous créons une méthode
        <methodname>_initDoctype()</methodname>&#160;:
    </para>

    <programlisting language="php"><![CDATA[
// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype()
    {
    }
}
]]></programlisting>

    <para>
        Dans cette méthode, nous devons renseigner la vue au sujet du doctype. Mais d'où va
        provenir notre objet de vue&#160;? La solution simple consiste à initialiser la ressource
        <classname>View</classname> et la récupérer dans la méthode de bootstrap pour l'utiliser.
    </para>

    <para>
        Pour initialiser la vue, ajoutez la ligne suivante dans le fichier
        <filename>application/configs/application.ini</filename>, dans la section
        <constant>production</constant>&#160;:
    </para>

    <programlisting language="ini"><![CDATA[
; application/configs/application.ini

; Add to [production] section:
resources.view[] =
]]></programlisting>

    <para>
        Ceci indique de charger la vue avec aucune option (les '[]' indiquent que la clé "view" est
        un tableau et nous ne lui passons rien du tout).
    </para>

    <para>
        Maintenant que nous possédons une vue, retournons à notre méthode
        <methodname>_initDoctype()</methodname>. A l'intérieur, nous allons d'abord nous assurer
        que la ressource <classname>View</classname> existe, puis nous la récupèrerons et la
        configurerons&#160;:
    </para>

    <programlisting language="php"><![CDATA[
// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype()
    {
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
    }
}
]]></programlisting>

    <para>
        Maintenant que <classname>Zend_Layout</classname> est initialisé et que le Doctype est
        réglé, créons notre vue globale de layout&#160;:
    </para>

    <programlisting language="php"><![CDATA[
<!-- application/layouts/scripts/layout.phtml -->
<?php echo $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Zend Framework Quickstart Application</title>
  <?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>
</head>
<body>
<div id="header" style="background-color: #EEEEEE; height: 30px;">
    <div id="header-logo" style="float: left">
        <b>ZF Quickstart Application</b>
    </div>
    <div id="header-navigation" style="float: right">
        <a href="<?php echo $this->url(
            array('controller'=>'guestbook'),
            'default',
            true) ?>">Guestbook</a>
    </div>
</div>

<?php echo $this->layout()->content ?>

</body>
</html>
]]></programlisting>

    <para>
        Nous récupérons le contenu de l'application au moyen de l'aide de vue
        <methodname>layout()</methodname> et nous accédons à la clé "content". Vous pouvez utiliser
        d'autres segments de l'objet de réponse, mais dans la plupart des cas ce n'est pas
        nécessaire.
    </para>

    <para>
        Notez aussi l'utilisation du placeholer <methodname>headLink()</methodname>. C'est un moyen
        simple de générer du <acronym>HTML</acronym> pour les éléments &lt;link&gt; et ca permet de
        les garder sous le coude au travers de l'application. Si vous devez ajouter des feuilles
        CSS c'est aussi possible.
    </para>

    <note>
        <title>Checkpoint</title>

        <para>
            Allez maintenant sur "http://localhost" et regarder le code source rendu. Vous devriez
            voir votre entête XHTML et vos sections head, title et body.
        </para>
    </note>
</sect1>