2011-11-07 21 views
7

xác nhận của tôi trông giống nhưTôi đang mất sự kết hợp của một lỗi để một trường mẫu trong 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 

điều khiển của tôi như:

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

Tôi đang cố gắng để xây dựng một bộ điều khiển người dùng đăng ký được gửi qua yêu cầu ajax. Tuy nhiên, khi các lỗi xác thực được kích hoạt, biến số $error trông giống như:

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

Vấn đề là tôi không biết trường nào lỗi tương ứng. Có cách nào để tìm dữ liệu đó để khi tôi gửi phản hồi json, tôi có thể liên kết thông báo lỗi với trường có liên quan.

Trả lời

6

Tôi nghĩ rằng bạn có thể truy vấn từng lĩnh vực riêng biệt ví dụ:

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

Vì vậy, bạn có thể xây dựng lên một mảng như vậy:

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

Bạn có thể tự động điều mặc dù :

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

Tôi nghĩ rằngChức năngsẽ trả về tên trường khi được gọi về trẻ em dưới dạng tự thân của nó. Người khác có thể có một cách hiệu quả hơn mặc dù ...

+0

Sử dụng '' '$ form-> getErrors()' '' trả về lỗi, tuy nhiên '' '$ form-> get ('username') -> getErrors()' '' trả về không có lỗi mặc dù cùng một dữ liệu được gửi. Nó giống như các lỗi được liên kết với biểu mẫu nói chung, thay vì với mỗi trường. – ed209

+0

Bạn đã bật error_bubbling ở bất kỳ đâu? – Kasheen

+0

Có, ví dụ '' '$ builder-> add ('username', 'text', array ('error_bubbling' => true));' '' – ed209

3

Tôi nghĩ câu trả lời được chấp nhận đã lỗi thời, không còn phương pháp getChildren() nữa.

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

Cuối cùng, nếu bạn muốn truy cập vào các lĩnh vực hình thức từ tạo FormView mà sẽ cung cấp cho bạn tên trường nhập đầy đủ:

$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(); 
     } 
    } 
} 
Các vấn đề liên quan