Просто базовый пример с некоторым кодом, чтобы показать, как мы используем Select2 (v4.0.3, 3.5 могут сильно отличаться) с Ajax
На веточке мы имеем, например:
$("#users").css('width', '100%').select2({
minimumInputLength: 3,
ajax: {
url: "{{ path('api_search_user') }}",
dataType: 'json',
delay: 500,
data: function (params) {
return {
needle: params.term // Here we send user input to the controller
};
},
processResults: function (data) {
return {
results: data
};
},
cache: false
}
});
А у нас есть контроллер с функцией поиска пользователей:
/**
* @Route("/search_users", name="api_search_users")
* @param Request $request
* @return JsonResponse
*/
public function searchUsersAction(Request $request)
{
$needle = $request->get('needle'); // Here we retrieve user input
$users = $this->get(User::class)->searchUsers($needle);
return new JsonResponse($users );
}
РЕДАКТИРОВАТЬ после вашего последнего комментария
Это значение недопустимо
Это потому, что ваше значение не является частью выбора, когда формуляр добавляет поле. Вы должны добавить addEventListener
на PRE_SUBMIT
, чтобы динамически добавить это значение. Вы можете сделать это следующим образом:
// Define form modifier
$usersFormModifier = function (FormInterface $form, $users) use ($options) {
$choices = array();
if(is_array($users)) {
$choices = $users;
}
$form->add(
'users',
EntityType::class,
array(
'label' => 'conversation.form.users',
'multiple' => true,
'class' => 'AppBundle\Entity\Security\User',
'choices' => $choices,
'choice_label' => function (User $user) {
return $user->getLastName() . " " . $user->getFirstName();
},
'attr' => array(
'placeholder' => 'default.search_person'
)
)
);
};
// On PRE_SET_DATA, we load users from our object (which only contains their IDs)
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($usersFormModifier) {
$usersFormModifier($event->getForm(), $event->getData()->getUsers()->toArray());
}
);
// On PRE_SUBMIT, we add the options, so the select will accept newly added values
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) use ($usersFormModifier) {
$data = $event->getData();
$users = null;
if(isset($data['users'])) {
$users = $this->entityManager->getRepository('AppBundle:Security\User')->findBy(array('id' => $data['users']));
}
$usersFormModifier($event->getForm(), $users);
}
);
Как я сказал в начале, если у вас нет столько тегов, и они не развиваются регулярно, вы можете создать свой выбор со всеми вашими тегами и избежать всей Ajax-части JavaScript-кода Select2! (Я думаю, это будет проще и достаточно для вашего случая)