Zend SubForm:如何禁用子表单中元素名称的更改?

时间:2012-08-14 14:11:05

标签: php forms zend-framework zend-form

我有一个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)

然而,由此产生的问题是每个子表单都被设置为属于它的每个元素的父表单。这会更改元素的名称,f.e。 name="username"变为name="subformname[username]"

由于我使用子窗体代替显示组,因此我不需要它的额外功能。

如何禁用此更改名称?

PS:我使用自定义函数来“批量处理”每个元素(琐碎的东西 - 删除装饰器,设置标签等),所以我能够强制setAttrib('name', $element -> getName()),但事实证明这只是适用于常规表单元素。它不适用于像datepickers,colorpickers等ZendX表单元素。

2 个答案:

答案 0 :(得分:0)

根据您所说的评论,您只使用显示组为元素提供了一个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'));

viewHelper装饰器呈现表单元素本身。每个后续装饰器都包裹在现有内容周围。具体如何呈现取决于装饰器本身,但在上面的示例中,您将看到一个div标签,其中“span4”类作为最后一个装饰器,这意味着div将包装其他所有内容。

答案 1 :(得分:0)

子表单元素名称中使用的数组表示法由Zend_Form::$_isArray控制。它Zend_Form中的 false Zend_Form_SubForm中的 true ,扩展了Zend_Form

您可以在子表单上致电setIsArray(FALSE),也可以在子表单中覆盖Zend_Form::$_isArray,如果它延伸Zend_Form_SubForm