2012-03-20 55 views
3

我有一个页面上有多个表单。几个表单共享一个具有相同名称(如CustomerID)的元素。这意味着元素ID CustomerID将与其他表单中的相同ID冲突。我想找一个干净的方式来在字段名称前加上表单的名称。例如PaymentProfile_CustomerID。建议?有没有一种方法来作为Zend_Form元素名称的前缀?

到目前为止,我已经能够拿出最好的是:下面

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()); 
     } 
    } 
} 

UPDATE @加维的回答有一个简单的修改工作良好。

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; 
} 

回答

3

我觉得它更容易只需使用elementsBelongTo

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

编辑:扩大以供将来使用

使用elementsBelongTo包裹在阵列中的所有表单元素,所以你会得到

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

输出:

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

我会看看,看看有什么。谢谢! – David 2012-03-21 16:40:25

+0

这似乎是我尝试完成的最正确的方法。谢谢你。 – David 2012-03-21 16:46:52

+0

对不起,以前这样简短的答案,但我没有太多时间,但我可以看到它已经足够了:]。我扩大了我的答案,以备将来参考。 – vandalizmo 2012-03-21 19:51:57

2

我调查了您的问题。我认为最好的办法是延长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); 
+0

我添加的方式为例来实现目标,但我觉得我喜欢你的方式更好。 – David 2012-03-20 16:36:42

+0

我不得不根据您的示例进行一些修改,但效果很好,谢谢! – David 2012-03-20 16:46:04

相关问题