扩展Zend_View_Helper_FormElement

时间:2010-06-21 08:47:04

标签: zend-framework zend-form-element

我在My / View / Helper / FormElement.php

创建了这个文件
<?php

abstract class My_View_Helper_FormElement extends Zend_View_Helper_FormElement
{

    protected function _getInfo($name, $value = null, $attribs = null,
        $options = null, $listsep = null
    ) {

        $info = parent::_getInfo($name, $value, $attribs, $options, $listsep);

        $info['id'] = 'My new ID';

        return $info;
    }
}

如何让普通的表单元素代替使用它?

为什么我要这个?

假设我在页面上多次使用相同的表单,formelements的'id =' - 标签将多次出现,这不是w3c-valid。所以最初我想在id前加上表单的id。

任何更好的想法或方法都可以做到这一点。

更新:刚刚意识到这与装饰者有同样的问题:(不要认为这是我采取的正确道路。

2 个答案:

答案 0 :(得分:1)

创建扩展Zend_Form的新表单类,并在init()方法中使用变量$ ns为所有元素添加前缀/后缀。您可以通过表单构造函数设置$ ns变量。

class Form_Test extends Zend_Form
{

protected $ns;

public function init()
{
    $this->setAttrib('id', $this->ns . 'testForm');

    $name = new Zend_Form_Element_Text('name');
    $name->setAttrib('id', $this->ns . 'name');
    $name->setLabel('Name: *')->setRequired(true);


    $submit = new Zend_Form_Element_Submit('submit');
    $submit->setAttrib('id', $this->ns . 'submitbutton');
    $submit->setLabel('Add')->setIgnore(true);

    $this->addElements(array($name, $submit));
}

public function setNs($data)
{
    $this->ns = $data;
}

}

在控制器或您调用的任何位置,此表单指定每个表单实例:

$form1 = new Form_Test(array('ns' => 'prefix1'));
$this->view->form1 = $form1;

$form2 = new Form_Test(array('ns' => 'prefix2'));
$this->view->form2 = $form2;

// Validation if calling from the controller
if ($form1->isValid()) ...

答案 1 :(得分:0)

如果用作子表单,则可以验证在页面上使用相同表单的多个实例。

SubForms为所有id添加前缀,其中包含子表单的名称/标识符。