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

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

$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/DD, которые имеют метку &nbsp; внутри DT и скрытый элемент внутри DD (поэтому мой html будет проверять, а скрытые элементы - не занимайте места на странице). Есть ли способ использовать Zend_Form_Element_Checkbox без отображения скрытого элемента ввода? Я бы предпочел не связываться с моим кодом jQuery, чтобы добавить дополнительные предостережения, но я буду, если мне нужно.

Решение:

По-видимому, я не могу/не должен удалять скрытый элемент перед элементом флажка. Итак, вот мой код 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();
});

Ответ 1

Чтобы изменить способ визуализации элемента формы, вы можете использовать decorators, который может быть изменен с помощью

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Поток старый, но ни один из них не является корневым...

У меня была одна и та же проблема, но я понял это, поэтому вот ПРАВИЛЬНЫЙ ответ:

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

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

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

Ответ 6

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

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