【问题标题】:Simple check if form field has errors in Twig template简单检查表单字段在 Twig 模板中是否有错误
【发布时间】:2012-02-13 10:31:58
【问题描述】:

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

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

有没有类似的方法:

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

做起来更简单?差别不大,但如果我不能更轻松,为什么不呢。

【问题讨论】:

  • 添加了许多答案,其中一些取决于error_bubbling 设置。我在 symfony 食谱中添加了一个 PR 来改进文档。随意在这里投票:github.com/symfony/symfony-docs/issues/6145
  • 查看我关于如何使用 symfony 3.4 进行操作的评论,通过 twig for&set 或控制器内部的肮脏方式:stackoverflow.com/a/49785276/7491491 如果它解决了您的需求,请不要忘记投票:)

标签: symfony twig symfony-forms


【解决方案1】:

检查表单是否有错误的最简单方法:

{% if not form.vars.errors|length %}

{% endif %}

Symfony 版本 >= 4

【讨论】:

    【解决方案2】:

    如果您使用的是 symfony 4,您可以使用此代码检查是否存在错误

    {% if form_errors(registrationForm) %}
        <div class="alert alert-danger">        
            {{ form_errors(registrationForm) }}
        </div>
    {% endif %}
    

    【讨论】:

      【解决方案3】:

      这是我用的:

       <div class="form-group {{ form.brand.vars.errors|length > '' ? 'has-error' }}">
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          对于更深入的表单定制,我会这样做:

          <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

          【讨论】:

            【解决方案6】:

            我创建了一个树枝扩展来处理这个问题: 我的扩展

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

            我在twig中这样使用它

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

            【讨论】:

              【解决方案7】:

              由于空数组解析为 false,您可以将现有检查缩短为

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

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                • 遗憾的是,这对我不起作用,而调用 {{ form_errors(form.somefield) }} 仍然有效。
                • @ex3v 这取决于您如何设置错误冒泡
                • 你能扩展你的答案吗?
                • @ex3v 如此处所述symfony.com/doc/current/reference/forms/types/… 默认行为已将其设置为有效字段显示的所有错误。使用 form_row(form.field) 或 form_errors(form.field) 将显示它们。如果您为该字段设置了 error_bubbling true。错误将显示在他的父窗体中。
                • 谢谢!但是当您已经拥有 100 个表格时,事情就变得复杂了。我正在编写 bundle 来帮助解决这个问题,完成后会分享。
                【解决方案9】:

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

                {% 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 %}
                

                【讨论】:

                  【解决方案10】:

                  该方法不存在。我通常做{% if form.points.vars.errors|length %}

                  【讨论】:

                  • 这对我使用 Symfony 2.3 时不起作用。 birko 的form.vars.valid 解决方案工作正常。
                  • @binarious 这个方法在 Symfony 2.3 中运行良好,但你是对的,birko 的解决方案现在更好了。
                  • 出现错误时,此解决方案会产生0 IF error_bubbling is set to True in form type.
                  • 无法完成这项工作。我想要每场治疗。不要一次处理所有错误。如何检查一个字段是否有效?这和 form.MYFORMINPUT.vars.valid 都不起作用。
                  • 太好了,有效!!
                  猜你喜欢
                  • 2012-03-01
                  • 2011-03-20
                  • 1970-01-01
                  • 2012-06-21
                  • 2011-05-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多