【问题标题】:Defining custom twig form block for errors rendering为错误渲染定义自定义树枝表单块
【发布时间】:2013-07-09 05:31:39
【问题描述】:

我正在尝试为表单字段错误呈现定义一个特定的新块,保持 form_errors 不变以用于常见错误呈现。

# Twig Configuration
twig:
  debug:            %kernel.debug%
  strict_variables: %kernel.debug%
    form:
      resources:
        - 'ApplicationMyBundle:Main:form/customFormTheme.html.twig'

customFormTheme.html.twig 中,我覆盖了从form_div_layout.html.twig 复制的几个块,并添加了以下新块。

{% block field_errors %}{% spaceless %}
        {% if errors|length > 0 %}
        <ul class="errors">
            {% for error in errors %}
                {% if error.messageTemplate|length %}
                <li class="error">{{ error.messageTemplate|trans(error.messageParameters, 'validators') }}</li>
                {% endif %}
            {% endfor %}
        </ul>
        {% endif %}
{% endspaceless %}{% endblock %}

然后我希望能够像这样在我的视图中使用这个块:

 <div>
     {{ form_label(form.message, 'message.label'|trans({},'contact')|raw ) }}
     {{ form_widget(form.message, {attr: {maxlength:1000, size:1000, rows:8}}) }}
     {{ field_errors(form.message) }}
 </div>

但我收到以下错误:

The function "field_errors" does not exist. Did you mean "form_errors"

我也尝试将我的块命名为text_errorstextarea_errors 提到here,但我没有更幸运。

有什么想法吗?

【问题讨论】:

    标签: symfony twig symfony-2.1 symfony-forms


    【解决方案1】:

    实际上,它只通过定义块text_errorstextarea_errors 来工作,并且仍然在您的模板中使用{{ form_errors(field.name) }}。如果存在以您的字段类型命名的块 (according to form field types),它将被使用而不是 form_errors

    !!但是你不能在你的树枝模板中直接使用{{ text_errors(field.name) }}!!

    您可以像这样为特定类型创建自定义行

    {% block textarea_row %}{% spaceless %}
        <div class="textarea l-field {{ (form_errors(form)?'error':'') }}">
            {{ form_label(form) }}
            {{ form_widget(form) }}
            {{ form_errors(form) }}
        </div>
    {% endspaceless %}{% endblock textarea_row %}
    

    并在您的模板中使用它,如下所示:

    {# message has textarea field type #}
    
    {{ form_row(form.message, {
        label: 'message.label'|trans({},'contact')|raw ,
        attr: {maxlength:1000, size:1000, rows:8}})
    }}
    

    您还可以使用对象 attr{}

    传递许多自定义参数
    {% block form_row %}
    {% spaceless %}
        <div class="form-field {{ (form_errors(form)?'error':'') }}">
            {{ form_label(form) }}
            {{ form_widget(form) }}
            {{ dump(attr) }}
            {% if attr.help is defined and not attr.help == '' %}<p class="form-help">{{ attr.help }}</p>{% endif %}
            {{ form_errors(form) }}
        </div>
    {% endspaceless %}
    {% endblock form_row %}
    

    并像这样使用它

    {{ form_row(form.message, {
           label: 'message.label'|trans({},'contact')|raw ,
           attr: {
               maxlength:1000, size:1000, rows:8,
               help: 'password.help'|trans({})|raw
           }
       })
    }}
    

    【讨论】:

    • 我仍然缺少一种在我的自定义块中测试自定义参数并进行进一步自定义的方法,例如with help:"A custom legend for the field"
    • 我想出了如何通过使用 attr 对象来做到这一点。我编辑了我的答案。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多