2011-12-28 34 views
5

我認爲它是一個簡單的問題。它關於輸出錯誤。 這是我的樹枝的文件: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> 

現在每個錯誤顯示(TD與form_errors())爲:

< UL> < LI>該值不應該是空白</LI> </ul>

我的問題是:我想輸出錯誤爲純文本(沒有UL和LI)。

我知道有這樣一個例子:

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

卻接連這將輸出錯誤之一。我想顯示它們在那裏特定的輸入是:

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

非常感謝您的幫助

+0

我不確定有一種方法可以做到這一點。可能需要編寫一個新的Twig擴展(不那麼難,IIRC)。當然,快速簡便的方法是從'ul'和'li'刪除樣式... – lonesomeday 2011-12-28 11:42:46

+0

我喜歡你的想法,但我確定有一個更簡單的方法... – 2011-12-28 12:22:14

回答

13

您可以通過爲field_errors塊提供自己的表單主題來自定義表單錯誤的呈現方式。

您可以只是當前模板做這樣的:

{# 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... #} 

或在config.yml定義一個全局表單主題:

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

在這種情況下,你會想移到高於field_errors塊到app/Resources/views/form_theme.html.twigform_theme標籤不再是必需的。

+0

如果我使用全局表單主題,我需要在表單模板(而不是'form_theme.html.twig',但是我的實際表單本身)中執行什麼操作? – 2012-04-03 19:11:03

2

這裏是我的解決辦法。我決定創建一個有錯誤的數組,並將其傳入視圖(樹枝)。我花了一段時間來解決如何獲得錯誤信息......但在這裏,我們去:

// 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; 
    } 

的重要組成部分,是方法_getErrors($形式),因爲它會返回一個這樣的數組(如果有錯誤)

$錯誤[ '任務'] =該值不應該是空白

$錯誤[ '的dueDate'] = 「」

這裏是枝杈部分:

<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> 

我希望它足夠清楚。讓我知道你是否需要幫助。

如果有更簡單的方法,請發帖回答。

+0

http:// stackoverflow .com/questions/6978723/symfony2-how-to-get-form-validation-binding-the-request-to-fo/8216192#8216192可能是更簡單的方法來完成獲取錯誤數組。 – Icode4food 2012-07-03 13:47:27

1

還不能添加評論,但我想更新Kris Wallsmith的答案。現在這個塊叫做form_errors,所以在第三行應該是{% block field_errors %}。我花了一段時間來調查,希望有人從中受益。

1

另一種簡單的溶液(用symfony 3測試):

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

替換 '用戶名' 與你的表單字段。