Add error to Symfony 2 form element

前端 未结 2 938
北荒
北荒 2020-12-07 17:56

I check some validation in my controller. And I want to add error to specific element of my form on failure. My form:

use Symfony\\Component\\Form\\FormError         


        
相关标签:
2条回答
  • 2020-12-07 18:08

    OK guys, I have another way. It is more complex and only for specific cases.

    My case:

    I have a form and after submit I post data to the API server. And errors I got from the API server as well.

    API server error format is:

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

    My goal is to get flexible solution. Lets set the error for the corresponding field.

    $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);
    

    That's it!

    NOTE! addError() method bypasses error_mapping option.


    My form (Address form embedded in the Company form):

    Company

    <?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;
        }
    }
    

    Address

    <?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;
        }
    }
    
    0 讨论(0)
  • 2020-12-07 18:29

    You can do

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

    As form elements are also of FormInterface type.

    0 讨论(0)
提交回复
热议问题