2

我有一个Zend_Form对象,我想在一页中多次重复使用。我遇到的问题是每次渲染它都有相同的元素ID。每次呈现表单时,我一直无法找到一种方法来为所有 ID 提供唯一的前缀或后缀。


完整的解决方案

子类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; ?>
4

2 回答 2

2

你可以继承 Zend_Form 和重载render方法来自动生成 id:

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

这只是一个伪代码。当然,您可以修改它以满足您的需要。

于 2010-12-14T20:24:09.320 回答
1

您可以向 Zend_Form 继承的类添加一个静态整数属性(比如说 self::$counter)。您在 init() 方法上增加它。对于您在 Zend_Form 对象上创建的每个元素,您将该属性附加到您的元素:

$element->setAttrib('id', self::$counter + '_myId');
于 2010-12-14T15:07:40.227 回答