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

Php Zend子窗体:如何禁用子窗体内元素名称的更改?,php,forms,zend-framework,zend-form,Php,Forms,Zend Framework,Zend Form,我有一个zend表单,其中我需要每个元素都由一个显示组包装。然后我需要将一组元素包装到另一个显示组中。因为zend表单不支持嵌套的显示组,所以我改用子表单 因此,我现在的结构是: Form --- SubForm (1) --- --- DisplayGroup (1-1) --- --- --- Element (1) --- --- DisplayGroup (1-2) --- --- --- Element (2) --- SubForm (2) --- --- DisplayGroup

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

因为我使用子窗体作为显示组的替代品,所以我不需要它的额外功能

如何禁用此名称更改


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

从您的评论中可以看出,您只使用显示组为元素提供twitter引导网格类。您不需要为此使用显示组,只需向每个表单元素添加额外的HtmlTag装饰器,或向现有元素之一添加一个类。然后,您可以将显示组用于其预期用途,从而提供:

Form
--- DisplayGroup (1)
--- --- Element (1)
--- --- Element (2)
--- DisplayGroup (2)
--- --- Element (3)
--- --- Element (4)
如果您有任何问题,请编辑您的问题,以包含正在修改现有装饰器的“批量处理”代码。我们可以建议如何修改它

编辑:让decorator包装标签和表单元素只取决于指定decorator的顺序。下面是一个例子:

$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将包装其他所有内容

子表单元素名称中使用的数组表示法由
Zend\u form::$\u isArray
控制。它在
Zend\u表单
中为false,在扩展
Zend\u表单
Zend\u表单子表单
中为true


您可以调用
setIsArray(FALSE)
在子窗体上,或者覆盖子窗体中的
Zend_form::$\u isArray
如果它扩展了
Zend_form_子窗体

为什么需要用显示组包装每个元素?每个元素都应该继承twitter引导css框架中的span4或span6,以便显示在列中。此外,它应该是Zend_表单,而不是视图-客户端需求。我尝试过使用HtmlTag装饰器,但它只应用于输入元素,标签留在包装器之外。我需要一个装饰,将包装标签和元素。如果你认为我对HtmlTag的工作原理是错误的,请你举一个工作示例好吗?这取决于装饰师的顺序。我用一个例子更新了我的答案。我不知道顺序有多重要。。应该多加注意。非常感谢。