3

我正在尝试验证集合表单字段:

$builder->add(
  'autor',
  'collection',
  array(
    'type' => 'text',
    'options' => array('required' => false),
    'allow_add' => true,
    'allow_delete' => true,
    'by_reference' => false,
    'error_bubbling' => false
  )
);

按照 Cookbook 中的建议,我使用 JavaScript 将更多文本字段动态添加到集合中。我的问题是,我不知道如何验证这些字段。集合验证器让我可以通过名称验证集合的特定字段,而不是简单地验证集合的每个字段。我该如何管理?

更酷的是,如果我可以检查,是否至少有一个字段notBlank不是强制它到每个字段。

此致

4

1 回答 1

5

您可以使用在所有字段上都可用的表单字段类型中定义的“约束”选项。(http://symfony.com/doc/master/reference/forms/types/form.html#constraints)。在您的情况下,您可以像这样添加约束:

$builder->add('autor', 'collection', array(
                        'constraints' => new NotBlank()),
           ));

(在这种情况下,不要忘记包含验证组件提供的约束: use Symfony\Component\Validator\Constraints\NotBlank;...)

我没有测试,但我认为每个输入都将验证您分配给该字段的约束,并且由于您将“error_bubbling”选项设置为false,因此应将错误消息附加到无效元素。

- 编辑 -

由于您甚至使用 Symfony 的 2.0 版本,我认为这个解决方案可以解决您的问题,但是我强烈建议您更新到 2.3 版本。

您可以创建一个表单事件订阅者(http://symfony.com/doc/2.0/cookbook/form/dynamic_form_modification.html),它将监听 POST_BIND 事件。(请注意,Post Bind 事件自 2.3 版起已弃用,并将在 3.0 中删除);

在您的订阅者类中,您将根据需要验证每个提交的作者,并在出现问题时向表单添加错误。

您的 postBind 方法可能是这样的:

public function postBind(DataEvent $event)
    {
        $data = $event->getData();

        $form = $event->getForm();

        if (null === $data) {
            return;
        }

        // get the submited values for author
        // author is an array
        $author = $form['autor']->getData();

       // now iterate over the authors and validate what you want
       // if you find any error, you can add a error to the form like this:
       $form->addError(new FormError('your error message'));

       // now as the form have errors it wont pass on the isValid() method 
       // on your controller. However i think this error wont appear 
       // next to your invalid author input but as a form error, but with
       // this you can unsure that non of the fields will be blank for example.

    }

如果您对核心方法有任何疑问,可以查看 Symfony2 表单组件 API。 http://api.symfony.com/2.0/index.html

于 2013-06-05T19:07:02.770 回答