[ZF-10089] Zend_Log
[zend.git] / documentation / manual / zh / module_specs / Zend_View-Scripts.xml
blobae76b5619a864f9782c84331e934ae3ba900a697
1 <sect1 id="zend.view.scripts">
3     <title>视图脚本</title>
5     <para>
6         Controller完成变量赋值和调用render()之后,Zend_View就会调用视图脚本并在Zend_View的实例内部执行。因此,在你的视图脚本内,$this指向Zend_View的实例。
7     </para>
9     <para>
10         从控制器传递到视图的变量以Zend_View实例属性的形式来调用。例如,控制器有一个变量"something" ,那么视图代码中就要用$this->something来调用。这样的作法可以让你分清哪些是来自Zend_View实例的变量,哪些是视图自身的变量。
11     </para>
13     <para>
14         为了说明,这里有一个例子:
15     </para>
17     <programlisting role="php"><![CDATA[<?php if ($this->books): ?>
19     <!-- A table of some books. -->
20     <table>
21         <tr>
22             <th>Author</th>
23             <th>Title</th>
24         </tr>
26         <?php foreach ($this->books as $key => $val): ?>
27         <tr>
28             <td><?php echo $this->escape($val['author']) ?></td>
29             <td><?php echo $this->escape($val['title']) ?></td>
30         </tr>
31         <?php endforeach; ?>
33     </table>
35 <?php else: ?>
37     <p>There are no books to display.</p>
39 <?php endif; ]]>
40     </programlisting>
42     <sect2 id="zend.view.scripts.escaping">
44         <title>转义输出(Escaping Output)</title>
46         <para>
47             View脚本的最重要的工作之一是保证输出的内容是合适的,比如需要避免跨站攻击漏洞(XSS)。除非你已经使用一个函数、类方法或助手类(helper)来转义内容,你需要在输出时对变量进行转义。
48         </para>
50         <para>
51             Zend_View带有一个escape()方法来提供这个功能:
52         </para>
54         <programlisting role="php"><![CDATA[<?php
55 // 不好的做法:
56 echo $this->variable;
58 // 好的做法:
59 echo $this->escape($this->variable);
60 ]]>
61         </programlisting>
63         <para>
64             默认地,escape()方法使用PHP函数htmlspecialchars()来过滤,但你也可以通过setEscape()方法来在Controller内告诉Zend_View需要怎么过滤。
65         </para>
67         <programlisting role="php"><![CDATA[<?php
68 //创建一个Zend_View实例
69 $view = new Zend_View();
71 //设定要使用的转义回调函数(callback)
72 $view->setEscape('htmlentities');
74 //或者使用一个静态类方法作为回调函数
75 $view->setEscape(array('SomeClass', 'methodName'));
77 //或者是一个对象实例的类方法
78 $obj = new SomeClass();
79 $view->setEscape(array($obj, 'methodName'));
81 //最后输出你的视图
82 echo $view->render(...);
83 ]]>
84         </programlisting>
86         <para>
88             设定的转义函数会将需要转义的变量作为其第一个参数,其它参数是可选的。
89         </para>
91     </sect2>
93     <sect2 id="zend.view.scripts.templates">
94         <title>使用模板系统</title>
96         <para>
97             尽管许多开发者觉得PHP本身就是一个强大的模板系统,但对模板设计师来说,使用PHP标签过于复杂。Zend_View提供了两套机制来同时满足这两种要求,一种是直接通过通过视图脚本,另一种是实现Zend_View_Interface接口。
98         </para>
100         <sect3 id="zend.view.scripts.templates.scripts">
101             <title>使用View脚本的模板系统</title>
103             <para>
104                               View脚本可能要被用来初始化和操作一个其它模板对象的实例,例如PHPLIB风格的模板。这时View脚本可能是这样的:
105             </para>
107             <programlisting role="php"><![CDATA[<?php
108 include_once 'template.inc';
109 $tpl = new Template();
111 if ($this->books) {
112     $tpl->setFile(array(
113         "booklist" => "booklist.tpl",
114         "eachbook" => "eachbook.tpl",
115     ));
117     foreach ($this->books as $key => $val) {
118         $tpl->set_var('author', $this->escape($val['author']);
119         $tpl->set_var('title', $this->escape($val['title']);
120         $tpl->parse("books", "eachbook", true);
121     }
123     $tpl->pparse("output", "booklist");
124 } else {
125     $tpl->setFile("nobooks", "nobooks.tpl")
126     $tpl->pparse("output", "nobooks");
128 ]]></programlisting>
130             <para>
131                 下面是相关的模板文件:
132             </para>
134             <programlisting role="html"><![CDATA[
135 <!-- booklist.tpl -->
136 <table>
137     <tr>
138         <th>Author</th>
139         <th>Title</th>
140     </tr>
141     {books}
142 </table>
144 <!-- eachbook.tpl -->
145     <tr>
146         <td>{author}</td>
147         <td>{title}</td>
148     </tr>
150 <!-- nobooks.tpl -->
151 <p>There are no books to display.</p>]]>>
152            </programlisting>
154         </sect3>
156         <sect3 id="zend.view.scripts.templates.interface">
157             <title>通过Zend_View_Interface接口使用模板系统</title>
159             <para>
161                 实现一个与Zend_View兼容的模板系统是很简单的。你只需要实现<code>Zend_View_Interface</code>接口即可,该接口定义了要实现兼容的最低要求。
162             </para>
164             <programlisting role="php"><![CDATA[
166  * Return the actual template engine object
167  * 返回实际模板系统的对象
168  */
169 public function getEngine();
172  * Set the path to view scripts/templates
173  * 设置视图脚本/模板的路径
174  */
175 public function setScriptPath($path);
178  * Set a base path to all view resources
179  * 给所有视图资源设置基本路径
180  */
181 public function setBasePath($path, $prefix = 'Zend_View');
184  * Add an additional base path to view resources
185  * 给视图资源添加另外的基本路径
186  */
187 public function addBasePath($path, $prefix = 'Zend_View');
190  * Retrieve the current script paths
191  * 获取当前脚本路径
192  */
193 public function getScriptPaths();
196  * Overloading methods for assigning template variables as object properties
197  * 重载方法,用于将赋值给模板变量,以对象属性的形式
198  */
199 public function __set($key, $value);
200 public function __get($key);
201 public function __isset($key);
202 public function __unset($key);
205  * Manual assignment of template variables, or ability to assign multiple
206  * variables en masse.
207  * 手动设置模板变量,或者一次赋值多个变量的功能
208  */
209 public function assign($spec, $value = null);
212  * Unset all assigned template variables
213  * 消除所有已赋值的变量
214  */
215 public function clearVars();
218  * Render the template named $name
219  * 输出参数$name指定的某个模板
220  */
221 public function render($name);]]>
222             </programlisting>
224             <para>
225                使用这个接口,把第三方的模板系统封装成Zend_View兼容的类是相当容易的。例如,下面是封装Smarty的示例代码:
226             </para>
228             <programlisting role="php"><![CDATA[
229 require_once 'Zend/View/Interface.php';
230 require_once 'Smarty.class.php';
232 class Zend_View_Smarty implements Zend_View_Interface
234     /**
235      * Smarty object
236      * @var Smarty
237      */
238     protected $_smarty;
240     /**
241      * Constructor
242      *
243      * @param string $tmplPath
244      * @param array $extraParams
245      * @return void
246      */
247     public function __construct($tmplPath = null, $extraParams = array())
248     {
249         $this->_smarty = new Smarty;
251         if (null !== $tmplPath) {
252             $this->setScriptPath($tmplPath);
253         }
255         foreach ($extraParams as $key => $value) {
256             $this->_smarty->$key = $value;
257         }
258     }
260     /**
261      * Return the template engine object
262      *
263      * @return Smarty
264      */
265     public function getEngine()
266     {
267         return $this->_smarty;
268     }
270     /**
271      * Set the path to the templates
272      *
273      * @param string $path The directory to set as the path.
274      * @return void
275      */
276     public function setScriptPath($path)
277     {
278         if (is_readable($path)) {
279             $this->_smarty->template_dir = $path;
280             return;
281         }
283         throw new Exception('Invalid path provided');
284     }
286     /**
287      * Retrieve the current template directory
288      *
289      * @return string
290      */
291     public function getScriptPaths()
292     {
293         return array($this->_smarty->template_dir);
294     }
296     /**
297      * Alias for setScriptPath
298      *
299      * @param string $path
300      * @param string $prefix Unused
301      * @return void
302      */
303     public function setBasePath($path, $prefix = 'Zend_View')
304     {
305         return $this->setScriptPath($path);
306     }
308     /**
309      * Alias for setScriptPath
310      *
311      * @param string $path
312      * @param string $prefix Unused
313      * @return void
314      */
315     public function addBasePath($path, $prefix = 'Zend_View')
316     {
317         return $this->setScriptPath($path);
318     }
320     /**
321      * Assign a variable to the template
322      *
323      * @param string $key The variable name.
324      * @param mixed $val The variable value.
325      * @return void
326      */
327     public function __set($key, $val)
328     {
329         $this->_smarty->assign($key, $val);
330     }
332     /**
333      * Retrieve an assigned variable
334      *
335      * @param string $key The variable name.
336      * @return mixed The variable value.
337      */
338     public function __get($key)
339     {
340         return $this->_smarty->get_template_vars($key);
341     }
343     /**
344      * Allows testing with empty() and isset() to work
345      *
346      * @param string $key
347      * @return boolean
348      */
349     public function __isset($key)
350     {
351          return (null !== $this->_smarty->get_template_vars($key));
352     }
354     /**
355      * Allows unset() on object properties to work
356      *
357      * @param string $key
358      * @return void
359      */
360     public function __unset($key)
361     {
362         $this->_smarty->clear_assign($key);
363     }
365     /**
366      * Assign variables to the template
367      *
368      * Allows setting a specific key to the specified value, OR passing an array
369      * of key => value pairs to set en masse.
370      *
371      * @see __set()
372      * @param string|array $spec The assignment strategy to use (key or array of key
373      * => value pairs)
374      * @param mixed $value (Optional) If assigning a named variable, use this
375      * as the value.
376      * @return void
377      */
378     public function assign($spec, $value = null)
379     {
380         if (is_array($spec)) {
381             $this->_smarty->assign($spec);
382             return;
383         }
385         $this->_smarty->assign($spec, $value);
386     }
388     /**
389      * Clear all assigned variables
390      *
391      * Clears all variables assigned to Zend_View either via {@link assign()} or
392      * property overloading ({@link __get()}/{@link __set()}).
393      *
394      * @return void
395      */
396     public function clearVars()
397     {
398         $this->_smarty->clear_all_assign();
399     }
401     /**
402      * Processes a template and returns the output.
403      *
404      * @param string $name The template to process.
405      * @return string The output.
406      */
407     public function render($name)
408     {
409         return $this->_smarty->fetch($name);
410     }
411 }]]>
412             </programlisting>
414             <para>
415                 在这个示例中,实例化<code>Zend_View_Smarty</code>而不是<code>Zend_View</code>,然后就像使用 <code>Zend_View</code>一样地使用它。
416             </para>
418             <programlisting role="php"><![CDATA[
419 $view = new Zend_View_Smarty();
420 $view->setScriptPath('/path/to/templates');
421 $view->book = 'Zend PHP 5 Certification Study Guide';
422 $view->author = 'Davey Shafik and Ben Ramsey'
423 $rendered = $view->render('bookinfo.tpl');]]>
424             </programlisting>
426         </sect3>
427     </sect2>
429 </sect1>
430 <!--
431 vim:se ts=4 sw=4 et: