динамически изменять форму symfony ajax

#php #jquery #ajax #forms #symfony

#php #jquery #ajax #формы #symfony

Вопрос:

У меня есть следующая форма, которая содержит данные из базы данных, которую она все еще обрабатывает (мне не хватает нескольких полей, которые я еще не добавил). Форма загружает данные в первом выборе, и на основе этого выбора я использую ajax для заполнения второго выбора параметрами, основанными на первом выборе (в основном, ассоциациями с выбранным значением). И оттуда снова другой выбор с определенными параметрами и так далее, и в конце, когда я отправляю форму, я хочу сгенерировать отчет из базы данных на основе данных. На данный момент я застрял со вторым полем, потому что я всегда получаю сообщение об ошибке:

 This value is not valid.
  

Класс form:

 /**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('survey', EntityType::class, [
            'class' => SurveyManager::class,
            'placeholder' => 'Choose option',
            'attr' => [
                'class' => 'field-change',
            ],
        ])
        ->add('headquarter', ChoiceType::class, [
            'choices' => [],
        ])
        ->add('submit', SubmitType::class, [
            'label' => 'Save',
        ])
    ;
}
  

Я не совсем уверен, как исправить ошибку или как мне обращаться с этим типом формы. Не могли бы вы мне помочь, ребята?

Основываясь на ответе, я сделал это

 $builder->addEventListener(
    FormEvents::PRE_SUBMIT,
    function (FormEvent $event) {
        $form = $event->getForm();

        $data = $event->getData();

        $form->add('headquarter', EntityType::class, [
            'class' => HeadQuarterManager::class,
            'query_builder' => function(HeadQuarterManagerRepository $er) {

                return $er->getHeadquarter($data['survey']);
            },
        ]);
    }
);
  

Но я получаю эту ошибку:

 Notice: Undefined variable: data 
  

Не совсем уверен, как передать данные в метод getHeadquarter, чтобы я мог вернуть массив id => name для выбора.

Ответ №1:

Когда вы запускаете функцию $form->isValid() , она проверяет форму, встроенную в buildForm функцию. Любые дополнительные поля / значения, которых там нет, вызовут эту ошибку.

Вы можете изменить это поведение с помощью событий формы.

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

1. я думал, что вы собираетесь сказать, что … 😀 проблема в том, что я никогда их не использовал, и я не совсем понял документацию: (

2. @L.S судя по всему, вам нужен вариант 3 symfony.com/doc/current/form/… Когда вы это сделаете, вы привыкнете к этому

3. хорошо, позвольте мне проверить эту часть, объединить некоторый код, и мы увидим, какие глупости я сделал. : D

Ответ №2:

В конце концов, вот как я это сделал:

 /**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('survey', EntityType::class, [
            'class' => SurveyManager::class,
            'attr' => [
                'class' => 'field-change',
            ],
        ])
        ->add('submit', SubmitType::class, [

        ])
        ->addEventListener(
            FormEvents::PRE_SUBMIT,
            function (FormEvent $event) {
                $form = $event->getForm();

                $data = $event->getData();
                $modifier = $data['survey'];
                $form->add('headquarter', EntityType::class, [
                    'class' => HeadQuarterManager::class,
                    'query_builder' => function (HeadQuarterManagerRepository $er) use ($modifier) {
                        return $er->getHeadquarter($modifier);
                    },
                ]);
            }
        );
}
  

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

1. Как вы уже сделали, это правильный способ сделать это в symfony (ссылка: symfony.com/doc/current/form /… )