4

我有一个包含 2 个字段的搜索表单,未链接到实体。假设它是这样构建的:

$builder
    ->add('orderNumber', 'text', array('required' => false))
    ->add('customerNumber', 'text', array('required' => false))
    ;

我希望用户有义务至少填写两个字段中的一个。

使用 Symfony 2.5 实现这一目标的正确方法是什么?

编辑:可以在不添加数据类的情况下完成吗?

4

2 回答 2

8

感谢@redbirdo 的回答,我得到了以下代码:

$builder
    ->add('orderNumber', 'text', array(
        'required' => false,
        'constraints' => new Callback(array($this, 'validate'))
    ))
    ->add('customerNumber', 'text', array('required' => false))
;

验证方法是:

public function validate($value, ExecutionContextInterface $context)
{
    /** @var \Symfony\Component\Form\Form $form */
    $form = $context->getRoot();
    $data = $form->getData();

    if (null === $data['orderNumber'] && null === $data['customerNumber']) {
        $context->buildViolation('Please enter at least an order number or a customer number')
            ->addViolation();
    }
}
于 2014-10-15T07:44:48.463 回答
3

当您使用带有数据数组而不是底层数据类的表单时,您需要自己设置验证约束,并将它们附加到各个字段。请参阅 Symfony 文档:

表单->使用没有类的表单-> 添加验证

例如

$builder
   ->add('orderNumber', 'text', array(
       'required' => false
       'constraints' => new NotBlank()
   ))
   ->add('customerNumber', 'text', array(
       'required' => false
       'constraints' => new NotBlank()
   ))
;

注意 - 根据文档示例,“约束”可以作为单个约束或一组约束提供。

于 2014-10-14T16:05:04.413 回答