对于一次性显示表单对象中的所有元素来说,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(...);
假设这个视图有一个要求:我们必须把名称部分放在一个字段域中,联系人部分放到另一个字段域中。
<?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>

