我有一个ZF2表单,我必须禁用本机验证器,具体原因。
然后,当以编程方式向表单添加元素时,我还添加了验证器。
其中一个元素是Multiselect数组。
$form->add( array(
'type' => 'Zend\Form\Element\Select',
'options' => array(
(
'label' => 'few items',
'value_options' => Array
(
'one' => 'one',
'two' => 'two',
'three' => 'three',
'four' => 'four',
)
),
'attributes' => array
(
'multiple' => 'multiple',
'value' => array('two','three'),
'required' => 1,
'id' => 'few_items'
),
'name' => 'few_items'
));
另外,我要添加一个InArray验证器:
if($f instanceof \Zend\Form\Element\Select){
$inputFilter->add($factory->createInput(array(
'name' => $f->getName(),
'required' => $f->getAttribute('required') == 1,
'validators' => array(
array(
'name' => 'InArray',
'options' => array(
'haystack' => $f->getValueOptions(),
'messages' => array(
InArray::NOT_IN_ARRAY => 'Please select an option',
),
),
),
),
)));
}
问题是验证器总是失败,因为在POST多选字段中会返回一个数组,并且实际上在InArray验证器内部查看,它使用了不适合的in_array(...)PHP函数 - array_intersect会做诀窍,但在编写我自己的验证器之前,我确实感觉这个轮子已经发明了!
环顾四周后,我发现有一个错误引发了这种效果(http://framework.zend.com/issues/browse/ZF2-413),解决方案是引入爆炸验证器,但我不知道如何将它添加到我的输入过滤器中
感谢您的建议。
答案 0 :(得分:8)
实际上,在错误修正链接之后,我想出了如何进行验证。爆炸验证器将分解值并将验证器应用于每个部分:
if($f instanceof \Zend\Form\Element\Select){
$inputFilter->add($factory->createInput(array(
'name' => $f->getName(),
'required' => $f->getAttribute('required') == 1,
'validators' => array(
array(
'name' => 'Explode',
'options' => array(
'validator' => new InArray(array(
'haystack' => $f->getValueOptions(),
'valueDelimeter' => null,
'messages' => array(
InArray::NOT_IN_ARRAY => 'Please select an option',
),
))
)
),
),
)));
}
在这里留下这个问题,因为我自己没有找到任何其他答案,希望这将有助于将来的人。