ZF2表单元素集合验证

时间:2014-01-05 14:21:05

标签: php validation zend-framework2 zend-form2

所以我有一个“简单”的形式

class SiteAddForm extends Form
{
    public function __construct()
    {
        parent::__construct('add_site_form');

        $site = new SiteFieldSet();
        $this->add($site);
    }

    public function getTemplate()
    {
        return 'site_add.phtml';
    }
}

它自己的表格什么也没做。它添加了一个field_set并返回一个模板名称。

SiteFieldSet看起来像:

class SiteFieldSet
    extends FieldSet
    implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct('site');

        $name = new Text('name');
        $this->add($name);

        $domains = new Collection('domains');
        $domains->setTargetElement(new DomainFieldSet())
            ->setShouldCreateTemplate(true);
        $this->add($domains);
    }

    public function getTemplate()
    {
        return 'site.phtml';
    }

    /**
     * Should return an array specification compatible with
     * {@link Zend\InputFilter\Factory::createInputFilter()}.
     *
     * @return array
     */
    public function getInputFilterSpecification()
    {
        return [
            'name' => [
                'required' => true,
                'validators' => [
                    new StringLength([
                        'min' => 200,
                    ])
                ]
            ],
            'domains' => [
                'required' => true,
            ],
        ];
    }
}

它向fieldset添加了一个text和collection元素。字段集实现InputFilterProviderInterface以验证投入其中的数据。

名称必须至少为200个字符(用于测试),并且需要收集。

但现在问题来了。使用抛出到集合中的字段集,代码:

class DomainFieldSet
    extends FieldSet
    implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct('domain');

        $host = new Url('host');
        $this->add($host);

        $language = new Select('language', [
            'value_options' => [
                'nl_NL' => 'NL',
            ],
        ]);
        $this->add($language);

        $theme = new Select('theme', [
            'value_options' => [
                'yeti' => 'Yeti',
            ]
        ]);
        $this->add($theme);
    }

    public function getTemplate()
    {
        return 'domain.phtml';
    }

    /**
     * Should return an array specification compatible with
     * {@link Zend\InputFilter\Factory::createInputFilter()}.
     *
     * @return array
     */
    public function getInputFilterSpecification()
    {
        return [
            'host' => [
                'required' => true,
                'validators' => [
                    new StringLength([
                        'min' => 200,
                    ])
                ]
            ],
            'language' => [
                'required' => true,
            ],
            'theme' => [
                'required' => true,
            ],
        ];
    }
}

再一点没什么特别的。现在有三个元素定义主机,主题和&语言。字段集再次实现InputFilterProviderInterface。所以在类中必须有一个getInputFilterSpecification。

当我填写表格时 site[name] =“测试” site[domains][0][host] ='测试' site[domains][0][theme] ='雪人' site[domains][0][language] ='nl_NL'

它给网站[name]一个错误,说它必须至少200个字符,所以验证“有效” 但它也应该在site[domains][0][host]上给出一个错误,它需要至少200个字符(代码是复制粘贴的,并且使用是正确的。)

那么为什么不进行验证,以及如何解决问题,以便正确验证集合中的元素/字段集

1 个答案:

答案 0 :(得分:2)

尝试以__construct方法

的形式使用setValidationGroup

像:

  public function __construct()
  {
    $this->add(array(
            'type' => 'Your\Namespace\SiteFieldSet',
            'options' => array(
                    'use_as_base_fieldset' => true,
            ),
    ));


    $this->setValidationGroup(array(
            'site' => array(
                'domain' => array(
                    'host',
                    'language',
                    'theme',
                ),
            ),
    ));

    }

或者这可能也有效......

  $this->setValidationGroup(FormInterface::VALIDATE_ALL);