Простая проверка, если в поле формы есть ошибки в шаблоне Twig

55

В шаблоне Twig я проверяю, имеет ли поле ошибку, например:

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

Есть ли какой-либо метод вроде:

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

сделать это проще? Это не большая разница, но если я не могу сделать это проще, почему бы и нет.

  • 0
    Многие ответы были добавлены, и некоторые из них зависят от настройки error_bubbling . Я добавил PR в поваренную книгу Symfony, чтобы улучшить документацию. Не стесняйтесь голосовать за это здесь: github.com/symfony/symfony-docs/issues/6145
  • 0
    Смотрите мой комментарий о том, как это сделать с помощью symfony 3.4, грязного пути через веточку для & set или внутри контроллера: stackoverflow.com/a/49785276/7491491 Не забудьте поднять голос, если это исправит ваши потребности :)
Теги:
twig
symfony-forms

9 ответов

85
Лучший ответ

Этот метод не существует. Я обычно делаю {% if form.points.vars.errors|length %}.

  • 13
    Это не работает для меня, используя Symfony 2.3. Решение form.vars.valid с form.vars.valid работает отлично.
  • 0
    @binarious Этот метод отлично работает в Symfony 2.3, но вы правы, решение Бирко теперь лучше.
Показать ещё 3 комментария
102

Лучший способ, который я нашел, - использовать этот вид кода

{% if not form.vars.valid %}
<div class="alert alert-error">
    {{ form_errors(form) }}
</div>
{% endif %}
  • 0
    К сожалению, это не работает для меня, в то время как вызов {{ form_errors(form.somefield) }} все еще работает.
  • 0
    @ ex3v это зависит от того, как вы установили ошибку
Показать ещё 5 комментариев
17

Вы также можете проверить наличие ошибок при переопределении полей:

{% 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 %}
  • 1
    Большое спасибо!
  • 1
    Именно то, что я искал, идеальный ответ.
12

Для более глубокой настройки формы я делаю:

<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

0

Правильный код (для Symfony 3.4):

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

Это то, что я использую:

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

Поскольку пустой массив разрешает false, вы можете сократить существующую проверку до

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

У меня была аналогичная проблема, но form.points не существует в моих шаблонах ветки.

Мне пришлось получить количество ошибок в контроллере, а затем передать его в мои шаблоны в качестве переменной. $form->getErrors() не ведет себя так, как вы могли бы ожидать в своем контроллере. См. этот вопрос SO для функции, которая правильно примет ошибки формы.

  • 6
    вам нужно заменить "точки" на название вашего поля
-2

Я создаю расширение ветки, чтобы справиться с этим: мое расширение

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

Я использую его так, как в twig

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню