Zend Framework: Как удалить декораторы скрытого элемента Zend Form? - PullRequest
49 голосов
/ 27 января 2009

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

<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">

Как мне этого добиться?

Ответы [ 11 ]

50 голосов
/ 07 декабря 2010

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

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

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

32 голосов
/ 27 января 2009

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

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

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

$element = new Zend_Form_Element('foo', 
    array('disableLoadDefaultDecorators' => true)
);
24 голосов
/ 11 февраля 2009

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

$element->removeDecorator('DtDdWrapper');

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

6 голосов
/ 07 марта 2009

// на основе выше - простая функция для добавления скрытого элемента в $ 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 голосов
/ 24 сентября 2010

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

$elements = $this->getElements();
foreach ($elements as $elem)
    if ($elem instanceof Zend_Form_Element_Hidden)
        $elem->removeDecorator('label')->removeDecorator('HtmlTag');
4 голосов
/ 13 июля 2010

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

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

Мне не удалось заставить работать 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" />
...
2 голосов
/ 31 июля 2012

Ну, 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), красивые формы. Это также может войти в пользовательский декоратор для скрытых полей.

EDIT

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

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);
    }
}
2 голосов
/ 15 декабря 2010

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

2 голосов
/ 25 июля 2010

вот что takeme2web из http://www.phpfreaks.com/forums/index.php?topic=225848.0 предполагает

$ yourhiddenzendformelement-> setDecorators (массив ( 'ViewHelper'));

...