Php Zend子窗体:如何禁用子窗体内元素名称的更改?
我有一个zend表单,其中我需要每个元素都由一个显示组包装。然后我需要将一组元素包装到另一个显示组中。因为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
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的工作原理是错误的,请你举一个工作示例好吗?这取决于装饰师的顺序。我用一个例子更新了我的答案。我不知道顺序有多重要。。应该多加注意。非常感谢。