2011-12-28 27 views
5

Tôi nghĩ đó là một câu hỏi đơn giản. Của nó về lỗi xuất ra. Đây là tập tin của tôi cành lá:Symfony2 form_errors

<table> 
     <tr> 
      <td>{{ form_label(form.dueDate) }}</td> 
      <td>{{ form_widget(form.dueDate) }}</td> 
      <td>{{ form_errors(form.dueDate) }}</td> 
     </tr> 
     <tr> 
      <td>{{ form_label(form.task) }}</td> 
      <td>{{ form_widget(form.task) }}</td> 
      <td>{{ form_errors(form.task) }}</td> 
     </tr> 
    </table> 

Bây giờ mỗi lỗi hiển thị (td với form_errors()) as:

< ul> < li> Giá trị này không nên được để trống </li> </ul>

Câu hỏi của tôi là: Tôi muốn xuất lỗi dưới dạng văn bản thuần túy (không có ul và li).

Tôi biết có là một ví dụ như thế này:

{% for error in errors %} 
    {{ error.message }}   
{% endfor %} 

Nhưng điều này sẽ lỗi đầu ra cái khác. Tôi muốn hiển thị chúng ở đâu đầu vào cụ thể là:

< td> {{myErrorFor form.dueDate}} </td>

Big nhờ sự giúp đỡ nào

+0

Tôi không chắc chắn có cách nào để thực hiện việc này. Nó có thể là cần thiết để viết một phần mở rộng Twig mới (không phải là khó, IIRC). Cách nhanh chóng và dễ dàng, tất nhiên, sẽ là để loại bỏ các kiểu dáng từ 'ul' và' li' ... – lonesomeday

+0

Tôi thích ý tưởng của bạn, nhưng im chắc chắn có một cách dễ dàng hơn ... –

Trả lời

13

Bạn có thể tùy chỉnh cách các lỗi biểu mẫu hiển thị bằng cách cung cấp chủ đề biểu mẫu của riêng bạn với khối field_errors.

Bạn có thể làm điều này cho chỉ là mẫu hiện tại:

{# tell the form to look for theme blocks in the current template #} 
{% form_theme form _self %} 

{% block field_errors %} 
{% for error in errors %} 
{{ error.messageTemplate|trans(error.messageParameters, 'validators') }}<br> 
{% endfor %} 
{% endblock %} 

{# the rest of your template... #} 

Hoặc bằng cách định nghĩa một chủ đề hình thức toàn cầu trong config.yml:

twig: 
    form: { resource: "::form_theme.html.twig" } 

Trong trường hợp này bạn sẽ muốn di chuyển các khối field_errors trên đến app/Resources/views/form_theme.html.twig và thẻ form_theme không còn cần thiết nữa.

+0

Nếu tôi đi với chủ đề biểu mẫu chung, tôi phải làm gì trong mẫu biểu mẫu (không phải 'form_theme.html.twig' nhưng biểu mẫu thực tế của tôi) để làm cho nó hoạt động? –

2

Đây là giải pháp của tôi . Tôi đã quyết định tạo một mảng có lỗi và chuyển nó vào khung nhìn (cành). Tôi đã mất một thời gian để làm việc ra làm thế nào để có được các thông báo lỗi ... nhưng ở đây chúng tôi đi:

// Controller example: 
    public function indexAction(Request $request) 
    { 
    $task = new \Michael\MikeBundle\Entity\Task(); 
    $task->setTask('Write a blog post'); 
    $task->setDueDate(new \DateTime('tomorrow')); 

    $form = $this->createFormBuilder($task) 
     ->add('task', 'text', 
       array('attr' => array('title' => 'Enter Task'))) 
     ->add('dueDate', 'date', array(
      'widget' => 'single_text', 
      'required' => false, 
      'attr' => array('title' => 'Insert due date'))) 
     ->getForm(); 

    // If user submitted code 
    if ($request->getMethod() == 'POST') { 
      // Get form part from request 
      $request->request->get('form');  

      // Bind request into the form 
      $form->bindRequest($request); 
     } 

    // Pass into the view 
    return array('errors' => $this->_getErrors($form), 'form' => $form->createView()); 
    } 

    protected function _getErrors($form) 
    { 
    // Validate form 
    $errors = $this->get('validator')->validate($form); 

    // Prepare collection 
    $collection = array(); 

    // Loop through each element of the form 
    foreach ($form->getChildren() as $key => $child) { 
     $collection[$key] = ""; 
    } 

    foreach ($errors as $error) { 
     $collection[str_replace("data.", "", $error->getPropertyPath())] = $error->getMessage(); 
    } 
    return $collection; 
    } 

Phần quan trọng là phương pháp _getErrors ($ form) vì nó trả về một mảng như thế này (nếu có sai sót) lỗi

$ [ 'nhiệm vụ'] = giá trị này không nên được để trống

$ lỗi [ 'DUEDATE'] = ""

Và đây là cành lá phần:

<table> 
     <tr> 
      <td>{{ form_label(form.dueDate) }}</td> 
      <td>{{ form_widget(form.dueDate) }}</td> 
      <td>{{ errors[form.dueDate.vars["name"]] }}</td> 
     </tr> 
     <tr> 
      <td>{{ form_label(form.task) }}</td> 
      <td>{{ form_widget(form.task) }}</td> 
      <td>{{ errors[form.task.vars["name"]] }}</td> 
     </tr> 
    </table> 

Tôi hy vọng nó đủ rõ ràng. Hãy cho tôi biết nếu bạn cần sự giúp đỡ.

Vui lòng đăng câu trả lời nếu có cách dễ dàng hơn để thực hiện.

+0

http: // stackoverflow .com/questions/6978723/symfony2-how-to-get-form-validation-errors-after-binding-the-request-to-the-fo/8216192 # 8216192 Có thể là cách đơn giản hơn để hoàn thành việc nhận mảng lỗi. – Icode4food

1

Không thể thêm nhận xét, nhưng tôi muốn cập nhật câu trả lời của Kris Wallsmith.Ngày nay, khối này được gọi là form_errors, vì vậy trong dòng thứ ba, nó phải là {% block field_errors %}. Phải mất một thời gian để điều tra, hy vọng ai đó có lợi từ điều đó.

1

Một giải pháp đơn giản (thử nghiệm với symfony 3):

{% for error in form.username.vars.errors %} 
    {{ error.message }} <br/> 
{% endfor %} 

Thay thế 'username' với lĩnh vực hình thức của bạn.