Twig模板中简单检查表单字段是否存在错误

66

在Twig模板中,我像这样检查字段是否有错误:

{% if form.points.get('errors') is not empty %}

有没有类似这样的方法:

{% if form.points.hasErrors() %}

要更简单地做这件事?虽然差别不大,但如果我能更轻松地做为何不呢。


已经添加了许多答案,其中一些取决于error_bubbling设置。我已经向Symfony食谱添加了一个PR来改进文档。请随意在此处为其投票:https://github.com/symfony/symfony-docs/issues/6145 - webDEVILopers
请看我的评论,了解如何在Symfony 3.4中使用Twig的for&set或控制器内部的“肮脏”方法来实现它:https://dev59.com/FJPfa4cB1Zd3GeqPBlXr#49785276 如果能满足您的需求,请不要忘记点赞:) - Raphaël G.
10个回答

119

我发现更好的方法是使用这种代码。

{% if not form.vars.valid %}
<div class="alert alert-error">
    {{ form_errors(form) }}
</div>
{% endif %}

1
很遗憾,这对我不起作用,但调用 {{ form_errors(form.somefield) }} 仍然有效。 - ex3v
2
@ex3v 这取决于你如何设置错误冒泡。 - birko
1
你能否详细阐述一下你的回答? - ex3v
3
根据这里描述的http://symfony.com/doc/current/reference/forms/types/form.html#error-bubbling,其默认行为是将字段中所有错误都显示出来。使用form_row(form.field)或form_errors(form.field)可以将它们显示出来。如果将该字段的error_bubbling设置为true,则会在父表单中显示该错误。 - birko
请注意,通常在测试有效状态之前,您应该检查表单是否已提交(就像在控制器中执行的那样),这可以通过以下方式完成:{% if form.vars.submitted %} - COil
显示剩余2条评论

94

此方法不存在。我通常会使用{% if form.points.vars.errors|length %}


13
在使用Symfony 2.3时,这对我无效。birko的解决方案使用form.vars.valid可以正常工作。 - binarious
@binarious 这个方法在Symfony 2.3中运行良好,但你是对的,现在birko的解决方案更好。 - Maxooo
当出现错误时,如果表单类型中设置了error_bubblingTrue,则此解决方案将产生0 - BentCoder
无法使其工作。我想要每个字段的处理方式。不要一次性处理所有错误。如何检查一个字段是否有效?既不是这个,也不是form.MYFORMINPUT.vars.valid起作用。 - Nelson Teixeira
太棒了,它运行正常!! - Kapil Yadav

18

当覆盖字段渲染时,您还可以检查错误:

{% block field_row %}
{% spaceless %}    
    <div class="control-group {% if errors %}error{% endif %}">
      {{ form_label(form) }}
      <div class="controls">
        {{ form_widget(form) }}        
        {{ form_errors(form) }}        
      </div>
    </div>    
{% endspaceless %}
{% endblock field_row %}

14

为了更深入地定制表单,我会执行以下操作:

<div class="form-group {% if form.MYFORMINPUT.vars.valid==false %}has-error{% endif %}">
//some twisted divs
{{form_label(form.MYFORMINPUT)}}
{{form_widget(form.MYFORMINPUT)}}
</div>

Sf2.5


4
如果您正在使用Symfony版本> = 4,则可以使用以下代码检查错误是否存在。
{% if form_errors(registrationForm) %}
    <div class="alert alert-danger">        
        {{ form_errors(registrationForm) }}
    </div>
{% endif %}

1
检查表单是否有错误的最简单方法是:
{% if not form.vars.errors|length %}

{% endif %}

Symfony版本>=4


1
这是我使用的内容:
 <div class="form-group {{ form.brand.vars.errors|length > '' ? 'has-error' }}">

0

由于一个空数组被解析为false,你可以缩短你现有的检查代码为:

{% if form.WIDGET_NAME.get('errors') %}

-2

我遇到了类似的问题,但是我的twig模板中不存在form.points

我必须在控制器中获取错误数量,然后将其作为变量传递到我的模板中。$form->getErrors()在控制器中的行为可能与您预期的不同。请参见this SO question以获取正确获取表单错误的函数。


-2

我已经创建了一个Twig扩展来处理这个问题: 我的扩展

public function hasError($string)
{
    if(strlen($string) > 4)
        return true;
    return false;
}

我在Twig中这样使用它

{{ has_error(form_errors(form.username)) ? form_errors(form.username) : '' }}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接