EventListener добавляет новые поля, но контроллер не распознает их - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь добавить новые поля в мою форму в зависимости от выбранного значения из списка. Моя проблема возникает при нажатии «отправить» , после того, как код запускает метод eventListener (в котором добавлено новое поле), контроллер получает форму без нового поля! Я изо всех сил пытаюсь понять, где проблема.

Вот мой конструктор форм:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('DataTypeList', ChoiceType::class, [
            'required' => false,
            'mapped' => false,
            'choices'  => [
                "String Type" => "DataTypeString",
                "Monetary Type" => "DataTypeMonetaryNumber"
            ],
            'attr' => ['style' =>'width: 50vw'],
        ]);

        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event){

            $form = $event->getForm();
            $data = $event->getData();

            if($data['DataTypeList'] === "DataTypeString"){

                $form->add("DataTypeString", TextType::class, [
                    'required' => true,
                    'mapped' => false,
                    'error_bubbling' => true,
                    'attr' => [
                        'placeholder' => 'This is an example',
                        'style' =>'width: 50vw'
                    ]
                ]);
           }
        });
    }

Это мой контроллер:

    $form = $this->createForm('data\AddType', $data, array(
        'action' => $this->generateUrl('data_add', [
            'dataKey_id' => $data->getDataAccessKey()->getId(),
            'returnRoute' => $returnRoute
        ]),
        'method' => 'POST',
    ));

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        //Here I make a dump() on $request that shows that my form only contains 'DataTypeList'
    }

Заранее спасибо за вашу помощь!

1 Ответ

0 голосов
/ 17 января 2020

Это работает для меня:

    if ($form->isSubmitted() && $form->isValid()) {
        dump($form->get('DataTypeString')->getData()); //return null;
    }

Возвращается ноль, потому что вы добавляете свое поле в PRE_SUBMIT и не устанавливаете данные, но нет исключения, поэтому поле DataTypeString существовать.

ОБНОВЛЕНИЕ

Событие PRE_SUBMIT выполняется до действия отправки в PHP.

Это процесс

  1. Создать форму и build
  2. Установить данные в форму (эти данные являются вторыми параметрами метода createForm в вашем контроллере)
  3. Создать вид формы и отобразить форму в браузере
  4. Вы заполняете форму в браузере и отправьте данные
  5. Когда вы обрабатываете запрос в своем контроллере, он просматривает переменную $ _POST и видит, что вы нажимаете кнопку «отправить» в своей форме, он выполняет событие PRE_SUBMIT ЗДЕСЬ , и он выполняет $ form-> submit и POST_SUBMIT
  6. В POST_SUBMIT он проверяет форму и устанавливает ошибки в полях формы
  7. Если ваша форма недействительна, вы не делаете введите if($form->isValid()) и вы создадите вид формы. И на этот раз в вашей форме есть поля DataTypeString , потому что PRE_SUBMIT добавляет поле

Почему вы хотите добавить это поле в PRE_SUBMIT?

...