有没有一种方法可以为Zend_Form元素名称加前缀


Is there a way to prefix Zend_Form element name?

我有一个页面,上面有多个表单。其中几个表单共享一个名称相同的元素,如CustomerID。这意味着元素ID CustomerID将与其他表单中的相同ID发生冲突。我想找到一种干净的方法,用表单的名称作为字段名称的前缀。例如PaymentProfile_CustomerID。建议?

到目前为止,我能想到的最好的是:

class MyForm extends Zend_Form
{
    public function init()
    {
        $this->setName("PaymentProfile");
        ...
        $this->_prefixElementNames();
    }
    private function _prefixElementNames()
    {
        $elements = $this->getElements();
        $formName = $this->getName();
        foreach($elements as $e) {
            $e->setAttrib('id', $formName . '_' . $e->getName());
        }
    }
}

更新@garvey下面的答案只需简单的修改就可以很好地工作

public function addElement($element, $name = null, $options = null)
{
    $e = parent::addElement($element, $name, $options);
    if($this->getName())
        // I use setAttrib instead of setName because I only want the ID to be changed.
        // Didn't want the form data to be prefixed, just the unique HTML identifier.
        $element->setAttrib('id', $this->getName() . '_' .  $element->getName());
    return $e;
}

我认为只使用elementsBelongTo:更容易

public function init()
{
    $this->setOptions(array(
        'elementsBelongTo' => 'form_name' 
    ));
}

编辑:扩展以供将来使用

使用elementsBelongTo将所有表单元素封装在数组中,因此您将获得

Zend_Debug::dump($this->_getAllParams())

输出:

["form_name"] => array(
    ["element1"] => "value1"
    ["element2"] => "value2"
)

我已经调查了您的问题。我认为最好的方法是像这样扩展Zend_Form类:

class Cubique_Form extends Zend_Form
{
    public function addElement($el)
    {
        $el->setName($this->getName() . '_' .  $el->getName());
        parent::addElement($el);
    }
}

以及表单创建:

$form = new Cubique_Form();
$form->setName('form');
$el = new Zend_Form_Element_Text('element');
$form->addElement($el);