使用Fieldset或Collection时的ZF2 Validator Context

时间:2014-02-26 19:41:41

标签: zend-framework2 zend-form zend-validate

是否可以将完整表单作为上下文传递给验证器?

我想在fieldset A中为元素X创建一个条件验证器,它检查不同字段集B中元素Y的值。

问题是isValid函数只接收它所在的字段集的上下文。这个元素X对元素Y一无所知。

所有答案都很受欢迎!

2 个答案:

答案 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.