Есть ли способ добавить префикс имени элемента Zend_Form? - PullRequest
3 голосов
/ 20 марта 2012

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

ОБНОВЛЕНИЕ @ Ответ Гарви, приведенный ниже, хорошо сработал с простой модификацией.

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

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Я думаю, что проще просто использовать elementsBelongTo:

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

edit : расширен для будущего использования

Использование elementsBelongTo оборачивает все элементы формы вмассив, так что вы получите

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

выходные данные:

["form_name"] => array(
    ["element1"] => "value1"
    ["element2"] => "value2"
)
2 голосов
/ 20 марта 2012

Я исследовал вашу проблему.И я думаю, что лучший способ - это расширить класс 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);
...