У меня есть поле формы, которое имеет тип EntityType, и оно содержит несколько городов. Я хочу, чтобы эти города были получены с помощью Ajax удаленно, поэтому я создал запрос json, который возвращает города, которые я ищу.
Эти города возвращают свои имя и идентификатор. Проблема в том, что они не считаются объектами города, поэтому форма не проверяется.
Поле формы:
->add('towns', EntityType::class, [
'required' => false,
'mapped' => false,
'label' => 'Towns',
'translation_domain' => 'forms',
'class' => Town::class,
'choices' => [],
'multiple' => true,
'placeholder' => 'Select towns'
])
Выберите javascript:
$(document).ready(function() {
$('.townDynamicSelect').select2({
minimumInputLength: 2,
ajax: {
url: '{{ path('app_getTowns') }}',
dataType: 'json',
processResults: function (data) {
return {
results: $.map(data, function (item) {
return {
text: item.name,
id: item.id
}
})
};
}
}
});
});
Json ответ:
public function getTowns(Request $request, TownRepository $townRepository){
if ($request->isXmlHttpRequest() && !is_null($this->getUser())) {
$term = $request->query->get('term');
$towns = $townRepository->findMaxByInitials($term, 20);
return $this->json($towns, 200, [], [
'groups' => ['town_select'],
]);
}
}
Все работает нормально, пока я не выберу нужные города и не отправлю форму. Я получаю эту ошибку:
Symfony\Component\Form\Exception\TransformationFailedException
Unable to reverse value for property path "[towns]": Could not find all matching choices for the given values.
Вот так выглядит блок выбора после добавления городов.
<span class="select2 select2-container select2-container--default select2-container--below select2-container--focus" dir="ltr" data-select2-id="6" style="width: 1483px;">
<span class="selection">
<span class="select2-selection select2-selection--multiple" role="combobox" aria-haspopup="true" aria-expanded="false" tabindex="-1" aria-disabled="false">
<ul class="select2-selection__rendered">
<li class="select2-selection__choice" title="Town1" data-select2-id="32"><span class="select2-selection__choice__remove" role="presentation">×</span>Town1</li>
<li class="select2-selection__choice" title="Town2" data-select2-id="33"><span class="select2-selection__choice__remove" role="presentation">×</span>Town2</li>
<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="0" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" placeholder="" style="width: 0.75em;"></li>
</ul>
</span>
</span>
<span class="dropdown-wrapper" aria-hidden="true"></span>
</span>
Редактировать: это то, что я пробовал до сих пор
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
$towns = $form->get('towns')->getData();
$field = $form->get('towns');
$options = $field->getConfig()->getOptions();
$options['choices'] = $towns;
$form->add('towns', EntityType::class, $options);
$form->get('towns')->setData($towns);
});