Zend Form:Checkbox元素显示为隐藏字段?

And*_*rew 11 checkbox zend-framework zend-form zend-form-element

我想在表单中添加一个简单的复选框:

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

但是,这就是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>
Run Code Online (Sandbox Code Playgroud)

这个问题是我使用jQuery来隐藏DT &nbsp;内部标签和DD内部隐藏元素的所有DT/DD (因此我的html将验证并且隐藏的元素不会占用空间这页纸).有没有办法使用a 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();
});
Run Code Online (Sandbox Code Playgroud)

kia*_*uno 5

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

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

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

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


小智 5

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

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

$c = new Zend_Form_Element_Checkbox( 'check1' );
$c->setIsArray( true );
Run Code Online (Sandbox Code Playgroud)

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

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

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