Zend Forms – модификация идентификатора элемента для повторного использования

У меня есть объект Zend_Form который я хочу повторно использовать несколько раз на одной странице. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда она отображается, у нее одинаковые идентификаторы элементов. Я не смог найти метод для предоставления всем идентификаторам уникального префикса или суффикса каждый раз, когда я визуализую форму.


Полное решение

Подкласс Zend_Form :

 class My_Form extends Zend_Form { protected $_idSuffix = null; /** * Set form and element ID suffix * * @param string $suffix * @return My_Form */ public function setIdSuffix($suffix) { $this->_idSuffix = $suffix; return $this; } /** * Render form * * @param Zend_View_Interface $view * @return string */ public function render(Zend_View_Interface $view = null) { if (!is_null($this->_idSuffix)) { // form $formId = $this->getId(); if (0 < strlen($formId)) { $this->setAttrib('id', $formId . '_' . $this->_idSuffix); } // elements $elements = $this->getElements(); foreach ($elements as $element) { $element->setAttrib('id', $element->getId() . '_' . $this->_idSuffix); } } return parent::render($view); } } 

Петля в сценарии вида:

 <?php foreach ($this->rows as $row) : ?> <?php echo $this->form->setDefaults($row->toArray())->setIdSuffix($row->id); ?> <?php endforeach; ?> 

Вы можете подклассифицировать Zend_Form и метод render перегрузки для автоматического создания идентификатора:

 public function render() { $elements = $this->getElements(); foreach ($elements as $element) { $element->setAttrib('id', $this->getName() . '_' . $element->getId(); } } 

Это всего лишь псевдокод. Конечно, вы можете изменить это в соответствии с вашими потребностями.

Вы можете добавить статическое целочисленное свойство (скажем, self :: $ counter) к унаследованному классу Zend_Form. Вы увеличиваете его по методу init (). Для каждого элемента, созданного на вашем объекте Zend_Form, вы добавляете это свойство в свой элемент:

 $element->setAttrib('id', self::$counter + '_myId');