定义用于错误渲染的自定义树枝表单块

时间:2013-07-08 18:06:30

标签: symfony twig symfony-2.1 symfony-forms

我正在尝试为表单字段错误呈现定义一个特定的新块,保持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 ,但我没有更幸运。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

实际上它的工作原理是仅定义块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
       }
   })
}}