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 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 21829 -->
<!-- Reviewed: no -->
<sect1 id="zend.view.introduction">
<title>Wprowadzenie</title>
<para>
Zend_View jest klasą zapewniającą obsługę części widoku ("view")
we wzorcu projektowym MVC (model-view-controller). Istnieje ona
w celu oddzielenia wyglądu aplikacji od kontrolerów i danych.
Zapewnia system skryptów helperów i filtrów.
</para>
<para>
Zend_View jest bardzo prostym systemem; możesz użyć PHP jako
języka szablonów lub utworzyć instancje innych systemów szablonów,
a następnie manipulować nimi wewnątrz skryptu widoku.
</para>
<para>
Zasadniczo użycie Zend_View składa się z dwóch kroków:
1. Twój skrypt kontrolera tworzy instancję klasy
Zend_View i przekazuje zmienne do tej instancji.
2. Kontroler mówi obiektowi Zend_View aby przetworzył określony skrypt
widoku, skutkiem tego jest wygenerowanie wyjściowego widoku.
</para>
<sect2 id="zend.view.introduction.controller">
<title>Skrypt kontrolera</title>
<para>
Aby pokazać prosty przykład załóżmy, że kontroler ma dane w postaci
listy książek i chcemy aby były one przetworzone jako widok. Skrypt
kontrolera mógłby wyglądać tak:
</para>
<programlisting role="php"><![CDATA[
// użyjmy modelu aby uzyskać dane o autorach książek i ich tytułach
$data = array(
array(
'author' => 'Hernando de Soto',
'title' => 'The Mystery of Capitalism'
),
array(
'author' => 'Henry Hazlitt',
'title' => 'Economics in One Lesson'
),
array(
'author' => 'Milton Friedman',
'title' => 'Free to Choose'
)
);
// przekażmy dane o książkach do instancji Zend_View
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View();
$view->books = $data;
// wygenerujemy wyjściowy widok o nazwie "booklist.php"
echo $view->render('booklist.php');
]]>
</programlisting>
</sect2>
<sect2 id="zend.view.introduction.view">
<title>Skrypt widoku</title>
<para>
Teraz potrzebujemy skryptu widoku "booklist.php". Jest
to skrypt PHP jak każdy inny, z jednym wyjątkiem: jest on wykonywany
w przestrzeni instancji Zend_View, co oznacza, że odnosi się on do
właściwości i metod klasy Zend_View za pomocą $this. Zmienne
przekazane do tej instancji przez kontroler są publicznymi
właściwościami instancji Zend_View) więc bardzo prosty skrypt
mógłby wyglądać tak:
</para>
<programlisting role="php"><![CDATA[
if ($this->books): ?>
<!-- Tabela z książkami. -->
<table>
<tr>
<th>Autor</th>
<th>Tytuł</th>
</tr>
<?php foreach ($this->books as $key => $val): ?>
<tr>
<td><?php echo $this->escape($val['author']) ?></td>
<td><?php echo $this->escape($val['title']) ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php else: ?>
<p>Nie ma żadnych książek do wyświetlenia.</p>
<?php endif;
]]>
</programlisting>
<para>
Zauważ, że używamy metody "escape()" aby przefiltrować zmienne
wyjściowe.
</para>
</sect2>
<sect2 id="zend.view.introduction.options">
<title>Opcje</title>
<para>
<code>Zend_View</code> posiada kilka opcji, które mogą być użyte do
skonfigurowania zachowania skryptów widoków.
</para>
<itemizedlist>
<listitem>
<para>
<code>basePath:</code> określa bazową ścieżkę, wewnątrz
której znajdują się skrypty widoków, klasy helperów oraz
klasy filtrów. Zakładane jest, że struktura katalogów
wygląda tak:
</para>
<programlisting role="php"><![CDATA[
base/path/
helpers/
filters/
scripts/
]]>
</programlisting>
<para>
Ta opcja może być ustawiona za pomocą metody
<code>setBasePath()</code>, metody <code>addBasePath()</code>,
lub jako opcja <code>basePath</code> przekazana do
konstruktora.
</para>
</listitem>
<listitem><para>
<code>encoding:</code> określa kodowanie znaków, które ma być
użyte przez metody <code>htmlentities()</code>,
<code>htmlspecialchars()</code> oraz w innych operacjach.
Domyślnie jest to ISO-8859-1 (latin1). Może być ustawione za
pomocą metody <code>setEncoding()</code> lub jako opcja
<code>encoding</code> konstruktora.
</para></listitem>
<listitem><para>
<code>escape:</code> określa funkcję używaną przez metodę
<code>escape()</code>. Może być ustawiona za pomocą metody
<code>setEscape()</code> lub za pomocą opcji <code>escape</code>
konstruktora.
</para></listitem>
<listitem><para>
<code>filter:</code> określa filtr, który ma być użyty po
renderowaniu skryptu widoku. Może być ustawiony za pomocą
metody <code>setFilter()</code>, metody <code>addFilter()</code>,
lub za pomocą opcji <code>filter</code> konstruktora.
</para></listitem>
<listitem><para>
<code>strictVars:</code> zmusza <code>Zend_View</code> do
wyświetlania not i ostrzeżeń, wtedy gdy zdarzy się próba
uzyskania dostępu do niezainicjowanych zmiennych widoków.
Może to być ustawione przez wywołanie metody
<code>strictVars(true)</code> lub przekazanie opcji
<code>strictVars</code> do konstruktora.
</para></listitem>
</itemizedlist>
</sect2>
<sect2 id="zend.view.introduction.shortTags">
<title>Krótkie znaczniki wewnątrz skryptów widoków</title>
<para>
W naszych przykładach i dokumentacji używamy krótkich znaczników PHP:
<code><?</code> oraz <code><?=</code>.
Dodatkowo używamy <ulink
url="http://us.php.net/manual/en/control-structures.alternative-syntax.php">alternatywnej
składni instrukcji kontrolnych</ulink>. Te wygodne skróty,
których można użyć w skryptach widoków, pozwalają na zwiększenie
czytelności kodu
</para>
<para>
Jednak wielu programistów woli używać pełnych znaczników dla celów
poprawności czy przenośności aplikacji. Przykładowo dyrektywa
<code>short_open_tag</code> jest wyłączona w rekomendowanym pliku
konfiguracyjnym php.ini.recommended, a także jeśli używasz w
skryptach widoków języka XML, krótkie znaczniki mogłyby powodować
błędy.
</para>
<para>
Dodatkowo, jeśli użyjesz krótkich znaczników gdy ich obsługa jest
wyłączona, to mogą wystąpić błędy w skryptach widoków lub po prostu
kod może zostać wyświetlony użytkownikom.
</para>
<para>
W przypadku gdy chcesz użyć krótkich znaczników, a ich obsługa jest
wyłączona, masz dwa rozwiązania:
</para>
<itemizedlist>
<listitem>
<para>
Włączyć krótkie znaczniki w pliku <code>.htaccess</code>:
</para>
<programlisting role="apache"><![CDATA[
php_value "short_open_tag" "on"
]]>
</programlisting>
<para>
To będzie możliwe tylko jeśli posiadasz uprawnienia
pozwalające na tworzenie i użycie plików
<code>.htaccess</code>. Ta dyrektywa może być także dodana
do pliku <code>httpd.conf</code>.
</para>
</listitem>
<listitem>
<para>
Włączyć alternatywną obsługę strumienia danych, aby w locie
konwertować krótkie znaczniki na pełne:
</para>
<programlisting role="php"><![CDATA[
$view->setUseStreamWrapper(true);
]]>
</programlisting>
<para>
Rejestruje to klasę <code>Zend_View_Stream</code> jako klasę
obsługującą strumień danych dla skryptów widoków i umożliwia
dalsze działanie skryptów widoków, tak jakby obsługa krótkich
znaczników była aktywna.
</para>
</listitem>
</itemizedlist>
<note>
<title>Alternatywna obsługa strumienia danych zmniejsza wydajność</title>
<para>
Użycie strumienia danych <emphasis>zmniejszy</emphasis> wydajność
aplikacji, ale obecnie nie są dostępne testy które mogłyby pokazać
jak bardzo zmniejszy. Zalecamy włączenie obsługi krótkich
znaczników, konwersję skryptów widoków aby używały pełnych
znaczników lub wprowadzenie dobrego buforowania części lub
całości widoków.
</para>
</note>
</sect2>
<sect2 id="zend.view.introduction.accessors">
<title>Narzędziowe metody dostępowe</title>
<para>
W większości przypadków będziesz używał tylko metod
<code>assign()</code>, <code>render()</code>, lub jednej z metod
do ustawiania/dodawania filtrów, klas helperów oraz ścieżek
skryptów widoków. Jednak jeśli chcesz samodzielnie rozszerzyć klasę
<code>Zend_View</code>, lub potrzebujesz dostępu do jej pewnych
wewnętrznych funkcjonalności, to możesz użyć kilku istniejących
metod dostępowych:
</para>
<itemizedlist>
<listitem>
<para>
<code>getVars()</code> zwraca wszystkie przypisane zmienne.
</para>
</listitem>
<listitem>
<para>
<code>clearVars()</code> wyczyści wszystkie przypisane
zmienne; użyteczne gdy chcesz ponownie użyć obiektu widoku,
ale chcesz zachować kontrolę nad tym, które zmienne mają
być dostępne.
</para>
</listitem>
<listitem>
<para>
<code>getScriptPath($script)</code> zwraca ścieżkę dla
podanego skryptu widoku.
</para>
</listitem>
<listitem>
<para>
<code>getScriptPaths()</code> zwraca wszystkie
zarejestrowane ścieżki skryptów widoków.
</para>
</listitem>
<listitem>
<para>
<code>getHelperPath($helper)</code> zwraca ścieżkę dla
podanej klasy helpera.
</para>
</listitem>
<listitem>
<para>
<code>getHelperPaths()</code> zwraca wszystkie
zarejestrowane ścieżki klas helperów.
</para>
</listitem>
<listitem>
<para>
<code>getFilterPath($filter)</code> zwraca ścieżkę dla
podanej klasy filtra.
</para>
</listitem>
<listitem>
<para>
<code>getFilterPaths()</code> zwraca wszystkie zarejestrowane
ścieżki klas filtrów.
</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
|