2011-11-07 6 views
7

Moja walidacja wyglądaTracę włączenia błędu w polu formularza w 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 

Mój kontroler jak:

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

Próbuję zbudować kontroler rejestracji użytkownika który jest przesyłany za pośrednictwem żądania ajax. Jednak, gdy uruchamiane są błędy w walidacji, zmienna $error wygląda następująco:

[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, 
    ), 
)), 
) [] [] 

Problemem jest to, że nie mają pojęcia, które pole to błąd odpowiada. Czy istnieje sposób, aby znaleźć te dane, tak aby po wysłaniu odpowiedzi json mogę skojarzyć komunikat o błędzie z odpowiednim polem.

Odpowiedz

6

myślę, że można wyszukać każde pole indywidualnie na przykład:

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

Więc można zbudować tablicę sposób:

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

może być w stanie zautomatyzować rzeczy chociaż :

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

Myślę, że getName funkcja powinna zwrócić nazwę pola po wywołaniu dzieci z formularza siebie. Ktoś inny może mieć bardziej efektywny sposób ...

+0

Korzystanie '' '$ form-> getErrors()' 'zwraca błędy, jednak '' 'form-> get ('nazwaużytkownika') -> getErrors()' '' nie zwraca błędów, mimo że te same dane są przesyłane. To tak, jakby błędy były związane z formularzem w ogóle, a nie z każdym polem. – ed209

+0

Czy włączono usuwanie błędów w dowolnym miejscu? – Kasheen

+0

Tak, na przykład '' '$ builder-> add ('nazwaużytkownika', 'tekst', tablica ('błąd_błótenie' => prawda));' '' – ed209

3

Myślę, że zaakceptowana odpowiedź jest już nieaktualna, nie ma już metody 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(); 
     } 
    } 
} 

Ostatecznie, jeśli chcesz uzyskać dostęp do pól formularza z wygenerowanym FormView które dają pełne nazwy pól wejściowych:

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