yml validator type form constraint component array php validation symfony symfony-forms

php - validator - Agregar error al elemento de formulario Symfony 2



symfony form validation yml (2)

Verifico alguna validación en mi controlador. Y deseo agregar un error al elemento específico de mi formulario en caso de falla. Mi forma:

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

El método addError () agrega error a la forma, no al elemento. ¿Cómo puedo agregar un error al elemento locationRadius?


Bien chicos, tengo otra manera. Es más complejo y solo para casos específicos.

Mi caso:

Tengo un formulario y luego de enviarlo, publico datos en el servidor API. Y los errores que obtuve del servidor API también.

El formato de error del servidor API es:

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

Mi objetivo es obtener una solución flexible. Permite establecer el error para el campo correspondiente.

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

¡Eso es!

¡NOTA! addError() método addError() omite la opción error_mapping .

Mi formulario (Formulario de dirección incrustado en el formulario de la empresa):

Empresa

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

Dirección

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


Tu puedes hacer

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

Como los elementos de formulario también son de tipo FormInterface .