2011-11-07 8 views
7

Mi validación pareceEstoy perdiendo la asociación de un error de un campo de formulario en Symfony2

Acme\UserBundle\Entity\User: 
    constraints: 
     - \Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { fields:username, message: "Username already in use" } 
     - \Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { fields:email, message: "Email address already in use" } 
    properties: 
     username: 
      - NotBlank: ~ 
      - MinLength: { limit: 2, message: "Your username must have at least {{ limit }} characters." } 
     email: 
      - Email: 
       message: The email "{{ value }}" is not a valid email. 
       checkMX: true 

Mi controlador como:

$form = $this->createForm(new RegistrationType()); 
$form->bindRequest($request); 
if ($form->isValid()) { 
    //... save to db 
}else{ 
    $errors = $form->getErrors(); 
    //... pass the errors back as json 
} 

Estoy tratando de construir un controlador de registro de usuarios que se envía a través de una solicitud ajax. Sin embargo, cuando se activan los errores en la validación, la variable $error parece:

[2011-11-07 19:19:44] app.INFO: array (
    0 => 
    Symfony\Component\Form\FormError::__set_state(array(
    'messageTemplate' => 'Email address already in use', 
    'messageParameters' => 
    array (
    ), 
)), 
    1 => 
    Symfony\Component\Form\FormError::__set_state(array(
    'messageTemplate' => 'Your username must have at least {{ limit }} characters.', 
    'messageParameters' => 
    array (
     '{{ value }}' => '1', 
     '{{ limit }}' => 2, 
    ), 
)), 
) [] [] 

El problema es que no tengo idea de qué campo que corresponde al error. ¿Hay alguna forma de encontrar esa información para que cuando envíe la respuesta json, pueda asociar el mensaje de error con el campo correspondiente?

Respuesta

6

creo que se puede consultar cada campo de forma individual, por ejemplo:

$form->get('username')->getErrors()

por lo que podría construir una matriz que forma:

$errors['username'] = $form->get('username')->getErrors(); 
$errors['email'] = $form->get('email')->getErrors(); 

Es posible que pueda automatizar cosas aunque :

$fields = $form->getChildren(); 
foreach ($fields as $field) { 
    $errors[$field->getName()] = $field->getErrors(); 
} 

Creo que elLa funcióndebe devolver el nombre del campo cuando se le pide a los niños de la forma que lo haga. Sin embargo, otra persona puede tener una forma más eficiente ...

+0

El uso de '' '$ form-> getErrors()' '' devuelve el errores, sin embargo '' '$ form-> get ('username') -> getErrors()' '' no devuelve errores aunque se envíen los mismos datos. Es como si los errores estuvieran asociados con la forma en general, en lugar de con cada campo. – ed209

+0

¿Ha habilitado error_bubbling en cualquier lugar? – Kasheen

+0

Sí, por ejemplo '' '$ builder-> add ('username', 'text', array ('error_bubbling' => true))' ' – ed209

3

Creo que la respuesta aceptada ya está desactualizada, ya no hay un método getChildren().

$errors = []; 
foreach ($form->all() as $field) { 
    if ($field->getErrors()->count() > 0) { 
     $fieldName = $field->getName(); 
     $errors[$fieldName] = []; 
     foreach ($field->getErrors() as $error) { 
      $errors[$fieldName][] = $error->getMessage(); 
     } 
    } 
} 

Finalmente, si desea acceder a los campos de formulario desde generada FormView que le daría completos nombres de los campos de entrada:

$errors = []; 
foreach ($form->createView()->children as $field) { 
    if ($field->vars['errors']->count() > 0) { 
     $fieldName = $field->vars['full_name']; 
     $errors[$fieldName] = []; 
     foreach ($field->vars['errors'] as $error) { 
      $errors[$fieldName][] = $error->getMessage(); 
     } 
    } 
} 
Cuestiones relacionadas