Zend Forms - модификация ID элемента для повторного использования - PullRequest
2 голосов
/ 14 декабря 2010

У меня есть 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; ?>

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

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

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

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

1 голос
/ 14 декабря 2010

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

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