1 <sect1 id="zend.view.scripts">
3 <title>Skrypty widoków</title>
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.
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).
21 W celu przypomnienia, oto przykład skryptu widoku pokazanego we wprowadzeniu
25 <programlisting role="php"><![CDATA[
28 <!-- Tabela z książkami. -->
35 <?php foreach ($this->books as $key => $val): ?>
37 <td><?php echo $this->escape($val['author']) ?></td>
38 <td><?php echo $this->escape($val['title']) ?></td>
46 <p>Nie ma żadnych książek do wyświetlenia.</p>
52 <sect2 id="zend.view.scripts.escaping">
54 <title>Filtrowanie danych wyjściowych</title>
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ć.
66 Zend_View dostarcza metodę zwaną escape() która filtruje dane
70 <programlisting role="php"><![CDATA[
71 // zły zwyczaj wyświetlania zmiennej:
74 // dobry zwyczaj wyświetlania zmiennej:
75 echo $this->escape($this->variable);
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ć.
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'));
98 $obj = new SomeClass();
99 $view->setEscape(array($obj, 'methodName'));
101 // a teraz wygeneruj skrypt widoku
102 echo $view->render(...);
107 Metoda lub funkcja filtrująca powinna przyjmować wartość do
108 przefiltrowania jako pierwszy parametr, a wszystkie inne parametry
109 powinny być opcjonalne.
114 <sect2 id="zend.view.scripts.templates">
116 <title>Użycie alternatywnych systemów szablonów</title>
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
127 <sect3 id="zend.view.scripts.templates.scripts">
128 <title>Systemy szablonów używające skryptów widoku</title>
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ć
137 <programlisting role="php"><![CDATA[
138 include_once 'template.inc';
139 $tpl = new Template();
143 "booklist" => "booklist.tpl",
144 "eachbook" => "eachbook.tpl",
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);
153 $tpl->pparse("output", "booklist");
155 $tpl->setFile("nobooks", "nobooks.tpl")
156 $tpl->pparse("output", "nobooks");
162 I mogłoby to być powiązane z takim plikiem szablonu:
165 <programlisting role="html"><![CDATA[
166 <!-- booklist.tpl -->
175 <!-- eachbook.tpl -->
182 <p>Nie ma żadnych książek do wyświetlenia.</p>
188 <sect3 id="zend.view.scripts.templates.interface">
189 <title>Systemy szablonów używające interfejsu Zend_View_Interface</title>
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.
197 <programlisting role="php"><![CDATA[
199 * Zwraca aktualny obiekt systemu szablonów
201 public function getEngine();
204 * Ustawia ścieżkę do skryptów/szablonów widoku
206 public function setScriptPath($path);
209 * Ustawia bazową ścieżkę dla wszystkich zasobów widoków
211 public function setBasePath($path, $prefix = 'Zend_View');
214 * Dodaje dodatkową ścieżkę dla wszystkich zasobów widoków
216 public function addBasePath($path, $prefix = 'Zend_View');
219 * Zwraca obecne ścieżki skryptów widoków
221 public function getScriptPaths();
224 * Nadpisanie metod do przypisywania zmiennych
225 * szablonów jako właściwości obiektu
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
237 public function assign($spec, $value = null);
240 * Czyści wszystkie przypisane zmienne.
242 public function clearVars();
245 * Renderowanie szablonu o nazwie $name
247 public function render($name);
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:
257 <programlisting role="php"><![CDATA[
258 class Zend_View_Smarty implements Zend_View_Interface
269 * @param string $tmplPath
270 * @param array $extraParams
273 public function __construct($tmplPath = null, $extraParams = array())
275 $this->_smarty = new Smarty;
277 if (null !== $tmplPath) {
278 $this->setScriptPath($tmplPath);
281 foreach ($extraParams as $key => $value) {
282 $this->_smarty->$key = $value;
287 * Zwraca aktualny obiekt systemu szablonów
291 public function getEngine()
293 return $this->_smarty;
297 * Ustawia ścieżkę do szablonów
299 * @param string $path Ścieżka.
302 public function setScriptPath($path)
304 if (is_readable($path)) {
305 $this->_smarty->template_dir = $path;
309 throw new Exception('Nieprawidłowa ścieżka');
313 * Zwraca obecną ścieżkę szablonów
317 public function getScriptPaths()
319 return array($this->_smarty->template_dir);
323 * Alias dla setScriptPath
325 * @param string $path
326 * @param string $prefix Unused
329 public function setBasePath($path, $prefix = 'Zend_View')
331 return $this->setScriptPath($path);
335 * Alias dla setScriptPath
337 * @param string $path
338 * @param string $prefix Unused
341 public function addBasePath($path, $prefix = 'Zend_View')
343 return $this->setScriptPath($path);
347 * Przypisanie zmiennej do szablonu
349 * @param string $key Nazwa zmiennej.
350 * @param mixed $val Wartość zmiennej.
353 public function __set($key, $val)
355 $this->_smarty->assign($key, $val);
359 * Pobiera przypisaną zmienną
361 * @param string $key Nazwa zmiennej
362 * @return mixed Wartość zmiennej.
364 public function __get($key)
366 return $this->_smarty->get_template_vars($key);
370 * Pozwala działać funkcjom empty() oraz
371 * isset() na właściwościach obiektu
376 public function __isset($key)
378 return (null !== $this->_smarty->get_template_vars($key));
382 * Pozwala działać funkcji unset() na właściwości obiektu
387 public function __unset($key)
389 $this->_smarty->clear_assign($key);
393 * Przypisywanie zmiennych do szablonu
395 * Pozwala przypisać określoną wartość do określonego
396 * klucza, LUB przekazać tablicę par klucz => wartość
397 * aby przypisać je wszystkie na raz.
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.
406 public function assign($spec, $value = null)
408 if (is_array($spec)) {
409 $this->_smarty->assign($spec);
413 $this->_smarty->assign($spec, $value);
417 * Czyści wszystkie przypisane zmienne.
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()}).
425 public function clearVars()
427 $this->_smarty->clear_all_assign();
431 * Renderuje szablon i zwraca dane wyjściowe.
433 * @param string $name Nazwa szablonu do renderowania.
434 * @return string Dane wyjściowe.
436 public function render($name)
438 return $this->_smarty->fetch($name);
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>:
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');