У меня есть страница, на которой есть несколько форм. Некоторые формы имеют элемент с тем же именем, что и CustomerID. Это означает, что идентификатор ID элемента 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; }
Я думаю, что проще просто использовать 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);