У меня есть объект 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');