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&nbsp;内部具有标签的 DT/DD 和在 DD 内部具有隐藏元素的所有 DT/DD(因此我的 html 将验证并且隐藏元素不会占用空间这页纸)。有没有办法使用 aZend_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();
});
4

6 回答 6

5

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

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

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

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

于 2009-12-22T00:41:37.223 回答
5

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

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

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

在这种情况下,不会呈现额外的隐藏输入。

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

于 2010-10-06T14:24:10.270 回答
1

安德鲁,这是真正隐藏隐藏表单元素的方法:

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

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

于 2009-12-22T00:44:49.137 回答
1

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

于 2011-08-25T19:22:04.030 回答
1

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

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

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

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

选中的值为'some_value',但当未选中复选框时,该值为空,因此它不会验证,因为设置了'required'。它现在对我有用,不需要使用“复杂”的 jquery 脚本来删除隐藏字段等。

于 2012-02-10T09:29:08.780 回答
1

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

$chk = new Zend_Form_Element_Checkbox('test_checkbox');
$chk->setAttrib('disableHidden', true);
于 2015-04-01T11:24:56.140 回答