Вопрос

У меня есть 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);
        }
    }
Это было полезно?

Решение

Основываясь на желаемом примере вывода, я не понимаю, почему вы хотите включить <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 class и переопределить метод 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();
    }
}        

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

Другие советы

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

$el = $form->getElement('whatever');
$el->addDecorators(
            array('ViewHelper',
            array('HtmlTag',array('tag' => 'dt','class'=>'hidden')),
            array('Label', array('tag' => 'dd ',  'class'=>'hidden')),
            ));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top