Symfony2 form_errors

时间:2011-12-28 11:37:31

标签: php symfony

我认为这是一个简单的问题。它关于输出错误。 这是我的枝条文件:

    <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 with form_errors()):

  

&LT; UL&GT;&LT; li&gt;该值不应为空白&lt; /立GT;&LT; / UL&GT;

我的问题是:我想将错误输出为纯文本(没有ul和li)。

我知道有一个这样的例子:

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

但这会一个接一个地输出错误。我想在特定输入的位置显示它们:

  

&LT; td&gt; {{myErrorFor form.dueDate}}&lt; / TD&GT;

非常感谢任何帮助

4 个答案:

答案 0 :(得分: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.twig,并且不再需要form_theme标记。

答案 1 :(得分:2)

这是我的解决方案。我决定创建一个包含错误的数组并将其传递给视图(twig)。我花了一段时间才弄清楚如何获取错误消息......但是我们走了:

    // 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($ form),因为它返回一个这样的数组(如果有错误)

  

$ errors ['task'] =此值不应为空

     

$ errors ['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>

我希望它足够清楚。如果您需要帮助,请告诉我。

如果有更简单的方法,请发帖回答。

答案 2 :(得分:1)

暂时无法添加评论,但我想更新Kris Wallsmith的答案。现在这个块被称为form_errors,所以在第3行它应该是{% block field_errors %}。我花了一段时间进行调查,希望有人能从中受益。

答案 3 :(得分:1)

另一个简单的解决方案(使用symfony 3测试):

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

替换&#39;用户名&#39;与您的表单字段。