6.7 半自动视图显示

对于一次性显示表单对象中的所有元素来说,auto()方法是非常方便的,但是通常我们仅需要显示某些元素,有时候只是某个字段集或某组的一部分。因此,光有auto()是不够的,我们还需要其他form()辅助类,且需要从表单对象中单独获取元素。

在本节中,我们想象一下,我们有一个从记录对象Acme_Model_Users_Record产生的表单对象,包括以下元素:

<?php
$this->form->elements['user[handle]']      = array(...);
$this->form->elements['user[moniker]']     = array(...);
$this->form->elements['user[name_first]']  = array(...);
$this->form->elements['user[name_middle]'] = array(...);
$this->form->elements['user[name_last]']   = array(...);
$this->form->elements['user[email]']       = array(...);
$this->form->elements['user[phone]']       = array(...);

6.7.1 字段域

假设这个视图有一个要求:我们必须把名称部分放在一个字段域中,联系人部分放到另一个字段域中。

<?php
echo $this->form()
          ->meta($this->form)
          ->beginFieldset('LEGEND_NAME')
          ->addElements($this->form->getElements('user[name_'))
          ->endFieldset()
          ->beginFieldset('LEGEND_CONTACT')
          ->addElements($this->form->getElements(array(
                'user[email]',
                'user[phone]',
            )))
          ->endFieldset()
          ->addProcess('save')
          ->fetch();

meta()方法获取表单的状态,form标签的属性及整个表单的反馈信息(像“成功”或“失败”这类顶层的反馈信息)。

beginFieldset()endFieldset()方法分别添加fieldset的开始和关闭标签。

addElements()方法仅添加列出的元素。Solar_Form::getElements()方法从表单对象中获取元素。如果你传递一个字符串参数,它将返回那些名称以该字串串开头的元素;如果你传递一个元素名称的数组,它将仅仅返回指定的元素。

上面的视图脚本产生的输出如下。

<form method="post" enctype="multipart/form-data">
    <fieldset>
        <legend>LEGEND_NAME</legend>
        <dl class="list">
            <dt class="user-name_first">
                <label for="user-name_first" class="user-name_first">LABEL_NAME_FIRST</label>
            </dt>
            <dd class="user-name_first">
                <input type="text" name="user[name_first]" value="" id="user-name_first" 
                    class="input-text user-name_first"
                />
            </dd>
            <dt class="user-name_middle">
                <label for="user-name_middle" class="user-name_middle">LABEL_NAME_MIDDLE</label>
            </dt>
            <dd class="user-name_middle">
                <input type="text" name="user[name_middle]" value="" id="user-name_middle" 
                    class="input-text user-name_middle"
                />
            </dd>
            <dt class="user-name_last">
                <label for="user-name_last" class="user-name_last">LABEL_NAME_LAST</label>
            </dt>
            <dd class="user-name_last">
                <input type="text" name="user[name_last]" value="" id="user-name_last" 
                    class="input-text user-name_last" 
                />
            </dd>
        </dl>
    </fieldset>
    <fieldset>
        <legend>LEGEND_CONTACT</legend>
        <dl class="list">
            <dt class="user-email">
                <label for="user-email" class="user-email">Email</label>
            </dt>
            <dd class="user-email">
                <input type="text" name="user[email]" value="" id="user-email" 
                    class="input-text user-email"
                />
            </dd>
            <dt class="user-phone">
                <label for="user-phone" class="user-phone">LABEL_PHONE</label>
            </dt>
            <dd class="user-phone">
                <input type="text" name="user[phone]" value="" id="user-phone" 
                    class="input-text user-phone" 
                />
            </dd>
        </dl>
    </fieldset>
    <dl class="list">
        <dt class="process-save">
            
        </dt>
        <dd class="process-save">
            <input type="submit" name="process" value="Save" id="process-save" 
                class="input-submit process-save"
            />
        </dd>
    </dl>
</form>