ZF2 表单验证来自选择的值,即使发送了无效值

Posted

技术标签:

【中文标题】ZF2 表单验证来自选择的值,即使发送了无效值【英文标题】:ZF2 form validating value from select even when invalid values sent 【发布时间】:2014-04-26 14:30:09 【问题描述】:

我的 ZF2 应用程序中有一个带有选择元素的表单。在 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

【问题讨论】:

另一件事:似乎在角色元素上设置输入过滤器的行为删除了内置的 InArray 验证器。不幸的是,删除它也会造成混乱——为了让 $form->bind() 方法正常工作,每个元素都必须有一个输入过滤器集。那我该怎么办? 【参考方案1】:

我通过将选择选项的值设置为数字克服了这个问题:

在表单构造函数中:

// 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 验证器添加到我的 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,它对非连续单位同样有用……比如id:

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

【讨论】:

这一切都很好,但是根据文档,Zend\Form\Element\Select 类会自动添加一个 InArray 验证器。

以上是关于ZF2 表单验证来自选择的值,即使发送了无效值的主要内容,如果未能解决你的问题,请参考以下文章

如何在响应式表单中发送 *NgFor 选项选择的值

即使输入无效,AngularJS表单也会验证

ZF2 : 来自路由的参数在提交表单后被清除

Bootstrap 4表单验证在使用无效反馈时不起作用,即使输入'is-valid'

即使输入无效,表单也会提交

如何使用ZF2中的数组表单设置使字段验证依赖于另一个字段?