向Symfony 2表单元素添加错误


83

我在控制器中检查了一些验证。而且我想在失败时向表单的特定元素添加错误。我的表格:

use Symfony\Component\Form\FormError;

// ...

$config = new Config();
$form = $this->createFormBuilder($config)
        ->add('googleMapKey', 'text', array('label' => 'Google Map key'))
        ->add('locationRadius', 'text', array('label' => 'Location radius (km)'))
        ->getForm();

// ...

$form->addError(new FormError('error message'));

addError()方法将错误添加到表单,而不是元素。如何向locationRadius元素添加错误?

Answers:


178

你可以做

$form->get('locationRadius')->addError(new FormError('error message'));

由于形式元素也是FormInterface类型。


@ m2mdas,很好的答案!我们将如何翻译呢?因为一旦创建FormError实例,它就不会翻译它,对吗?我试过了,但它没有翻译,我认为这很有意义。您将如何转换FormError实例?
米克(Mick)2014年

2
您好,@ Patt,对不起您的回复。在将错误消息添加到表单之前,验证器组件负责翻译表单约束违规消息。要添加自定义错误,您已按照与其他字符串相同的方式来翻译消息,例如,$this->get('translator')->trans('error message')
Mun Mun Das

1
@ m2mdas但是如何在您的视图中打印此错误?我尝试了此操作,但它没有进入form_errors(form)我的树枝中。
Nat Naydenova

1
@NatNaydenova我知道已经有一段时间了,但是尝试form_erros(form.my_field_name)
TMichel

3
请注意:要获取使用form_errors(form)打印的错误,请将您的错误添加到表单本身,例如$ form-> addError(new FormError('error msg');
beterthanlife

8

好的,我还有另一种方式。它更复杂,仅适用于特定情况。

我的情况:

我有一个表单,提交后将数据发布到API服务器。还有我从API服务器得到的错误。

API服务器错误格式为:

array(
    'message' => 'Invalid postal code',
    'propertyPath' => 'businessAdress.postalCode',
)

我的目标是获得灵活的解决方案。让我们为相应字段设置错误。

$vm = new ViolationMapper();

// Format should be: children[businessAddress].children[postalCode]
$error['propertyPath'] = 'children['. str_replace('.', '].children[', $error['propertyPath']) .']';

// Convert error to violation.
$constraint = new ConstraintViolation(
    $error['message'], $error['message'], array(), '', $error['propertyPath'], null
);

$vm->mapViolation($constraint, $form);

而已!

注意! addError()方法绕过error_mapping选项。


我的表格(公司表格中嵌入的地址表格):

公司

<?php

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

class Company extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('companyName', 'text',
                array(
                    'label' => 'Company name',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('businessAddress', new Address(),
                array(
                    'label' => 'Business address',
                )
            )
            ->add('update', 'submit', array(
                    'label' => 'Update',
                )
            )
        ;
    }

    public function getName()
    {
        return null;
    }
}

地址

<?php

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

class Address extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ...
            ->add('postalCode', 'text',
                array(
                    'label' => 'Postal code',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('town', 'text',
                array(
                    'label' => 'Town',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('country', 'choice',
                array(
                    'label' => 'Country',
                    'choices' => $this->getCountries(),
                    'empty_value' => 'Select...',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
        ;
    }

    public function getName()
    {
        return null;
    }
}

您将这些代码放在哪里?$ vm =新的ViolationMapper();
vidy videni

@vidyvideni,将处理提交表单的控制器操作。您也可以调整这段代码,并将其移至单独的方法中
Jekis 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.