第 53 章 Zend_View

目录

53.1. 简介
53.1.1. 控制器脚本
53.1.2. 视图脚本
53.1.3. 选项
53.1.4. 实用访问器
53.2. 控制器脚本
53.2.1. 变量赋值
53.2.2. 调用视图脚本并打印输出
53.2.3. 视图脚本的路径
53.3. 视图脚本
53.3.1. 转义输出(Escaping Output)
53.3.2. 使用模板系统
53.3.2.1. 使用View脚本的模板系统
53.3.2.2. 通过Zend_View_Interface接口使用模板系统
53.4. 视图助手(View Helper)
53.4.1. 基本的助手
53.4.1.1. 动作视图助手
53.4.1.2. 区域助手(Partial Helper)
53.4.1.3. 占位符助手(Placeholder Helper)
53.4.1.3.1. 具体占位符实现
53.4.1.4. 文档类型助手(Doctype Helper)
53.4.1.5. HeadLink 助手
53.4.1.6. HeadMeta 助手
53.4.1.7. HeadScript 助手
53.4.1.8. HeadStyle 助手
53.4.1.9. HeadTitle 助手
53.4.1.10. HTML 对象助手
53.4.1.11. InlineScript 助手
53.4.1.12. JSON 助手
53.4.1.13. 翻译助手
53.4.2. 助手的路径
53.4.3. 编写自定义的助手类

53.1. 简介

Zend_View是用来在MVC模式中处理View(视图)部份的一个类。也就是说它用来使视图部份的代码与Model及controller部分分离。它提供了helper,output filter,variable escaping等几个功能组件。

Zend_View使用PHP本身作为你的模板,或者你也可以建立其它模板引擎的实例,并用你的view代码来对其进行操作。

使用Zend_View主要有两步: 1. 你的Controller建立一个Zend_View实例,并将需要的变量传递给它; 2. Controller告诉Zend_View解析一个特定的视图,生成View输出的内容。

53.1.1. 控制器脚本

下面是一个简单的例子。假设你有一个书籍清单,想把它打印出来。控制器代码可能看起来是这样的:

<?php
//使用一个模型来获取书籍作者和标题相关数据。
$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'
    )
);

//传递数据给Zend_View类的实例 
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View();
$view->books = $data;

//解析一段View代码"booklist.php"来显示数据
echo $view->render('booklist.php');
        

53.1.2. 视图脚本

现在我们看看相关的视图代码"booklist.php"。这是一段普通的代码,但是有一点特别:它是在Zend_View实例的内部运行的,所以$this指向的是Zend_View实例和类方法。(controller传递给Zend_View实例的变量是public的)。一段非常基本的视图代码看起来是这样的:

<?php if ($this->books): ?>

    <!-- 包含几本书信息的HTML表格. -->
    <table>
        <tr>
            <th>Author</th>
            <th>Title</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>There are no books to display.</p>

<?php endif; ?>
        

注意我们使用escape()来转义输出。

53.1.3. 选项

Zend_View有若干选项来配置视图脚本的运行。

  • basePath: 指示一个基本路径,可以在下面设置script、 helper 和 filter 路径。目录结构如下:

    base/path/
        helpers/
        filters/
        scripts/
                    

    可以通过 setBasePath()addBasePath()、或 basePath设置给构造器。

  • encoding: 指定 htmlentities()htmlspecialchars()和其它操作所采用的字符集,缺省为 ISO-8859-1 (latin1)。也可以通过setEncoding()encoding 设置给构造器。

  • escape: 指定escape()所使用的回调函数(callback)。也可以通过setEscape()escape设置给构造器。

  • filter: 指示在解析视图脚本后使用的过滤器。可以通过setFilter()addFilter()或者filter设置给构造器。

  • strictVars: 指定某些未初始化的视图变量被访问时,Zend_View必须发出通知和警告。可以通过调用strictVars(true) 或传递strictVars给构造器来设置。

53.1.4. 实用访问器

一般来说,你只需要调用assign()render()或其中之一来设置/添加过滤器、助手类、和脚本路径。然而,如果希望扩展Zend_View或需要访问它的内部,有许多访问器(Accessor)可用:

  • getVars() 将返回所有已赋值的变量。

  • clearVars() 将清除所有已赋值的变量;当你想重新使用同一个视图对象,并决定哪些变量可用时,这个功能很有用。

  • getScriptPath($script) 将获取指定的视图脚本的路径。

  • getScriptPaths() 将获取所有注册的脚本路径。

  • getHelperPath($helper) 将获取已命名的助手类的路径。

  • getHelperPaths() 将获取所有注册的助手路径。

  • getFilterPath($filter) 将获取已命名的过滤器类的路径。

  • getFilterPaths() 将获取所有注册的过滤器文件的路径。