我也发现默认的装饰器是一个巨大的痛苦。我理解为什么他们是这样的,但我认为“不便因素”被严重低估了。
无论如何,我建议对表单使用ViewScripts。请注意,这些视图与视图不同 -- 相反,ViewScript 在 Form 类中显式引用,充当各种“子视图”,并允许您控制每个元素的布局。过去很难找到如何使用ViewScripts的示例,但是我将尝试尝试提供一些有用的东西。
首先,在窗体类中重写 loadDefaultDecorators:
public function loadDefaultDecorators() {
$this->setDecorators(
array(
array('ViewScript',
array('viewScript' => 'foo/bar.phtml')
)
)
);
}
这将引用位于 /views/scripts/foo 中的名为 bar.phtml 的 ViewScript。请注意上面“ViewScript”和“viewScript”中区分大小写的差异。
接下来,您必须调整应用于每个元素的装饰器,以确保它显示,但没有烦人的dt / dd包装器。例如:
$baz = new Zend_Form_Element_Text('bazInput');
$baz->setDecorators(array('ViewHelper','Errors'));
最后,您需要构建 ViewScript,例如:
<form method="post" action="<?php echo $this-element->getAction() ?>">
<table>
<tr>
<td><label for="bazInput">Baz:</label></td>
<td><?php echo $this->element->bazInput ?></td>
</tr>
</table>
<input type="submit" value="Submit Form" />
</form>
显然,这是一个非常简单的示例,但它说明了如何引用表单元素和表单操作。
然后在视图中,只需像往常一样引用并输出表单即可。通过这种方式,您可以更精细地控制表单布局 - 包括轻松添加Javascript。
我相信这种方法可以解决您的两个要求:您可以在纯HTML中构建表单,并且仍然可以利用Zend Form验证机制。