2012-03-20 3 views
3

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

+0

Это, по-видимому, самый правильный способ выполнить то, что я пытался сделать. Спасибо, agian. – David

+0

Простите за такой короткий ответ раньше, но у меня не было много времени раньше, но, как я вижу, этого было достаточно:]. Я расширил свой ответ для дальнейшего использования. – vandalizmo

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

+0

Я должен был сделать несколько модификаций, на ваш пример, но он работает хорошо, спасибо! – David

Смежные вопросы