1

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

所以只是为了踢球和咯咯笑,我决定看看如果我使用 Firebug 更改其中一个选项的值然后提交它会发生什么。结果:它以优异的成绩通过了。不用说,这不好。

以下是 select 选项的相关代码:

$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:为清楚起见,这里是整个表单的代码

4

1 回答 1

0

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

在表单构造函数中:

// 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
}
于 2014-03-28T06:18:23.460 回答