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

时间:2017-09-14 10:29:49

标签: php zend-framework2 zend-framework3

我有一张表格。表单有一个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],
                ],
            ],
        ],
    }
}

我想根据表单中是否选中textField1复选框来验证textField2selectedInForm

我怎么能这样做?

我虽然使用了Callback selectedInForm复选框验证器,但是这样:

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

但问题在于,由于某种原因,textField1值的发布值尚未附加到输入中。 textField2也是如此。

1 个答案:

答案 0 :(得分:2)

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

另一个是编写自定义验证器,为了使其可重复使用,我推荐这个解决方案。

<?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)中的可配置条件字段定义选项,使其更具可重用性。