Zend_Form_Decorator - Как добавить атрибут для Zend_Form_Element_Hidden? - PullRequest
0 голосов
/ 03 февраля 2009

У меня есть 2 требования: 1) Все скрытые элементы ввода должны быть затронуты без удаления стандартных декораторов. 2) Это должно происходить БЕЗ необходимости указывать его для каждого элемента.

Все, что мне нужно, это чтобы класс CSS был присоединен к тэгам DT & DD, если тип элемента Zend_Form_Element_Hidden.

Я пытался создать собственные декораторы HtmlTag, DtDdWrapper и FormElement, но не смог выяснить, как это сделать.

По умолчанию они выглядят так:

<dt>&nbsp;</dt>
<dd><input type="hidden" name="whatever" value="bling" /></dd>

Я бы хотел, чтобы они выглядели так:

<dt class="hidden">&nbsp;</dt>
<dd class="hidden"><input type="hidden" name="whatever" value="bling" /></dd>

Таким образом, они все еще будут там, где должны быть, но они не будут прерывать поток документа.

Пример того, что не сработало:

class My_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_DtDdWrapper
{
    public function render($content)
    {
        if ($this->getElement() instanceof Zend_Form_Element_Hidden)
        {
            return '<dt class="hidden">&nbsp;</dt><dd class="hidden">'.$content.'</dd>';
        }
        else
        {
            return parent::render($content);
        }
    }

Ответы [ 2 ]

3 голосов
/ 06 февраля 2009

Исходя из вашего желаемого примера вывода, мне неясно, почему вы захотите включить <dt> в скрытые элементы, тем более, что вы не применяете никакой метки, в итоге они становятся ненужной разметкой. Исходя из предположения, что метка не нужна , вы можете добиться желаемого эффекта с помощью следующего:

class TestForm extends Zend_Form
{
    protected $_hiddenElementDecorator = array(
        'ViewHelper',
        array('HtmlTag', array('tag' => 'dd', 'class' => 'hidden')),
    );

    public function init()
    {
        $this->addElement('hidden', 'hiddenElement0');

        $element = new Zend_Form_Element_Hidden('hiddenElement1');
        $this->addElement($element);

    }

    public function loadDefaultDecorators()
    {
        foreach ($this->getElements() as $element) {
            if ($element->getType() === "Zend_Form_Element_Hidden") {
                $element->setDecorators($this->_hiddenElementDecorator);
            }
        }

        parent::loadDefaultDecorators();
    }
}

Оба вышеперечисленных элемента приведут к тому же выводу с их соответствующими идентификаторами. Пример:

<dd class="hidden">
    <input type="hidden" name="hiddenElement0" value="" id="hiddenElement0" />
</dd>

Цикл foreach в методе loadDefaultDecorators() итеративно применяет $this->_hiddenElementDecorator к каждому скрытому элементу формы при построении формы. Если вы хотите применить декоратор скрытых элементов к нескольким формам, просто создайте родительский класс с переменной $_hiddenElementDecorator и методом loadDefaultDecorators().


Однако, если ваше сердце настроено на включение элемента метки (<dt>), как описано в выходных данных вашего примера, и применение «скрытого» класса, вы получите:

<dt class="hidden">&nbsp;</dt>
<dd class="hidden">
    <input type="hidden" name="hiddenElement0" value="" id="hiddenElement0" />
</dd>

... вам нужно будет расширить класс Zend_Form_Decorator_Label и переопределить метод render (). Посмотрите на комментарий в блоке if (null !== $tag):

class My_Form_Decorator_Label extends Zend_Form_Decorator_Label
{
    public function render($content)
    {
        $element = $this->getElement();
        $view    = $element->getView();
        if (null === $view) {
            return $content;
        }

        $label     = $this->getLabel();
        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $tag       = $this->getTag();
        $id        = $this->getId();
        $class     = $this->getClass();
        $options   = $this->getOptions();

        if (empty($label) && empty($tag)) {
            return $content;
        }

        if (!empty($label)) {
            $options['class'] = $class;
            $label = $view->formLabel($element->getFullyQualifiedName(), trim($label), $options);
        } else {
            $label = '&nbsp;';
        }

        if (null !== $tag) {
            require_once 'Zend/Form/Decorator/HtmlTag.php';
            $decorator = new Zend_Form_Decorator_HtmlTag();
            // Add 'class' => 'hidden' to the <dt> tag decorator options.
            $decorator->setOptions(array('tag' => $tag, 'class' => 'hidden'));
            $label = $decorator->render($label);
        }

        switch ($placement) {
            case self::APPEND:
                return $content . $separator . $label;
            case self::PREPEND:
                return $label . $separator . $content;
        }

    }
}

Наконец, чтобы применить новый декоратор ко всем скрытым элементам формы, вам нужно добавить точку пути префикса элемента в ваш декоратор и повторно добавить декоратор меток в массив $_hiddenElementDecorator в классе TestForm:

class TestForm extends Zend_Form
{
    protected $_hiddenElementDecorator = array(
        'ViewHelper',
        array('HtmlTag', array('tag' => 'dd', 'class' => 'hidden')),
        // Add back the label element.
        array('Label', array('tag' => 'dt', 'class' => 'hidden')),
    );

    public function init()
    {
        $this->addElement('hidden', 'hiddenElement0');

        $element = new Zend_Form_Element_Hidden('hiddenElement1');
        $this->addElement($element);

    }

    public function loadDefaultDecorators()
    {
        foreach ($this->getElements() as $element) {
            if ($element->getType() === "Zend_Form_Element_Hidden") {
                $element->setDecorators($this->_hiddenElementDecorator);
            }
        }

        // Add a decorator prefix path pointing to our new nifty decorator.
        $this->addElementPrefixPath('My_Form_Decorator', '/path/to/Decorator', Zend_Form_Element::DECORATOR);
        parent::loadDefaultDecorators();
    }
}        

Легко, как пирог, нет?

0 голосов
/ 03 февраля 2009

Это поможет вам: Вы также можете указать любые другие атрибуты.

$el = $form->getElement('whatever');
$el->addDecorators(
            array('ViewHelper',
            array('HtmlTag',array('tag' => 'dt','class'=>'hidden')),
            array('Label', array('tag' => 'dd ',  'class'=>'hidden')),
            ));
...