Подтвердить что ты не робот

Zend Framework: Как удалить декораторы в Zend Form Hidden Element?

Я пытаюсь удалить декораторы по умолчанию в скрытом элементе формы. По умолчанию скрытый элемент отображается следующим образом:

<dt>Hidden Element Label (if I had set one)</dt>
<dd><input type="hidden" name="foobar" value="1" id="foobar"></dd>

Я не хочу, чтобы мой скрытый элемент занимал место на моей странице. Я хочу удалить все декодеры по умолчанию, поэтому все, что мне осталось, это тег ввода.

<input type="hidden" name="foobar" value="1" id="foobar">

Как я могу это достичь?

4b9b3361

Ответ 1

Для скрытого поля вам нужен только один декоратор - ViewHelper:

$field = new Zend_Form_Element_Hidden('id');
$field->setDecorators(array('ViewHelper'));

Это будет отображать только поле ввода без оболочки Dt-Dd и метки.

Ответ 2

Из Документация Zend Element Decorators:

Декораторы по умолчанию не нужны Загруженный

По умолчанию декораторы по умолчанию загружается при инициализации объекта. Вы можете отключить это, передав опция disableLoadDefaultDecorators конструктору:

$element = new Zend_Form_Element('foo', 
    array('disableLoadDefaultDecorators' => true)
);

Ответ 3

Я использую этот

$element->removeDecorator('DtDdWrapper');

чтобы избавиться от тегов dt dd вокруг определенных элементов

Ответ 4

//на основе выше - простая функция для добавления скрытого элемента в $this form

/**
 * Add Hidden Element
 * @param $field
 * @param value
 * @return nothing - adds hidden element
 * */
public function addHid($field, $value){     
    $hiddenIdField = new Zend_Form_Element_Hidden($field);
    $hiddenIdField->setValue($value)
          ->removeDecorator('label')
          ->removeDecorator('HtmlTag');     
    $this->addElement($hiddenIdField);
}

Ответ 5

Когда у вас много скрытых вводов, лучшим ответом является следующее:

$elements = $this->getElements();
foreach ($elements as $elem)
    if ($elem instanceof Zend_Form_Element_Hidden)
        $elem->removeDecorator('label')->removeDecorator('HtmlTag');

Ответ 6

Как упоминалось в других сообщениях setDisableLoadDefaultDecorators(true) не работает, если они уже загружены... НО clearDecorators() does!

Ответ 7

Я не мог заставить disableLoadDefaultDecorators работать совершенно правильно. Вот решение, которое я придумал.

$hiddenIdField = new Zend_Form_Element_Hidden('id');
$hiddenIdField->setValue($portalId)
              ->removeDecorator('label')
              ->removeDecorator('HtmlTag'); 

В HTML скрытое поле появляется без каких-либо дополнительных тегов вокруг него.

...
<dt><label for="password" class="required">Password</label></dt>
<dd><input type="password" name="password" id="password" value="" /></dd>
<input type="hidden" name="id" value="1" id="id" />
...

Ответ 9

Использование только одного декоратора "ViewHelper" приведет к созданию недопустимой разметки, если вы все еще используете обертку <dl>. Другой подход описан в ZF-2718. Это добавляет скрытые поля к подформе, которая завернута в <dd>.

Ответ 10

Ну, в 2012 году и все тот же вопрос. Если вы удалите декораторы, html не будет проверяться. Если вы оставите их, скрытые элементы занимают место. Во всех моих проектах у меня есть помощник CSS.hidden, поэтому я просто применяю его к <dd> и удаляю метку:

$element = new Zend_Form_Element_Hidden('foo', array('value' => 'bar'));
$element->removeDecorator('Label');
$element->getDecorator('HtmlTag')->setOption('class', 'hidden');

Действительный html (5), красиво выглядящие формы. Это также может входить в пользовательский декоратор для скрытых полей.

ИЗМЕНИТЬ

Вот как я помещаю его в свой собственный элемент формы:

class Exanto_Form_Element_Hidden extends Zend_Form_Element_Hidden
{
    public function render(Zend_View_Interface $view = null)
    {
        $this->removeDecorator('Label');
        $this->getDecorator('HtmlTag')->setOption('class', 'hidden');
        return parent::render($view);
    }
}

Ответ 11

Используйте это:

    foreach ($this->getElements() as $element) {

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }