OK muchachos, tengo otra manera. Es más complejo y solo para casos específicos.
Mi caso:
Tengo una forma y después de someto puedo enviar datos al servidor API. Y los errores que obtuve del servidor API también.
formato de error del servidor API es:
array(
'message' => 'Invalid postal code',
'propertyPath' => 'businessAdress.postalCode',
)
Mi objetivo es conseguir 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 todo!
NOTA!addError()
método omite la opción error_mapping.
Mi forma (forma Dirección incrustado en forma de empresa):
Compañía
<?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;
}
}
Gracias. Ha solucionado mi problema. – pltvs
@ m2mdas, gran respuesta! ¿Cómo traduciríamos esto? porque una vez que creamos una instancia de FormError, no la traducirá, ¿estoy en lo cierto? Intenté y no lo traduzco, y creo que tiene sentido. ¿Cómo traducirías una instancia de FormError? – Mick
Hola @Patt, perdón por la respuesta tardía. El componente validador se encarga de traducir los mensajes de violación de restricciones de formulario antes de que los mensajes de error se agreguen al formulario. Para agregar un error personalizado, debe traducir el mensaje del mismo modo que para otras cadenas, por ejemplo, '$ this-> get ('translator') -> trans ('mensaje de error')' –