Ответ 1
Для скрытого поля вам нужен только один декоратор - ViewHelper:
$field = new Zend_Form_Element_Hidden('id');
$field->setDecorators(array('ViewHelper'));
Это будет отображать только поле ввода без оболочки Dt-Dd и метки.
Я пытаюсь удалить декораторы по умолчанию в скрытом элементе формы. По умолчанию скрытый элемент отображается следующим образом:
<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">
Как я могу это достичь?
Для скрытого поля вам нужен только один декоратор - ViewHelper:
$field = new Zend_Form_Element_Hidden('id');
$field->setDecorators(array('ViewHelper'));
Это будет отображать только поле ввода без оболочки Dt-Dd и метки.
Из Документация Zend Element Decorators:
Декораторы по умолчанию не нужны Загруженный
По умолчанию декораторы по умолчанию загружается при инициализации объекта. Вы можете отключить это, передав опция disableLoadDefaultDecorators конструктору:
$element = new Zend_Form_Element('foo', array('disableLoadDefaultDecorators' => true) );
Я использую этот
$element->removeDecorator('DtDdWrapper');
чтобы избавиться от тегов dt dd вокруг определенных элементов
//на основе выше - простая функция для добавления скрытого элемента в $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);
}
Когда у вас много скрытых вводов, лучшим ответом является следующее:
$elements = $this->getElements();
foreach ($elements as $elem)
if ($elem instanceof Zend_Form_Element_Hidden)
$elem->removeDecorator('label')->removeDecorator('HtmlTag');
Как упоминалось в других сообщениях setDisableLoadDefaultDecorators(true)
не работает, если они уже загружены... НО clearDecorators()
does!
Я не мог заставить 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" />
...
вот что такое takeme2web от http://www.phpfreaks.com/forums/index.php?topic=225848.0 предполагает
$yourhiddenzendformelement- > setDecorators (массив ( 'ViewHelper'));
Использование только одного декоратора "ViewHelper" приведет к созданию недопустимой разметки, если вы все еще используете обертку <dl>
. Другой подход описан в ZF-2718. Это добавляет скрытые поля к подформе, которая завернута в <dd>
.
Ну, в 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);
}
}
Используйте это:
foreach ($this->getElements() as $element) {
$decorator = $element->getDecorator('label');
if (!$decorator) {
continue;
}
$decorator->removeOption('tag');
}