Сущность пуста в formModifier на событиях формы

Английский не мой родной язык, извините за это.

У меня есть объект 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, построитель запросов возвращает правильный список.

1

Решение

Ваш тип формы действителен, но 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: просмотрите и обновите при необходимости идентификаторы и параметры, используемые в примере.

0

Другие решения

Спасибо за вашу помощь, но я решил свою проблему самостоятельно, просто делая

php app/console cache:clear

Извините, если вы потеряете время на это

PS: я следил этот учебник по Symfony Doc для создания событий формы.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector