即使发送了无效值,ZF2也会从select中验证值

时间:2014-03-20 00:41:42

标签: forms validation zend-framework2 zend-form2 zend-form-select

我的ZF2应用程序中有一个带有select元素的表单。在ZF1中,它会自动添加验证器,以检查用户是否尝试向其发布无效值。

所以只是为了踢和笑,我决定看看如果我使用Firebug改变其中一个选项的值然后提交它会发生什么。结果:它以绚丽的色彩传递。不用说,这不好。

这里是选择选项的相关代码:

$this->add(array (
    'name' => 'role',
    'type' => 'Select',
    'attributes' => array (
        'id' => 'role'
    ),
    'options' => array (
        'label' => 'Role:',
        'value_options' => $roleOptions,
        'column-size' => 'sm-6',
        'label_attributes' => array('class' => 'col-sm-2'),
    )
));

(注意:$ roleOptions作为参数传递到表单中)

以下是验证码的相关部分:

$inputFilter->add($factory->createInput(array (
    'name' => 'role',
    'filters' => array(),
    'validators' => array(
        $notEmpty
    ),
)));

(显然,$ notEmpty是NotEmpty验证器的一个实例)

这里发生了什么? ZF2是否不再添加验证器以确保它接收的值是最初属于选项列表的一部分?我是否必须手动添加验证器才能立即选择选项?

编辑:我检查了文档,并说它会自动添加一个数组验证器。它应该有效,但事实并非如此。我甚至尝试更改服务器端的值,结果相同 - 验证器没有获取无效值。

是的,我正在检查表格是否有效。

编辑#2:为清楚起见,here's the code for the form in its entirety

1 个答案:

答案 0 :(得分:0)

我通过将select选项的值设置为数字来克服此问题:

在表单构造函数中:

// Gender field
$this->add
(
    array
    (
        'type'       => 'Zend\Form\Element\Select',
        'name'       => 'gender',
        'attributes' => array
                        (
                            'id'     => 'GenderField',
                            'class'  => 'form-control',
                        ),
        'options'    => array
                        (
                            'label'         => 'Gender',
                            'empty_option'  => 'Please choose...',
                            'value_options' => array
                                               (
                                                   '1' => 'Female',
                                                   '2' => 'Male',
                                                   '3' => 'Other',
                                               ),
                        )
    )
);

然后在我的InputFilter中我将Between validator添加到我的NotEmpty验证器中,如下所示:

'validators' => array
                (
                    array(...NotEmpty Validator...),
                    array
                    (
                        'name'    => 'Between',
                        'options' => array
                                     (
                                         'min'      => 1,
                                         'max'      => 3,
                                         'messages' => array
                                                       (...)
                                     ),
                        'break_chain_on_failure' => true,
                    ),
                 )

我也在这里实际上有一个空选项,因为整个0 | NULL |''问题:

'empty_option'  => 'Please choose...',

还有一个InArray Validator对非连续单位同样有用......比如ids:

$validator = new Zend\Validator\InArray(array('haystack' => array('value1',     'value2',...'valueN')));
if ($validator->isValid('value')) {
// value found
} else {
// no value found
}