Symfony ManyToMany сообщение об ошибке в Twig - PullRequest
0 голосов
/ 28 апреля 2018

для простого поля, я просто использую следующий код:

<div class="form-group form-group-sm{{ not form.name.vars.valid ? ' has-error' }}">
  {{ form_label(form.name, 'name') }}
  <div class="col-sm-9">
    {{ form_widget(form.name, {'attr': {'placeholder': 'name'}}) }}
    {{ form_errors(form.name) }}
  </div>
</div>

При наличии ошибки она хорошо отображается в виде веточки.

Но у меня есть поле ManyToMany:

/**
 * @var ArrayCollection
 *
 * @ORM\ManyToMany(targetEntity="Address", cascade={"persist"})
 *
 * @Assert\Valid()
 * @Assert\Count(
 *      min = 1,
 *      minMessage = "at.least.one.address.is.required",
 * )
 */
private $addresses;

Итак, если для моей сущности не заданы адреса, должна появиться ошибка. Но предыдущий код не работает.

Контроллер ловит ошибку, но она не отображается в ветке.

<div class="form-group form-group-sm{{ not form.addresses.vars.valid ? ' has-error' }}">
  {{ form_label(form.addresses, 'addresses') }}
  <div class="col-sm-9">

    {# the following code is for adding elements with javascript via the prototype form #}
    {% import 'common/form/macros/_address.html.twig' as address_form %}
    <div data-component="address" data-value="{{ address_form.data(form.addresses.vars.prototype)|e }}">
      {% for address in form.addresses %}
        {{ address_form.data(address) }}
      {% endfor %}
    </div>

    <button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#modal-address">
      <i class="fa fa-plus" aria-hidden="true"></i>
    </button>
    {# #}

    {{ form_errors(form.addresses) }}
  </div>
</div>

form.addresses.vars.valid всегда верно и form_errors (form.addresses) пусто

Редактировать: Ошибка, возникающая в контроллере, определяется в отношении M2M.

Я получаю это с помощью простой проверки формы:

if ($form->isSubmitted()) {
    if ($form->isValid()) {
     }

    $this->addFlash('danger', $translator->trans('the.form.contains.errors'));
}

Отладчик показывает мне правильную сработавшую ошибку:

ConstraintViolation {#1409 ▼
  -message: "Au moins une adresse est requise"
  -messageTemplate: "at.least.one.address.is.required"
  -parameters: [▼
    "{{ count }}" => 0
    "{{ limit }}" => 1
  ]
  -plural: 1
  -root: Form {#1196 ▶}
  -propertyPath: "data.addresses"
  -invalidValue: ArrayCollection {#870 …}
  -constraint: Count {#729 …}
  -code: "bef8e338-6ae5-4caf-b8e2-50e7b0579e69"
  -cause: null
}

Редактировать2: В отладчике на вкладке Форма простая ошибка поля связана с тем же полем (именем). Но ошибка M2M, как ни странно, связана с сущностью (клубом), а не с полем адресов, как показано на рисунке: enter image description here

1 Ответ

0 голосов
/ 29 апреля 2018

Если на родительском уровне отображается ошибка поля, это происходит из-за того, что ошибка «пузырится».

В построителе форм попробуйте добавить параметр error_bubbling, установленный в false для поля addresses, чтобы он отображался на уровне поля.

Подробнее см. документ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...