Отображать все ошибки с ошибками формы (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>
фишка в том, что:
- исходный объект формы через итератор ошибок (
formView.vars.errors.form
), - на
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 %}
`