2012-08-14 42 views
0

我有一个zend表单,我需要每个元素被显示组包装。然后我需要将一组元素包装在另一个显示组中。由于zend表单不支持嵌套显示组,我改用子表单。Zend SubForm:如何禁用子窗体内部元素名称的更改?

所以,我现在的结构是:

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]"

由于我使用的子表单作为显示组的替代品,我不需要它的额外功能。

如何禁用此名称更改?我正在使用自定义函数来“批量处理”每个元素(平凡的东西 - 删除装饰器,设置标签等),所以我能够强制setAttrib('name', $element -> getName()),但事实证明,这只适用于常规表单元素。它不适用于像datepickers,colorpickers等ZendX表单元素。

+0

为什么你需要用显示组来包装每个元素? – 2012-08-14 14:19:36

+0

每个元素都应该从twitter引导CSS框架继承span4或span6,以便出现在列中。更进一步,它应该在Zend_Form中,而不是在视图 - 客户端的要求。 – user1388771 2012-08-14 14:33:30

回答

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

+0

我曾尝试使用HtmlTag装饰器,但它仅应用于输入元素,并且标签留在包装外。我需要一个包装标签和元素的装饰器。如果您认为我错了HtmlTag的工作原理,请您举一个有效的例子吗? – user1388771 2012-08-14 14:49:38

+0

这只是装饰者的顺序。我用一个例子更新了我的答案。 – 2012-08-14 15:02:18

+0

我不知道订单的重要性..应该更多关注。谢谢! – user1388771 2012-08-14 15:05:14

0

用于子表单元素名称的数组表示法由Zend_Form::$_isArray控制。它是false in Zend_Form and true in Zend_Form_SubForm,它扩展为Zend_Form

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