Форма Zend: элемент Checkbox отображается как скрытое поле?

Я хотел бы добавить простой флажок в мою форму:

$element = new Zend_Form_Element_Checkbox('dont');
$element->setDescription('Check this box if you don't want to do this action.');
$form->addElement($element);

однако, вот как выглядит html:

<dt id="dont-label">&nbsp;</dt>
<dd id="dont-element">
    <input type="hidden" name="dontAttach" value="0">
    <input type="checkbox" name="dontAttach" id="dontAttach" value="1">
    <p class="description">Don't attach a bulletin. I only want to send an email.</p>
</dd>

проблема в том, что я использую jQuery, чтобы скрыть все DT/DDs, которые имеют метку &nbsp; внутри DT и скрытый элемент внутри DD (поэтому мой html будет проверять, и скрытые элементы не занимают места на странице). Есть ли способ использовать Zend_Form_Element_Checkbox без того, чтобы показать скрытый элемент input? Я бы предпочел не связываться с моим кодом jQuery, чтобы добавить больше предостережений, но я буду, если придется.

устранение:

по-видимому, я не могу/не должен удалять скрытый элемент перед элементом checkbox. Так вот мой код jQuery, чтобы скрыть все скрытые элементы будут отображаться на странице:

//fix zf hidden element from displaying
$('input[type=hidden]').filter(function() {
    var noLabel = $(this).closest('dd').prev('dt').html() === '&nbsp;';
    var onlyChild = $(this).is(':only-child');
    if (noLabel && onlyChild) {
        return true;
    }
    return false;
}).each(function() {
    $(this).closest('dd').hide()
           .prev('dt').hide();
});

6 ответов


чтобы изменить способ отображения элемента формы, вы можете использовать декораторы, который может быть изменен с

// Overwrite existing decorators with this single one:
$element->setDecorators(array('Composite'));

для списка всех декораторов по умолчанию вы смотрите на стандартные декораторы; для списка декораторов, используемых полями формы, вы можете увидеть стандартные элементы вида.

Мне кажется, что скрытые элементы формы добавляются из Zend с точной целью и удаляют ее (если это вообще возможно) могут возникнуть проблемы. Моя первая мысль заключается в том, что Zend использует эту скрытую форму, чтобы проверить, было ли изменено значение, или проверить, действительно ли from был сгенерирован из Zend (эта гипотеза кажется менее правдоподобной).


тема действительно старая, но я нашел аналогичную проблему несколько дней назад - я создаю форму динамически, с помощью javascript - щелчок (+) добавляет строку (один скрытый вход, два флажка и два выбора) в отображаемую форму.

когда я отправляю _POST на сервер, я обнаружил, что строка las не отправляется corectly - вместо выбранных флажков отправляются нули по умолчанию из hidden. Решение состоит в том, чтобы установить флажки как массивы:

$c = new Zend_Form_Element_Checkbox( 'check1' );
$c->setIsArray( true );

в этом случае дополнительный скрытый вход не является оказанный.

PS. Извините за мой английский ;)


Андрей, вот как действительно скрыть скрытые элементы формы:

$element1 = $form->createElement('hidden', 'element1');
$element1
  ->setDecorators(array(
    'ViewHelper',
    array('HtmlTag', array('tag' => 'dd'))
  ));

теперь вам не нужно возиться с кодом jQuery, чтобы попытаться уменьшить их. И вам не нужно беспокоиться о скрытых полях флажков.


Я просто натыкаюсь на скрытый элемент для флажков сам. У меня нет решения для поста, но я хочу добавить в свои мысли о скрытом поле. Это так, если пользователь не устанавливает флажок, значение 0 все еще передается. В противном случае флажок не будет установлен.


поток старый, но ни один ответ не является corrent...

У меня была такая же проблема, но я понял это, поэтому вот правильный ответ:

Если вам не нравится ваше значение флажка, когда оно снято и отправлено некоторое значение только тогда, когда оно проверено - просто используйте этот код:

$chk = new Zend_Form_Element_Checkbox('test_checkbox');
$chk->setRequired();
$chk->setUncheckedValue(null);
$chk->setCheckedValue(1);
...

проверенное значение - "some_value", но когда флажок снят, значение равно null, поэтому оно не проверяется, потому что установлено значение "required". Это работает для меня сейчас и есть нет необходимости использовать "сложные" скрипты jquery для удаления скрытых полей и т. д.


вы можете добавить атрибут disableHidden в элемент формы checkbox, который предотвращает добавление скрытого поля во время рендеринга.

$chk = new Zend_Form_Element_Checkbox('test_checkbox');
$chk->setAttrib('disableHidden', true);