如何在表单中的约束中添加错误?

时间:2017-02-09 13:18:08

标签: forms symfony

在Ubuntu 16.04上使用Symfony 3.2

我创建了一个包含多个字段的FormType.php。其中一个是电话号码,所以我添加了一个约束,只能接受数字。这是电话表格的代码

->add('authorPhone', NumberType::class, array('label' => 'Numéro de téléphone',
                'required' => true,
                'attr' => array(
                    'class' => 'validate',
                    'id' => 'icon_telephone'
                ),
                'constraints' => array(new Regex("#^0[1-9]([-. ]?[0-9]{2}){4}$#"))
            ))

之后,在我的控制器中,我添加了一个错误,告诉他们只需填写数字

public function indexAction()
    {
        $form = $this->createForm(FormType::class);
        $form->get('authorPhone')->addError(new FormError('error message'));

        return $this->render('app/main/index.html.twig', array(
            'form' => $form->createView()
        ));
    }

但是当我查看我的页面时,错误消息实际上是在没有填充字段的情况下显示的。当然,我不希望这样。

image

(你可以在“Numérodetéléphone”下看到,这意味着电话号码)

我只想在我的电话号码字段中输入数字,如果有字母,则应显示错误或说某些内容不正确。

1 个答案:

答案 0 :(得分:1)

在Symfony中标准化的方法是定义一个带有约束和错误消息的实体,然后创建实体绑定表单,它将自动处理基于实体约束的验证。

但是,如果由于某种原因,你需要独立的形式,那么就可以做到。 addError()方法用于在表单字段中添加错误“state”(例如,用于自己的验证),并且您在创建表单后立即添加错误。这就是错误不断出现的原因。

<强>更新:

将错误消息分配给表单字段的正确方法是invalid_message属性(当输入的值与字段类型不对应时显示)。但是当存在用于验证的约束时,则必须根据约束验证器设置错误消息 - 因此,在您的情况下,通过具有patternmessage键的关联数组来设置。

接下来需要更正的是TextType而不是NumberType,因为当使用NumberType时,它不会允许输入破折号并且还会自动修剪数字中的前导零 - 这对电话号码来说太糟糕了: - )

->add('authorPhone', TextType::class, array(
    'label' => 'Numéro de téléphone',
    'required' => true,
    'attr' => array(
        'class' => 'validate',
        'id' => 'icon_telephone'
    ),
    'constraints' => array(new Regex(
        array(
            'pattern' => '#^0[1-9]([-. ]?[0-9]{2}){4}$#',
            'message' => 'Phone error message'
        )
    )),
))

最后要审查的是 - 在控制器中(在表单声明之后)必须是表单提交处理例程:

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
....

您可以在Symfony的表单提交处理中了解更多信息:http://symfony.com/doc/current/forms.html#handling-form-submissions

表单呈现非常简单。用于呈现整个表单的Twig语法:

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

或者,如果您想逐个选择性地渲染字段:

{{ form_start(form) }}
{{ form_row(form.authorPhone) }}
{{ form_row(form.submit) }}
{{ form_end(form) }}

它将呈现包含标签和错误的完整字段