我已经构建了一个Zend_Form_Decorator_Input类,它扩展了Zend_Form_Decorator_Abstract,这样我就可以自定义表单输入 - 效果很好。我在decorate类中遇到了一个问题,试图获取元素的表单名称,以便为每个字段构建一个唯一的id(如果有多个表单具有相同的字段名称)。
没有这样的方法:Zend_Form_Element :: getForm();似乎Zend_Form_Decorator_Abstract也没有这种能力。有什么想法吗?
答案 0 :(得分:1)
我不认为从装饰器中更改id是正确的方法。在调用decorator时,元素已经被渲染。因此,更改id对源代码没有任何影响。另外,正如您已经指出的那样,表单及其元素之间的关系是单向的,即(据我所知),没有直接的方法从元素访问表单。
到目前为止坏消息。
好消息是,对您的问题实际上有一个非常简单的解决方案:Zend_Form
选项elementsBelongTo
。它可以防止将相同的ID分配给两个具有相同名称但属于不同形式的表单元素:
$form1 = new Zend_Form(array('elementsBelongTo' => 'form1'));
$form1->addElement('Text', 'text1');
$form2 = new Zend_Form(array('elementsBelongTo' => 'form2'));
$form2->addElement('Text', 'text1');
虽然两个表单都有一个名为“text1”的文本字段,但它们有不同的ID:'form1-text1'和'form2-text1'。但是,这有一个主要缺点:这也改变了名称元素,使其格式为formname[elementname]
。因此$this->getRequest()->getParam('formname')
将返回包含表单元素的关联数组。