我有一个页面上有多个表单。其中一些表单共享一个具有相同名称的元素,如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());
}
}
}
通过简单的修改,UPDATE @ 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;
}
答案 0 :(得分:3)
我认为使用elementsBelongTo
更容易:
public function init()
{
$this->setOptions(array(
'elementsBelongTo' => 'form_name'
));
}
修改:展开以供将来使用
使用elementsBelongTo
包装数组中的所有表单元素,因此您将获得
Zend_Debug::dump($this->_getAllParams())
输出:
["form_name"] => array(
["element1"] => "value1"
["element2"] => "value2"
)
答案 1 :(得分: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);