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
.