如何浏览表单错误

时间:2016-04-12 13:53:31

标签: php symfony symfony-forms

我想浏览表单错误但我不适合我。

我在没有ajax的情况下尝试过,我这是错误

An exception has been thrown during the rendering of a template ("Notice: Array to string conversion") 
in AppBundle:Admin:errors-form.html.twig at line 5.

我认为问题是如何使用twig循环此行:

    'data' => $this->getErrorMessages($form),

这是代码

protected function getErrorMessages(\Symfony\Component\Form\Form $form)
{
    $errors = array();

    foreach ($form->getErrors() as $key => $error) {
        $errors[] = $error->getMessage();
    }

    foreach ($form->all() as $child) {
        if (!$child->isValid()) {
            $errors[$child->getName()] = $this->getErrorMessages($child);
        }
    }

    return $errors;
}


public function addAction(Request $request)
{
    if ($form->isValid()) {
        //..
    } else {

        $view = $this->renderView(
            'AppBundle:Admin:errors-form.html.twig', array(
                'data' => $this->getErrorMessages($form),
            )
        );
        $response = new JsonResponse(array(
                'view' => $view,
                'result' => 0,
                'message' => 'Invalid form',
            )
        );
        return $response;

    }


}

这是JsonResponse在出现错误时返回的视图,但错误未显示,但如果我在此视图中放置静态文本,则会在提交后显示

<div id="error">

    {% for error in data %}

        {{ error }}

    {% endfor %}
</div>

3 个答案:

答案 0 :(得分:2)

如果您只想获取错误并在树枝中显示错误,则无需getErrorMessages。您可以将表单$form传递给视图:

public function addAction(Request $request)
{
    if ($form->isValid()) {
    //..
} else {
    $view = $this->renderView(
        'AppBundle:Admin:erreurs-form.html.twig', array(
            'form' => $form,
        )
    );
    $response = new JsonResponse(array(
            'view' => $view,
            'result' => 0,
            'message' => 'Invalid form',
        )
    );
    return $response;
  }
}

并使用树枝中的内置form_errors来获取错误并显示错误:

{% if form_errors(form) %}
<div id="error">
    {{ form_errors(form) }}
</div>
{% endif %}

或者可以通过以下方式获取Controller中的错误:

$view = $this->renderView(
        'AppBundle:Admin:erreurs-form.html.twig', array(
            'data' => $form->getErrors()
        )
    );

并使用它来处理树枝:

<div id="error">
{% for error in data %}
    {{ error.message }}        
{% endfor %}
</div>

答案 1 :(得分:0)

getErrors方法只返回表单的第一级,表示表单本身而不是子表单。

您需要提供布尔参数,以便在表单中深入搜索方法:getErrors(true)

protected function getErrorMessages(\Symfony\Component\Form\Form $form)
{
    // ...

    foreach ($form->getErrors(true) as $key => $error) {
        $errors[] = $error->getMessage();
    }

    // ...

    return $errors;
}

请参阅symfony文档http://symfony.com/doc/current/components/form/introduction.html#accessing-form-errors

修改

我一开始并没有注意到。模板中的错误是由以下代码引起的:

foreach ($form->all() as $child) {
    if (!$child->isValid()) {
        $errors[$child->getName()] = $this->getErrorMessages($child);
    }
}

$this->getErrorMessages($child)实际上是返回一个数组,而不是一个字符串。您需要执行以下操作:

foreach ($form->all() as $child) {
    if (!$child->isValid()) {
        foreach ($this->getErrorMessages($child) as $error) {
            $errors[$child->getName()] .= ' '.$error
        }

    }
}

答案 2 :(得分:0)

它必须是两个{%for%}循环,并且我已经修复了它,现在它运行良好。

<div id="error">

    {% for data in data %}
        {% for error in data %}
            {{ error }}<br>
        {% endfor %}

    {% endfor %}

</div>