Английский не мой родной язык, извините за это.
У меня есть объект Meet (rendezVous), и в этом объекте у меня есть два других сопоставленных объекта: doctor (docteur) и customer (client).
Я хочу изменить список врачей при выборе клиента.
Для этого я создаю события формы в моем RendezVousType, но проблема заключается в том, что когда я выбираю клиента, сущность Client в моем formModifier пуста.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('client', EntityType::class, array(
'class' => 'AppBundle:Client',
'placeholder' => '',
));
$formModifier = function (FormInterface $form, Client $client = null) {
$idEspece = null === $client ? 0 : $client->getId();
$form->add('docteur', EntityType::class, array(
'class' => 'AppBundle:Docteur',
'placeholder' => '',
'query_builder' => function (DocteurRepository $er) use ($idEspece) {
return $er->getByClientEspece($idEspece);
},
));
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
$data = $event->getData();
$formModifier($event->getForm(), $data->getClient());
}
);
$builder->get('client')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
$client = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $client);
}
);
}
Когда я устанавливаю значение по умолчанию для $ idEspece, построитель запросов возвращает правильный список.
Ваш тип формы действителен, но Symfony не делает этого автоматически, используя ajax, тогда врач появляется только после отправки формы.
Затем, чтобы получить список врачей, использующих ajax, вам нужно добавить дополнительную логику.
Во-первых, создайте действие в вашем контроллере, чтобы получить список врачей и вернуть JSON
/**
* @Route(name="get_doctors", path="/get_doctors" )
*/
public function getDoctorsAction(Request $request)
{
$client = $request->get('rendez_vous')['client'];
$clients = $this->getDoctrine()
->getRepository('AppBundle:Docteur')
->getByClientEspece($client)
->select('s.id', 's.name')
->getQuery()
->getArrayResult();
$indexedClients = array_column($clients, 'name', 'id');
return new JsonResponse($indexedClients);
}
Добавьте следующий плагин jquery в ваши скрипты.
https://appelsiini.net/projects/chained/
<script type="text/javascript" src="{{ asset('js/jquery.chained.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/jquery.chained.remote.min.js') }}"></script>
Добавьте следующий javascript после вашей формы, чтобы инициализировать плагин jquery в вводе вашего доктора:
{{ form(form) }}
<script>
$("#rendez_vous_docteur").remoteChained({
parents: "#rendez_vous_client",
url: '{{ path('get_doctors') }}',
clear: true,
loading: "Loading..."});
</script>
ADIVSE: просмотрите и обновите при необходимости идентификаторы и параметры, используемые в примере.
Спасибо за вашу помощь, но я решил свою проблему самостоятельно, просто делая
php app/console cache:clear
Извините, если вы потеряете время на это
PS: я следил этот учебник по Symfony Doc для создания событий формы.