[MANUAL] English:
[zend.git] / documentation / manual / pl / module_specs / Zend_View-Scripts.xml
blob7a1d792757a0511ee6f8cbe14d5f14a9a6e3fd09
1     <sect1 id="zend.view.scripts">
3     <title>Skrypty widoków</title>
5     <para>
6         Kiedy już kontroler przypisze zmienne i wywoła metodę render(),
7         Zend_View dołącza wymagany skrypt widoku i wykonuje go "wewnątrz"
8         instancji Zend_View. Dlatego w skrypcie widoku, odwołania do zmiennych
9         i metod obsługiwane są za pomocą $this.
10     </para>
12     <para>
13         Zmienne przypisane do widoku przez kontroler odnoszszą się do właściwości
14         tej instancji. Na przykład, jeśli kontroler przypisał zmienną 'cos', w
15         skrypcie widoku możesz odwołać się do niej za pomocą $this->cos.
16         (To pozwala Ci na śledzenie zmiennych które zostały przypisane do skryptu
17         i tych które są zmiennymi wewnętrznymi skryptu).
18     </para>
20     <para>
21         W celu przypomnienia, oto przykład skryptu widoku pokazanego we wprowadzeniu
22         do Zend_View.
23     </para>
25     <programlisting role="php"><![CDATA[
26 if ($this->books): ?>
28     <!-- Tabela z książkami. -->
29     <table>
30         <tr>
31             <th>Autor</th>
32             <th>Tytuł</th>
33         </tr>
35         <?php foreach ($this->books as $key => $val): ?>
36         <tr>
37             <td><?php echo $this->escape($val['author']) ?></td>
38             <td><?php echo $this->escape($val['title']) ?></td>
39         </tr>
40         <?php endforeach; ?>
42     </table>
44 <?php else: ?>
46     <p>Nie ma żadnych książek do wyświetlenia.</p>
48 <?php endif;
49 ]]>
50     </programlisting>
52     <sect2 id="zend.view.scripts.escaping">
54         <title>Filtrowanie danych wyjściowych</title>
56         <para>
57             Jedną z najważniejszych rzeczy do zrobienia w skrypcie widoku
58             jest uzyskanie pewności, że dane wyjściowe zostały prawidłowo
59             przefiltrowane. Pomaga to w przeciwdziałaniu atakom XSS. Jeśli
60             nie używasz funkcji, metody lub helpera w celu
61             filtrowania danych wyjściowych, powinieneś zawsze je filtrować
62             wtedy gdy chcesz je wyświetlić.
63         </para>
65         <para>
66             Zend_View dostarcza metodę zwaną escape() która filtruje dane
67             wyjściowe.
68         </para>
70         <programlisting role="php"><![CDATA[
71 // zły zwyczaj wyświetlania zmiennej:
72 echo $this->variable;
74 // dobry zwyczaj wyświetlania zmiennej:
75 echo $this->escape($this->variable);
76 ]]>
77         </programlisting>
79         <para>
80             Domyślnie metoda escape() używa funkcji PHP htmlspecialchars() do
81             filtrowania danych wyjściowych. Jakkolwiek, zależenie od Twojego
82             środowiska możesz chciec filtrować dane wyjściowe w inny sposób.
83             Użyj metody setEscape() na poziomie kontrolera by przekazać istancji
84             Zend_View informację o tym, jakiej metody filtrowania ma używać.
85         </para>
87         <programlisting role="php"><![CDATA[
88 // utwórz instancje Zend_View
89 $view = new Zend_View();
91 // wybierz funkcję htmlentities() jako metodę filtrowania
92 $view->setEscape('htmlentities');
94 // lub wybierz statyczną klasę jako metodę filtrowania
95 $view->setEscape(array('SomeClass', 'methodName'));
97 // lub instancję
98 $obj = new SomeClass();
99 $view->setEscape(array($obj, 'methodName'));
101 // a teraz wygeneruj skrypt widoku
102 echo $view->render(...);
104         </programlisting>
106         <para>
107             Metoda lub funkcja filtrująca powinna przyjmować wartość do
108             przefiltrowania jako pierwszy parametr, a wszystkie inne parametry
109             powinny być opcjonalne.
110         </para>
112     </sect2>
114     <sect2 id="zend.view.scripts.templates">
116         <title>Użycie alternatywnych systemów szablonów</title>
118         <para>
119             Chociaż PHP jest sam w sobie potężnym systemem szablonów, wielu
120             programistów czuje, że jest on jednak zbyt potężny lub skomplikowany
121             dla projektantów szablonów i mogą chcieć użyć alternatywnego systemu
122             szablonów. Zend_View zapewnia do tego dwa mechanizmy, pierwszy przez
123             skrypty widoku, drugi przez zaimplementowanie interfejsu
124             Zend_View_Interface.
125         </para>
127         <sect3 id="zend.view.scripts.templates.scripts">
128             <title>Systemy szablonów używające skryptów widoku</title>
130             <para>
131                 Skrypt widoku może być użyty w celu utworzenia instancji
132                 i manipulowania osobnym obiektem szablonu, takim jak np.
133                 szablon PHPLIB. Skrypt widoku w takim przypadku mógłby wyglądać
134                 mniej więcej tak:
135             </para>
137             <programlisting role="php"><![CDATA[
138 include_once 'template.inc';
139 $tpl = new Template();
141 if ($this->books) {
142     $tpl->setFile(array(
143         "booklist" => "booklist.tpl",
144         "eachbook" => "eachbook.tpl",
145     ));
147     foreach ($this->books as $key => $val) {
148         $tpl->set_var('author', $this->escape($val['author']);
149         $tpl->set_var('title', $this->escape($val['title']);
150         $tpl->parse("books", "eachbook", true);
151     }
153     $tpl->pparse("output", "booklist");
154 } else {
155     $tpl->setFile("nobooks", "nobooks.tpl")
156     $tpl->pparse("output", "nobooks");
159             </programlisting>
161             <para>
162                 I mogłoby to być powiązane z takim plikiem szablonu:
163             </para>
165             <programlisting role="html"><![CDATA[
166 <!-- booklist.tpl -->
167 <table>
168     <tr>
169         <th>Autor</th>
170         <th>Tytuł</th>
171     </tr>
172     {books}
173 </table>
175 <!-- eachbook.tpl -->
176     <tr>
177         <td>{author}</td>
178         <td>{title}</td>
179     </tr>
181 <!-- nobooks.tpl -->
182 <p>Nie ma żadnych książek do wyświetlenia.</p>
184             </programlisting>
186         </sect3>
188         <sect3 id="zend.view.scripts.templates.interface">
189             <title>Systemy szablonów używające interfejsu Zend_View_Interface</title>
191             <para>
192                 Niektórzy mogą zrobić to łatwiej zapewniając w prosty sposób system
193                 szablonów kompatybilny z Zend_View. <code>Zend_View_Interface</code>
194                 definiuje minimalny interfejs potrzebny dla kompatybilności.
195             </para>
197             <programlisting role="php"><![CDATA[
199  * Zwraca aktualny obiekt systemu szablonów
200  */
201 public function getEngine();
204  * Ustawia ścieżkę do skryptów/szablonów widoku
205  */
206 public function setScriptPath($path);
209  * Ustawia bazową ścieżkę dla wszystkich zasobów widoków
210  */
211 public function setBasePath($path, $prefix = 'Zend_View');
214  * Dodaje dodatkową ścieżkę dla wszystkich zasobów widoków
215  */
216 public function addBasePath($path, $prefix = 'Zend_View');
219  * Zwraca obecne ścieżki skryptów widoków
220  */
221 public function getScriptPaths();
224  * Nadpisanie metod do przypisywania zmiennych
225  * szablonów jako właściwości obiektu
226  */
227 public function __set($key, $value);
228 public function __get($key);
229 public function __isset($key);
230 public function __unset($key);
233  * Ręczne przypisywanie zmiennych szablonu,
234  * lub możliwość przypisania wielu
235  * zmiennych na raz.
236  */
237 public function assign($spec, $value = null);
240  * Czyści wszystkie przypisane zmienne.
241  */
242 public function clearVars();
245  * Renderowanie szablonu o nazwie $name
246  */
247 public function render($name);
249             </programlisting>
251             <para>
252                 Używając tego interfejsu, relatywnie proste staje się podpięcie
253                 zewnętrznego systemu szablonów jako klasy kompatybilnej z
254                 Zend_View. Przykładowo, poniższy przyklad to podpięcie systemu Smarty:
255             </para>
257             <programlisting role="php"><![CDATA[
258 class Zend_View_Smarty implements Zend_View_Interface
260     /**
261      * Obiekt Smarty
262      * @var Smarty
263      */
264     protected $_smarty;
266     /**
267      * Konstruktor
268      *
269      * @param string $tmplPath
270      * @param array $extraParams
271      * @return void
272      */
273     public function __construct($tmplPath = null, $extraParams = array())
274     {
275         $this->_smarty = new Smarty;
277         if (null !== $tmplPath) {
278             $this->setScriptPath($tmplPath);
279         }
281         foreach ($extraParams as $key => $value) {
282             $this->_smarty->$key = $value;
283         }
284     }
286     /**
287      * Zwraca aktualny obiekt systemu szablonów
288      *
289      * @return Smarty
290      */
291     public function getEngine()
292     {
293         return $this->_smarty;
294     }
296     /**
297      * Ustawia ścieżkę do szablonów
298      *
299      * @param string $path Ścieżka.
300      * @return void
301      */
302     public function setScriptPath($path)
303     {
304         if (is_readable($path)) {
305             $this->_smarty->template_dir = $path;
306             return;
307         }
309         throw new Exception('Nieprawidłowa ścieżka');
310     }
312     /**
313      * Zwraca obecną ścieżkę szablonów
314      *
315      * @return string
316      */
317     public function getScriptPaths()
318     {
319         return array($this->_smarty->template_dir);
320     }
322     /**
323      * Alias dla setScriptPath
324      *
325      * @param string $path
326      * @param string $prefix Unused
327      * @return void
328      */
329     public function setBasePath($path, $prefix = 'Zend_View')
330     {
331         return $this->setScriptPath($path);
332     }
334     /**
335      * Alias dla setScriptPath
336      *
337      * @param string $path
338      * @param string $prefix Unused
339      * @return void
340      */
341     public function addBasePath($path, $prefix = 'Zend_View')
342     {
343         return $this->setScriptPath($path);
344     }
346     /**
347      * Przypisanie zmiennej do szablonu
348      *
349      * @param string $key Nazwa zmiennej.
350      * @param mixed $val Wartość zmiennej.
351      * @return void
352      */
353     public function __set($key, $val)
354     {
355         $this->_smarty->assign($key, $val);
356     }
358     /**
359      * Pobiera przypisaną zmienną
360      *
361      * @param string $key Nazwa zmiennej
362      * @return mixed Wartość zmiennej.
363      */
364     public function __get($key)
365     {
366         return $this->_smarty->get_template_vars($key);
367     }
369     /**
370      * Pozwala działać funkcjom empty() oraz
371      * isset() na właściwościach obiektu
372      *
373      * @param string $key
374      * @return boolean
375      */
376     public function __isset($key)
377     {
378         return (null !== $this->_smarty->get_template_vars($key));
379     }
381     /**
382      * Pozwala działać funkcji unset() na właściwości obiektu
383      *
384      * @param string $key
385      * @return void
386      */
387     public function __unset($key)
388     {
389         $this->_smarty->clear_assign($key);
390     }
392     /**
393      * Przypisywanie zmiennych do szablonu
394      *
395      * Pozwala przypisać określoną wartość do określonego
396      * klucza, LUB przekazać tablicę par klucz => wartość
397      * aby przypisać je wszystkie na raz.
398      *
399      * @see __set()
400      * @param string|array $spec Strategia przypisania (klucz
401      * lub tablica par klucz=> wartość)
402      * @param mixed $value (Opcjonalny) Gdy przypisujesz
403      * nazwaną zmienną, użyj go jako wartości.
404      * @return void
405      */
406     public function assign($spec, $value = null)
407     {
408         if (is_array($spec)) {
409             $this->_smarty->assign($spec);
410             return;
411         }
413         $this->_smarty->assign($spec, $value);
414     }
416     /**
417      * Czyści wszystkie przypisane zmienne.
418      *
419      * Czyści wszystkie zmienne przypisane do Zend_View za pomocą
420      * {@link assign()} lub przeładowania właściwości
421      * ({@link __get()}/{@link __set()}).
422      *
423      * @return void
424      */
425     public function clearVars()
426     {
427         $this->_smarty->clear_all_assign();
428     }
430     /**
431      * Renderuje szablon i zwraca dane wyjściowe.
432      *
433      * @param string $name Nazwa szablonu do renderowania.
434      * @return string Dane wyjściowe.
435      */
436     public function render($name)
437     {
438         return $this->_smarty->fetch($name);
439     }
442             </programlisting>
444             <para>
445                 W tym przykładzie powinieneś utworzyć instancję klasy
446                 <code>Zend_View_Smarty</code> zamiast <code>Zend_View</code>,
447                 a następnie używać jej w dokładnie w ten sam sposób jak
448                 <code>Zend_View</code>:
449             </para>
451             <programlisting role="php"><![CDATA[
452 $view = new Zend_View_Smarty();
453 $view->setScriptPath('/path/to/templates');
454 $view->book = 'Zend PHP 5 Certification Study Guide';
455 $view->author = 'Davey Shafik and Ben Ramsey'
456 $rendered = $view->render('bookinfo.tpl');
458             </programlisting>
460         </sect3>
461     </sect2>
463 </sect1>