#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 , я хотел бы знать об этом, спасибо !