问题 Zend Form: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 / DD &nbsp; 在DT内部和DD内部的隐藏元素(因此我的html将验证并且隐藏的元素不会占用页面上的空间)。有没有办法使用 Zend_Form_Element_Checkbox 无需显示隐藏的输入元素?我宁愿不搞乱我的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();
});

9314
2017-12-22 00:14


起源

我对你描述的内容有疑问。你是在添加隐藏元素,还是添加它的Zend? - kiamlaluno
kiamlaluno,Zend肯定会在每个复选框字段之前添加一个隐藏字段。如果选中该复选框,则不传递隐藏值。如果未选中,则隐藏值会通过。 - Derek Illchuk


答案:


要更改表单元素的呈现方式,可以使用 装饰,可以修改

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

有关所有默认装饰器的列表,请查看 标准装饰器;对于表单字段使用的装饰器列表,您可以看到 标准表格元素

在我看来,隐藏的表单元素是从Zend中添加的,具有精确的目的,并且删除它(如果可能的话)可能会导致一些问题。我的第一个想法是Zend使用隐藏的形式来检查值是否已经改变,或者验证是否真的是从Zend生成的(这个假设似乎不那么合理)。


5
2017-12-22 00:41



所以我猜答案是......不,我不能/不应该删除ZF在页面上放置的隐藏元素。 - Andrew
那是对的;隐藏字段用于在未选中复选框时返回值。 - kiamlaluno


主题真的很旧,但几天前我发现了类似的问题 - 我通过javascript动态创建表单 - 单击(+)向显示的表单添加一行(一个隐藏的输入,两个复选框和两个选择)。

我发现,当我将_POST发送到服务器时,不会发送直接行 - 来自隐藏的默认零,而不是选中的复选框。解决方案是将复选框设置为数组:

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

在这种情况下,不会呈现其他隐藏输入。

PS。对不起我的英语不好 ;)


5
2017-10-06 14:24



如果有人正在为ZF2寻找类似的解决方案:$ c = new Checkbox('check1'); $ C-> setUseHiddenElement(假); - Piotr Uchman


安德鲁,这里是如何真正隐藏你隐藏的表单元素:

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

现在,您不必乱用jQuery代码来尝试缩小它们。而且,您也不必担心隐藏的复选框字段。


1
2017-12-22 00:44



嗯......这并不完全隐藏隐藏的元素。这只是摆脱DT和标签标签。如果有样式应用于DD元素,DD仍会占用页面上的空间。 - Andrew
您的隐藏输入字段必须包含在某个块级元素中,以使XHTML有效。如果那不是问题,删除数组('HtmlTag',数组('tag'=>'dd')),对吗? - Derek Illchuk


我自己只是遇到了隐藏元素的复选框。我没有这个帖子的解决方案,但想加入我对隐藏字段的想法。如果用户没有选中该框,则仍然会传递值0。否则,不会发布复选框。


1
2017-08-25 19:22





线程很旧但没有答案是正确的......

我有同样的问题,但我已经弄明白了,所以这是正确的答案:

如果您不喜欢在取消选中时发布的复选框值,并且仅在选中时发送了一些值 - 只需使用此代码:

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

选中的值为'some_value',但是当取消选中复选框时,该值为null,因此它不会验证,因为设置了'required'。它现在适用于我,并且不需要使用“复杂的”jquery脚本来删除隐藏的字段等。


1
2018-02-10 09:29





您可以向复选框表单元素添加属性disableHidden,以防止它在呈现时添加隐藏字段。

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

1
2018-04-01 11:24



这也适用于zf1。 - Bertie92