Zend表单:复选框元素显示为隐藏字段?

11
我想在我的表单中添加一个简单的复选框:
$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;标签的标签以及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();
});

我对你所描述的有疑问。是你添加了隐藏元素,还是Zend添加了它? - apaderno
kiamlaluno,Zend 绝对会在每个复选框字段之前添加一个隐藏字段。如果复选框被选中,则不会传递隐藏值。如果未选中,则隐藏值将通过。 - Derek Illchuk
6个回答

5

要改变表单元素的呈现方式,您可以使用装饰器,这些装饰器可以通过修改来实现。

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

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

我觉得Zend添加隐藏表单元素是有一个明确的目的,并且删除它(即使可能)可能会导致一些问题。我的第一个想法是Zend使用该隐藏表单来检查值是否已更改,或者验证表单是否真正由Zend生成(这个假设似乎不太可信)。


所以我猜答案是...不,我不能/不应该删除ZF放在页面上的隐藏元素。 - Andrew
1
这是正确的;当复选框未被选中时,隐藏字段用于返回一个值。 - apaderno

5

这个主题很老,但是我几天前遇到了类似的问题——我通过JavaScript动态创建表单——点击(+)会向显示的表单添加一行(一个隐藏输入、两个复选框和两个下拉选择框)。

我发现,当我将_POST发送到服务器时,最后一行没有被正确发送——隐藏的默认零被发送,而不是选中的复选框。解决方法是将复选框设置为数组:

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

在这种情况下,不会呈现额外的隐藏输入。
PS. 对不起我的英语;)

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

1
你可以给复选框表单元素添加一个名为 disableHidden 的属性,这将在渲染时防止它添加隐藏字段。
$chk = new Zend_Form_Element_Checkbox('test_checkbox');
$chk->setAttrib('disableHidden', true);

1

这个帖子比较老,但没有一个回答是正确的...

我也遇到了同样的问题,但我已经解决了,所以这里是正确的答案:

如果你不希望当复选框未被选中时它的值被提交,而只在选中时发送一些值- 只需使用此代码:

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

当复选框未被选中时,'some_value' 的值为 null,因此无法通过验证,因为 'required' 已经设置。目前这对我来说是有效的,没有必要使用“复杂”的 jQuery 脚本来删除隐藏字段等。


1

Andrew,这是如何真正隐藏你的隐藏表单元素:

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

现在,您无需纠结于 jQuery 代码尝试将它们缩小。而且,您也不必担心隐藏复选框字段了。

嗯...那并不能真正隐藏一个隐藏元素。那只是去掉了DT和label标签。如果对DD元素应用了样式,它仍然会在页面上占据空间。 - Andrew
您的隐藏输入字段必须包装在某个块级元素中,以符合XHTML标准。如果这不是问题,请移除array('HtmlTag', array('tag' => 'dd')),对吗? - Derek Illchuk

1

我刚刚发现了复选框的隐藏元素。我没有关于提交的解决方案,但是想要加入我的想法关于隐藏字段。这样,如果用户不勾选该框,则仍会传递值0。否则,该复选框将不会被提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接