Отображать все ошибки с ошибками формы (form) plus для каждого поля в symfony2

Мне нужно отобразить все ошибки над формой и отобразить отдельную ошибку для каждого поля. Как я могу это сделать?

6 ответов


вам нужно быть более конкретным, но, надеюсь, следующее Может вам помочь.

предположим, что у вас есть переменная form.

{{ form_errors(form) }} отображает глобальные ошибки, не относящиеся к одному поле

{{ form_errors(form.email) }} отображает ошибки, характерные для поля

{{ form_row(form.email) }} отображает form_widget form_label и form_errors для поле

http://symfony.com/doc/2.0/cookbook/form/form_customization.html

Edit:

поэтому, если вы хотите, чтобы ваши глобальные и полевые ошибки отображались в одном и том же месте, вы можете сделать:

{{ form_errors(form) }}
{{ form_errors(form.field1) }}
{{ form_errors(form.field2) }}
...

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

        {% for children in form.children %}
            {% if not children.vars.valid %}
                {{ form_errors(children) }}

                {# or with field label
                <ul>
                    {% for error in children.vars.errors %}
                        <li><b>{{ children.vars.label }}</b>: {{ error.message }}</li>
                    {% endfor %}
                </ul>
                #}
            {% endif %}
        {% endfor %}
            </div>
    {% endif %}
{% endspaceless %}

работа для меня в sf 2.3


Я переопределяю form_div_layout.формат html.веточка в моем узле:

{% block form_errors %}
    {% spaceless %}
        {% set a = false %}
        {% for child in form.children  %}
            {% if child.get("errors") %}
                {% set a = 'true' %}
            {% endif %}
        {% endfor %}
        {% if a == true %}
            <div class="alert">
                {% for children in form.children %}
                    {{  form_errors(children) }}
                {% endfor %}
            </div>
        {% endif %}
        {% if errors|length > 0 %}
            <ul>
                {% for error in errors %}
                    {{
                    error.messagePluralization is null
                    ? error.messageTemplate|trans(error.messageParameters, 'validators')
                    : error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'validators')
                    }}
                {% endfor %}
            </ul>
        {% endif %}
    {% endspaceless %}
{% endblock form_errors %}

в Symfony 3.2, чтобы получить все ошибки формы в шаблоне, вы можете использовать немного hacky, но простое и рабочее решение с помощью form.vars.errors.form.getErrors(true):

<ul>
    {% for error in formView.vars.errors.form.getErrors(true) %}
    <li>{{ error.message }}</li>
    {% endfor %}
</ul>

фишка в том, что:

  1. исходный объект формы через итератор ошибок (formView.vars.errors.form),
  2. на form.getErrors(true) дает вам рекурсивный итератор над всеми ошибками формы.

ваша форма, а также ваши поля имеют отдельные поля ошибок для начала. Не могли бы Вы уточнить, что вы пытаетесь сделать и где ваша проблема?


Я пересмотрел скрипт @korvinko, это работает для Symfony 2.6.11 `

{% block form_errors %}
    {% spaceless %}
        <ul>
            {% for children in form.children %}
                {% if not children.vars.valid %}
                   {% for error in children.vars.errors %}
                        <li>{{ children.vars.label ~ ' ' ~
                        error.messagePluralization is null
                        ? error.messageTemplate|trans(error.messageParameters, 'validators')
                        : error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'validators')
                        }}</li>
                    {% endfor %}
                {% endif %}
            {% endfor %}
        </ul>

        {% if errors|length > 0 %}
            <ul>
                {% for error in errors %}
                    <li>{{
                    error.messagePluralization is null
                    ? error.messageTemplate|trans(error.messageParameters, 'validators')
                    : error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'validators')
                    }}</li>
                {% endfor %}
            </ul>
        {% endif %}
    {% endspaceless %}
{% endblock form_errors %}

`