我有一个zend形式,我需要用一个显示组包装每个元素。然后我需要将一组元素包装在另一个显示组中。由于 zend 表单不支持嵌套显示组,因此我改用子窗体。
所以,我现在的结构是:
Form
--- SubForm (1)
--- --- DisplayGroup (1-1)
--- --- --- Element (1)
--- --- DisplayGroup (1-2)
--- --- --- Element (2)
--- SubForm (2)
--- --- DisplayGroup (2-1)
--- --- --- Element (3)
--- --- DisplayGroup (2-2)
--- --- --- Element (4)
等。
然而,由此产生的问题是,每个子窗体都被设置为属于它的每个元素的父级。这将更改元素的名称,例如 name="username"
变得name="subformname[username]"
.
由于我使用子窗体作为显示组的替代品,因此不需要它的额外功能。
如何禁用此名称更改?
PS:我正在使用自定义函数来"批量处理"每个元素(琐碎的东西 - 删除装饰器、设置标签等),所以我能够强制setAttrib('name', $element -> getName())
,但事实证明这仅适用于常规表单元素。它不适用于 ZendX 表单元素,如日期选择器、颜色选择器等。
子表单元素名称中使用的数组表示法由 Zend_Form::$_isArray
控制。 它在Zend_Form
中是假的,在Zend_Form_SubForm
中是真的,这扩展了Zend_Form
。
您可以在子窗体上调用setIsArray(FALSE)
,也可以在子窗体中覆盖Zend_Form::$_isArray
(如果它扩展Zend_Form_SubForm
)。
从您说的评论中,您只使用显示组为元素提供 Twitter 引导网格类。您不需要为此使用显示组,只需向每个表单元素添加一个额外的 HtmlTag 修饰器,或向现有表单元素之一添加一个类。然后,您可以将显示组用于其预期目的,从而获得:
Form
--- DisplayGroup (1)
--- --- Element (1)
--- --- Element (2)
--- DisplayGroup (2)
--- --- Element (3)
--- --- Element (4)
如果您有任何问题,请编辑您的问题以包含正在修改现有装饰器的"批量处理"代码,我们可以建议如何修改它。
编辑:让装饰器包装标签和表单元素取决于指定装饰器的顺序。下面是一个示例:
$element->addDecorator('ViewHelper')
->addDecorator('Errors')
->addDecorator('Description', array('tag' => 'p', 'class' => 'description'))
->addDecorator('Label', array('optionalSuffix' => ':', 'requiredSuffix' => ':*'))
->addDecorator(array('row' => 'HtmlTag'), array('tag' => 'div', 'class' => 'span4'));
视图帮助程序修饰器呈现表单元素本身。每个后续装饰器都"围绕"现有内容。确切的渲染方式有点取决于装饰器本身,但在上面的例子中,你会看到一个div 标签,其中类 'span4' 作为最后一个装饰器,这意味着div 将包装其他所有内容。