У меня следующая проблема. У меня есть две таблицы в моем проекте Symony 6:
Эти две таблицы связаны друг с другом в том смысле, что у статьи может быть несколько вариантов, а вариант всегда принадлежит одному товару.
Теперь у меня есть форма для создания нового варианта, в которой я должен выбрать соответствующую статью. Для этого я хочу использовать поле EntityType в качестве раскрывающегося списка.
Проблема в том, что у меня есть до 100 000 статей в таблице статей, что вызывает огромные проблемы с загрузкой при загрузке всех параметров одновременно. Поэтому я подумал об использовании Select2, чтобы запрос делался только после ввода 1-2 символов и в выпадающем списке отображались только те статьи, которые соответствуют поиску.
JS:
$(#sizes).select2({
ajax: {
url: {{ path("text_ajax_load_select_option") }},
dataType: 'json',
type: 'GET',
data: function (params) {
var queryParameters = {
term: params.term,
}
return queryParameters;
},
processResults: function (data) {
return {
results: $.map(data.selectOptions, function (selectOptions) {
return {
text: selectOptions.title,
id: selectOptions.title
}
})
};
}
}
})
Новая форма (VariantenType) с раскрывающимся списком EntityType для динамического заполнения на основе ввода поиска в поле select2:
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
// .. other
->add('base_article', EntityType::class, [
'class' => Artikel::class,
'multiple' => false,
'choice_label' => 'title',
'label' => 'Base Article',
'choices' => [],
])
;
}
Буду рад любым идеям и предложениям.
Вам просто нужно добавить прослушиватель событий PRE_SUBMIT
в ваш FormBuilder:
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
// ... other properties
->add('base_article', EntityType::class, [
'class' => Artikel::class,
'choice_label' => 'title',
'label' => 'Base Article',
'choices' => [],
'attr' => [
'class' => 'select2article'
]
]);
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
if (isset($data['base_article']) and $data['base_article']!=null){
$selected = $data['base_article'];
$form->add('base_article', EntityType::class, array(
'class' => Artikel::class,
'choice_label' => 'title',
'label' => 'Base Article',
'attr' => [
'class' => 'select2article'
],
'query_builder' => function (EntityRepository $er) use ($selected){
return $er->createQueryBuilder('a')
->where('a.id = :id')
->setParameter('id', $selected);
},
));
}
}
);
}
JS
$('.select2article').select2({
ajax: {
url: {{ path("text_ajax_load_select_option") }},
dataType: 'json',
type: 'GET',
data: function (params) {
var queryParameters = {
term: params.term,
}
return queryParameters;
},
processResults: function (data) {
return {
results: $.map(data.selectOptions, function (selectOptions) {
return {
text: selectOptions.title,
id: selectOptions.id
}
})
};
}
}
})
Итак, после отправки запроса мы попадаем в наш обработчик событий. Там мы получим выбранный id
свойства base_article
, после чего добавим параметр query_builder
на форму с выборкой по id из Artikel
сущности