Zend子窗体:如何禁用子窗体内元素名称的更改


Zend SubForm: How to disable changing of element names inside subforms?

我有一个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 将包装其他所有内容。