Динамическая генерация Symfony 5.1 для представленных форм — Не отображается

#symfony #symfony-forms

Вопрос:

Я приступаю к этой новой должности, потому что, несмотря на множество исследований, я застрял.

У меня есть три сущности.

Сотрудник -> Многие ->> Рефсообщество

Сотрудник -> Многие ->> Ссылка на сайт

Рефсообщество -> Онтомания ->> РефСайт

Рефсообщество -> Онтомания ->> Сотрудник

РефСайт -> Онтомания ->> Сотрудник

РефСайт -> Многие ->> Рефсообщество

Я использую документацию symfony от FormEvent ; https://symfony.com/doc/current/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms

Я хочу, чтобы в моей форме сотрудника, когда я выбираю общество, оно предлагало мне только сайты, связанные с этим обществом.

Вот что я уже сделал. Я перепробовал много разных способов. Когда я вручную передаю идентификатор сообщества, он распознает его и показывает мне нужные сайты.

Кроме того, я не думаю, что блокируется сторона JavaScript. У тебя есть идея ?

EmployeeType.php

 class EmployeeType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('societe', EntityType::class, [
                'class' => RefSociety::class,
                'placeholder' => 'Sélectionnez votre société',
                'mapped' => false,
            ])
        ;
        
        $formModifier = function (FormInterface $form, ?RefSociety $society)
        {
            $sites = null === $society ? [] : $society->getSites();

            $form->add('site', EntityType::class, [
                'class' => RefSite::class,
                'placeholder' => 'Sélectionnez votre site',
                'choices' => $sites,
            ]);
        };
        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier)
            {
                $data = $event->getData();
                $formModifier($event->getForm(), $data->getSociete());
            }
        );
        $builder->get('societe')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier)
            {
                $society = $event->getForm()->getData();
                $formModifier($event->getForm()->getParent(), $society);
            }
        );
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Employee::class,
        ]);
    }
}
 

индекс.html.веточка

 {{ form_start(employeeForm) }}
   {{form_row(employeeForm.societe) }}
   {{form_row(employeeForm.site) }}
{{ form_end(employeeForm) }}

   <script>
        var $society = $('#employee_societe');
        $society.change(function () {
            var $employeeForm = $(this).closest('employeeForm');
            var data = {};
            data[$society.attr('name')] = $society.val();
            //console.log(data)
            $.ajax({
                url: $employeeForm.attr('action'),
                type: $employeeForm.attr('method'),
                data: data,
                success: function (html) {
                    //console.log(data)
                    $('#employee_site').replaceWith(
                        $(html).find('#employee_site')
                    );
                }
            });
        });
    </script>
 

Комментарии:

1. Что содержится в вашем запросе ajax и что вы получаете в ответе сервера ?

2. Привет, jona303 , запрос ajax возвращает идентификатор, соответствующий scoiety в моем console.log(data) , {...} "employee[societe]": "6" Что касается ответа сервера на $society, это a [ ] , поэтому я думаю, что он не может вернуть общество, но он должен

3. Здравствуйте, для информации, мне удалось решить мою проблему, но не лучшим образом. Действительно, я получил список сайтов по обществу в своем контроллере, который я поместил в массив [] , затем я отправил это в свое представление, затем с помощью Ajax я динамически указал те, которые должны отображаться в соответствии с выбором общества. Если вы застряли, как и я, не стесняйтесь обращаться ко мне. Если у кого-нибудь есть решение с использованием FormEvent , я хотел бы знать об этом, спасибо !