zf2/zf3 如何验证集合字段集中的相关输入?

zf2/zf3 how to validate dependent inputs in collection's fieldset?

我有一个表格。该表单有一个 Collection ,其目标元素是一个带有复选框和几个文本字段的字段集。作为目标元素附加到 Collection 的字段集如下所示(经过简化以避免代码过多):

class AFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(HydratorInterface $hydrator) 
    {
        parent::__construct();

        $this->setHydrator($hydrator)
            ->setObject(new SomeObject());

        $this->add([
            'type' => Hidden::class,
            'name' => 'id',
        ]);

        $this->add([
            'type' => Checkbox::class,
            'name' => 'selectedInForm',
        ]);

        $this->add([
            'type' => Text::class,
            'name' => 'textField1',
        ]);

        $this->add([
            'type' => Text::class,
            'name' => 'textField2',
        ]);
    }
    public function getInputFilterSpecification()
    {
        return [
            'selectedInForm' => [
                'required' => false,
                'continue_if_empty' => true,
                'validators' => [
                    ['name' => Callback::class // + options for the validator],
                ],
            ],
            'id' => [
                'requred' => false,
                'continue_if_empty' => true,
            ],
            'textField1' => [
                'required' => false,
                'continue_if_empty' => true,
                'validators' => [
                    ['name' => SomeValidator::class],
                ],
            ],
            'textField2' => [
                'required' => true,
                'validators' => [
                    ['name' => SomeValidator::class],
                ],
            ],
        ],
    }
}

我想根据是否在表单中选中 selectedInForm 复选框来验证 textField1textField2

我该怎么做?

我虽然为 selectedInForm 复选框使用 Callback 验证器,如下所示:

'callback' => function($value) {
    if ($value) {
        $this->get('textField1')->isValid();
        // or $this->get('textField1')->getValue() and do some validation with it
    }
}

但它的问题是,由于某种原因,textField1 值的发布值尚未附加到输入。 textField2.

也是如此

有两种选择。一个是您开始的地方,使用回调验证器。

另一种是编写自定义验证器,并使其可重用我推荐此解决方案。

<?php

use Zend\Validator\NotEmpty;

class IfSelectedInFormThanNotEmpty extends NotEmpty
{
    public function isValid($value, array $context = null): bool
    {
        if (! empty($context['selectedInForm']) && $context['selectedInForm']) {
            return parent::isValid($value);
        }
        return true;
    }
}

然后你可以像其他验证器一样使用它:

'textField2' => [
    'required' => true,
    'validators' => [
        ['name' => IfSelectedInFormThanNotEmpty::class],
    ],
],

这可能不是您的确切案例,但我希望它有助于理解这个想法。

您可以在 public function __construct($options = null).

中使用可配置的条件字段定义选项,使其更易于重用