Symfony — поле типа объекта с Select2

У меня следующая проблема. У меня есть две таблицы в моем проекте Symony 6:

  1. Статьи
  2. Варианты

Эти две таблицы связаны друг с другом в том смысле, что у статьи может быть несколько вариантов, а вариант всегда принадлежит одному товару.

Теперь у меня есть форма для создания нового варианта, в которой я должен выбрать соответствующую статью. Для этого я хочу использовать поле 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' => [],
            ])         
        ;
    }
    

Буду рад любым идеям и предложениям.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам просто нужно добавить прослушиватель событий 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 сущности

Другие вопросы по теме