5

我已经阅读了许多 Zend Framework 缺少默认复选框验证的解决方法。

我最近开始使用 ZF2 并且文档有点缺乏。

有人可以演示如何使用 Zend 表单和验证机制验证复选框以确保它被勾选吗?我正在为我的表单使用数组配置(使用 ZF 网站上的示例应用程序中的默认设置)。

4

5 回答 5

21

试试这个

表单元素:

$this->add(array(
            'type' => 'Zend\Form\Element\Checkbox',
            'name' => 'agreeterms',
            'options' => array(
                'label' => 'I agree to all terms and conditions',
                'use_hidden_element' => true,
                'checked_value' => 1,
                'unchecked_value' => 'no'
            ),
        ));

在过滤器中,添加数字验证

use Zend\Validator\Digits; // at top

$inputFilter->add($factory->createInput(array(
                        'name' => 'agreeterms',
                        'validators' => array(
                            array(
                                'name' => 'Digits',
                                'break_chain_on_failure' => true,
                                'options' => array(
                                    'messages' => array(
                                        Digits::NOT_DIGITS => 'You must agree to the terms of use.',
                                    ),
                                ),
                            ),
                        ),
                    )));
于 2013-02-14T11:58:32.747 回答
9

您也可以从选项中删除隐藏的表单字段(从纯粹的 HTML 角度来看,我觉得有点奇怪),而不是像这样将其值设置为“否”:

$this->add(array(
        'type' => 'Zend\Form\Element\Checkbox',
        'name' => 'agreeterms',
        'options' => array(
            'label' => 'I agree to all terms and conditions',
            'use_hidden_element' => false
        ),
    ));
于 2013-05-09T02:21:34.867 回答
3

我遇到了同样的问题,做了一些类似于Optimus Crew 的建议,但使用了 Identical Validator。

如果您未设置checked_value复选框的选项并将其保留为默认值,则在发布数据时应传入“1”。如果需要,您可以设置它,但请确保您在token验证器的选项中检查相同的值。

$this->filter->add(array(
        'name' => 'agreeterms',
        'validators' => array(
            array(
                'name' => 'Identical',
                'options' => array(
                    'token' => '1',
                    'messages' => array(
                        Identical::NOT_SAME => 'You must agree to the terms of use.',
                    ),
                ),
            ),
        ),
    ));

'use_hidden_element' => false如果您使用表单复选框的选项,这将不起作用。如果你这样做,你最终会显示默认的 NotEmpty 消息Value is required and can't be empty

于 2013-06-19T14:44:56.003 回答
3

这与问题没有直接关系,但如果您希望将用户的响应存储在数据库中,这里有一些 zf2 复选框提示......

  1. 一定要使用“1”和“0”字符串,不要费心去尝试让其他任何东西工作。另外,您可以将这些值直接用作位/布尔列的 SQL 值。
  2. 务必使用隐藏元素。如果您不这样做,表格将不会发布任何价值,也没有人想要这样。
  3. 不要尝试将值过滤为布尔值。出于某种原因,当布尔值为 false 时,尽管有'required' => false;

表单中的示例元素创建:

$this->add([
    'name' => 'cellPhoneHasWhatsApp',
    'type' => 'Checkbox',
    'options' => [
        'label' => 'Cell phone has WhatsApp?',
        'checked_value' => '1',
        'unchecked_value' => '0',
        'use_hidden_element' => true,
    ],
]);

示例输入过滤器规范:

[
    'cellPhoneHasWhatsApp' => [
         'required' => false,
     ],
]

如果您想使用引导程序隐藏其他一些表单字段,这是一个示例:

$this->add([
    'name' => 'automaticTitle',
    'type' => 'Checkbox',
    'options' => [
        'label' => 'Automatically generate title',
        'checked_value' => '1',
        'unchecked_value' => '0',
        'use_hidden_element' => true,
    ],
    'attributes' => [
        'data-toggle'     => 'collapse',
        'data-target'     => '#titleGroup',
        'aria-expanded'   => 'false',
        'aria-controls'   => 'titleGroup'
    ],
]);

我是 ZF2 的粉丝,但归根结底,您只需要找出哪些适用于它,哪些不适用(尤其是 Forms)。希望这对某人有帮助!

于 2016-10-05T23:41:12.180 回答
1

非常老的问题,但认为它可能仍然被像我这样仍在使用 Zend Framework 2 的人使用/引用。(在我的情况下使用ZF 2.5.3 )

杰夫上面的回答帮助我在这里为我正在使用的东西获得正确的配置。在我的用例中,我需要复选框,但将其留空将被视为“假”值,这是允许的。他的回答帮助我接受了false价值观,尤其是他的:

不要尝试将值过滤为布尔值。出于某种原因,当布尔值结果为假时

用例是启用/禁用某些实体,例如国家或语言,以便它们不会出现在getEnabled[...]()存储库功能中。

表单元素

$this->add([
    'name' => 'enabled',
    'required' => true,
    'type' => Checkbox::class,
    'options' => [
        'label' => _('Enabled'),
        'label_attributes' => [
            'class' => '',
        ],
        'use_hidden_element' => true,
        'checked_value' => 1,
        'unchecked_value' => 0,
    ],
    'attributes' => [
        'id' => '',
        'class' => '',
    ],
]);

输入过滤器

$this->add([
    'name' => 'enabled',
    'required' => true,
    'validators' => [
        [
            'name' => InArray::class,
            'options' => [
                'haystack' => [true, false],
            ],
        ],
    ],
])
于 2017-07-10T12:38:03.600 回答