28.4. 视图助手（View Helper）
上一页 | 第 28 章 Zend_View | 下一页

## 28.4. 视图助手（View Helper）

在你的视图脚本中，经常需要执行某些特定的复杂的函数，例如，格式化日期，生成表单对象，或者显示action的链接等等。你可以使用助手类来完成这些工作。

你可以用$this->helperName()来调用helper。这时Zend_View会加载 Zend_View_Helper_HelperName类，建立一个对象实例，并调用它的helperName()方法。对象的实例会在 Zend_View的实例内一直存在，并可以被$this->helperName()重复调用。

### 28.4.1. 基本的助手

Zend_View自带了几个helper类，都是用来生成组件的。每个都有自动过滤变量的功能。

- formButton($name, $value, $attribs): 生成<input type="button" />

- formCheckbox($name, $value, $attribs, $options): 生成<input type="checkbox" />，$options参数是一个数组，第一个值是“checked”,第二个值是"unchecked"(默认为“1”和"0")。如果$value匹配"checked"值，则这个checkbox显示为已选中。

- formFile($name, $value, $attribs): 生成<input type="file" />

- formHidden($name, $value, $attribs): 生成<input type="hidden" />

- formPassword($name, $value, $attribs): 生成<input type="password" />

- formRadio($name, $value, $attribs, $options): 生成一系列<input type="button" />，每个$options数组元素一个，key为radio的值，并且元素的值是radio的标签。

- formReset($name, $value, $attribs): 生成<input type="reset" />

- formSelect($name, $value, $attribs, $options): 建立一个<select>...</select>标签，其中的每个<option>对应于一个$option数组元素。元素的key是option的值，元素的值是option的标签。$value这个值的option默认为选中。

- formSubmit($name, $value, $attribs): 生成<input type="submit" />

- formText($name, $value, $attribs): 生成<input type="text" />

- formTextarea($name, $value, $attribs): 生成<textarea>...</textarea>

Using these in your view scripts is very easy, here is an example. Note that you all you need to do is call them; they will load and instantiate themselves as they are needed. 使用非常简单，下面是个例子。注意你只需要调用即可，它们会自己加载并实例化。

    <?php
    // inside your view script, $this refers to the Zend_View instance.
    //
    // say that you have already assigned a series of select options under
    // the name $countries as array('us' => 'United States', 'il' =>
    // 'Israel', 'de' => 'Germany').
    ?>
    <form action="action.php" method="post">
        <p><label>Your Email:
            <?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?>
        </label></p>
        <p><label>Your Country:
            <?php echo $this->formSelect('country', 'us', null, $this->countries) ?>
        </label></p>
        <p><label>Would you like to opt in?
            <?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?>
        </label></p>
    </form>

以上视图脚本会输出这样的结果：

    <form action="action.php" method="post">
        <p><label>Your Email:
            <input type="text" name="email" value="you@example.com" size="32" />
        </label></p>
        <p><label>Your Country:
            <select name="country">
                <option value="us" selected="selected">United States</option>
                <option value="il">Israel</option>
                <option value="de">Germany</option>
            </select>
        </label></p>
        <p><label>Would you like to opt in?
            <input type="hidden" name="opt_in" value="no" />
            <input type="checkbox" name="opt_in" value="yes" checked="checked" />
        </label></p>
    </form>

### 28.4.2. Helper 的路径

就像视图脚本那样，你的控制器也可以设定helper的路径给Zend_View。默认地，Zend_View会到 “Zend/View/Helper/”下查找helper类。你可以用setHelperPath() 和 addHelperPath()来定义自己的路径。另外，你可以指定类名的前缀，用于指定助手类所在的路径。默认情况下，如果没有给出前缀，会假设使用“Zend_View_Helper_”。

    <?php
    $view = new Zend_View();

    // Set path to /path/to/more/helpers, with previs 'My_View_Helper'
    $view->setHelperPath('/path/to/more/helpers', 'My_View_Helper');
    ?>

你可以用addHelperPath()来增加helper的路径， Zend_View将使用最近增加的路径。这样你可以使用自己的helper。

    <?php
    $view = new Zend_View();
    // Add /path/to/some/helpers with class prefix 'My_View_Helper'
    $view->addHelperPath('/path/to/some/helpers', 'My_View_Helper);
    // Add /other/path/to/helpers with class prefix 'Your_View_Helper'
    $view->addHelperPath('/other/path/to/helpers', 'Your_View_Helper');

    // now when you call $this->helperName(), Zend_View will look first for
    // "/other/path/to/helpers/HelperName.php" using class name "My_View_Helper_HelperName",
    // then for "/path/to/some/helpers/HelperName" using class name "Your_View_Helper_HelperName",
    // and finally for "Zend/View/Helper/HelperName.php" using class name "Zend_View_Helper_HelperName".
    ?>

### 28.4.3. 编写自定义的Helper类

编写自定义的Helper类很容易，只要遵循以下几个原则即可：

- 类名必须是 Zend_View_Helper_*，*是helper的名称。例如，你在写一个名为“specialPurpose”的类，类名将至少是"SpecialPurpose"，另外你还应该给类名加上前缀，建议将“View_Helper”作为前缀的一部份：“My_View_Helper_SpecialPurpose”。（注意大小写）你将需要将前缀（不包含下划线）传递给`addHelperPath()` 或 `setHelperPath()`。

- 类中必须有一个public的方法，该方法名与helper类名相同。这个方法将在你的模板调用"$this->specialPurpose()"时执行。在我们的“specialPurpose”例子中，相应的方法声明可以是“public function specialPurpose()”。

- 一般来说，Helper类不应该echo或print或有其它形式的输出。它只需要返回值就可以了。返回的数据应当被转义。

- 类文件的命名应该是helper方法的名称，比如在"specialPurpose"例子中，文件要存为“SpecialPurpose.php”。

把helper类的文件放在你的helper路径下， Zend_View就会自动加载，实例化，持久化，并执行。

下面是一个例子：

    <?php
    class My_View_Helper_SpecialPurpose {
        protected $_count = 0;
        public function specialPurpose()
        {
            $this->_count++;
            $output = "I have seen 'The Jerk' {$this->_count} time(s).";
            return htmlspecialchars($output);
        }
    }
    ?>

Then in a view script, you can call the SpecialPurpose helper as many times as you like; it will be instantiated once, and then it persists for the life of that Zend_View instance. 在视图代码中，你可以调用SpecialPurpose助手任意次。它将被实例化一次，并且会在Zend_View实例的生命周期内持久存在。

    <?php
    // remember, in a view script, $this refers to the Zend_View instance.
    echo $this->specialPurpose();
    echo $this->specialPurpose();
    echo $this->specialPurpose();
    ?>

输出结果如下所示：

    I have seen 'The Jerk' 1 time(s).
    I have seen 'The Jerk' 2 time(s).
    I have seen 'The Jerk' 3 time(s).

上一页 | 上一级 | 下一页
28.3. 视图脚本 | 起始页 | 第 29 章 Zend_Validate