Add error to Symfony 2 form element
You can do
$form->get('locationRadius')->addError(new FormError('error message'));
As form elements are also of FormInterface
type.
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
<?phpnamespace 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
<?phpnamespace 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; }}