对于一次性显示表单对象中的所有元素来说,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>