0

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

等等

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

因为我使用子表单来代替显示组,所以我不需要它的额外功能。

如何禁用这种名称更改?

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

4

2 回答 2

1

子表单元素名称中使用的数组表示法由Zend_Form::$_isArray. 它是false inZend_Formtrue in Zend_Form_SubForm,它扩展了Zend_Form

您可以调用setIsArray(FALSE)您的子表单或覆盖Zend_Form::$_isArray您的子表单(如果它扩展Zend_Form_SubForm)。

于 2014-03-26T21:36:27.893 回答
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 将包装其他所有内容。

于 2012-08-14T14:42:44.680 回答