是否可以将完整表单作为上下文传递给验证器?
我想在fieldset A中为元素X创建一个条件验证器,它检查不同字段集B中元素Y的值。
问题是isValid函数只接收它所在的字段集的上下文。这个元素X对元素Y一无所知。
所有答案都很受欢迎!
答案 0 :(得分:2)
你可以用集合和ZendCollectionInputFilter来做到这一点。
对此没有大量的文档,知道zend家伙正在对此进行整理(认为只提到它是在http://framework.zend.com/apidoc/2.2/classes/Zend.InputFilter.CollectionInputFilter.html)但是现在一个真正帮助我的资源就是:
http://www.aronkerr.com/2013/11/zf2-form-collection-validation-unique.html
非常聪明的东西,一旦你了解这些。无法真正为您提供更多帮助,因为您的问题并不是特定的,并且您目前已经实现了表单,字段集和输入过滤器的代码,但希望这会有所帮助。如果您在任何时候遇到困难而不愿意通过更具体的代码
答案 1 :(得分:0)
假设我们的字段集A和B属于Sample
形式。我们需要在此父表单中添加验证器,以便在验证任何子字段集时访问此表单的上下文:
<?php
namespace App\Form;
use Zend\Form\Form;
use Zend\InputFilter\InputFilterProviderInterface;
class Sample extends Form InputFilterProviderInterface
{
public function init()
{
$this->add([
'type' => 'App:Fieldset:A',
'name' => 'fieldsetA',
]);
$this->add([
'type' => 'App:Fieldset:B',
'name' => 'fieldsetB',
]);
$this->add([
'type' => 'submit',
'name' => 'submit',
'attributes' => [
'value' => 'Submit',
],
]);
}
public function getInputFilterSpecification()
{
return [
'fieldsetA' => [
'type' => 'InputFilter',
'X' => [
'required' => true,
'allow_empty' => true,
'continue_if_empty' => true,
'validators' => [
[
'name' => 'Callback',
'options' => [
'callback' => function ($value)
{
if ($this->data['fieldsetB']['Y'])
{
// do something
}
// do something else
},
],
],
],
],
],
];
}
}
请注意我们如何使用Sample
类型在InputFilter
内向A中的X添加验证器。接下来,我们直接访问$this->data
并遍历它以获得B中的Y.