2011-11-07 13 views
7
bir form alanına bir hata ilişki kaybediyorum

Benim doğrulama görünüyorBen Symfony2'de

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 

gibi gibi Benim denetleyicisi: Bir kullanıcı kayıt denetleyicisi oluşturmak için çalışıyorum

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

ajax isteği ile gönderilir. Sorun O hata tekabül alan hiçbir fikrim yok olduğunu

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

: doğrulama hataları tetiklenen Ancak, $error değişken benziyor. Bu verileri bulmanın bir yolu var, böylece json cevabını gönderdiğimde, hata mesajını ilgili alanla ilişkilendirebilirim.

cevap

6

Sana örneğin tek tek her alanını sorgulayabilir düşünüyorum:

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

Gerçi şeyler otomatikleştirmek mümkün olabilir:

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

Yani bir diziye şu tarafa inşa edebileceğini :

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

getName işlevi, formun kendisinde bulunan çocuklara çağrıldığında alan adını döndürmelidir. Başkasının daha verimli bir yolu olsa da ...

+0

'$ form-> getErrors()' '' döndürür hatalar, ancak '' '$ form-> get ('username') -> getErrors()' '' aynı veri gönderilse bile hata döndürmez. Sanki hatalar, her alandan ziyade genel olarak formla ilişkiliymiş gibi. – ed209

+0

Herhangi bir yerde error_bubbling'i etkinleştirdiniz mi? – Kasheen

+0

Evet, örneğin '' $ builder-> add ('kullanıcı adı', 'text', array ('error_bubbling' => true)) '' ' – ed209

3

Kabul edilen yanıtın zaten modası geçmiş olduğunu düşünüyorum, artık getChildren() yöntemi yok. size tam giriş alan adlarını verecek oluşturulan FormView gelen form alanlarını erişmek istiyorsa

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

Sonunda,: `` kullanma

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