Symfony 5 добавить поле в форму после отправки формы - PullRequest
0 голосов
/ 06 февраля 2020

Предположим, у меня есть следующая форма:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('paste', TextareaType::class, [
            'attr' => array('rows' => '15'),
        ])
        ->add('language', ChoiceType::class, ['choices' => $this->languagesService->getSupportedLanguages()])
        ->add('visibility', ChoiceType::class, ['choices' => $this->visibilityService->getVisibilities()])
        ->add('expiresAt', ChoiceType::class, ['choices' => $this->expiryService->getExpiryTimes(), 'mapped' => false])
        ->add('name', TextType::class, ['required' => false])
        ->add('save', SubmitType::class, ['label' => 'Submit'])
    ;
}

После отправки формы я хочу добавить в нее еще одно поле, которое пользователь не сможет заполнить. Позволяет вызвать поле, о котором идет речь new_field.

До сих пор я пытался использовать событие формы:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('paste', TextareaType::class, [
            'attr' => array('rows' => '15'),
        ])
        ->add('language', ChoiceType::class, ['choices' => $this->languagesService->getSupportedLanguages()])
        ->add('visibility', ChoiceType::class, ['choices' => $this->visibilityService->getVisibilities()])
        ->add('expiresAt', ChoiceType::class, ['choices' => $this->expiryService->getExpiryTimes(), 'mapped' => false])
        ->add('name', TextType::class, ['required' => false])
        ->add('save', SubmitType::class, ['label' => 'Submit'])
        ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
            $form = $event->getForm();
            $form->add('new_field')->setData('some_data');
        })
    ;
}

И я, очевидно, получил исключение: You cannot add children to a submitted form, что вполне справедливо.

Еще одна вещь, которую я мог бы сделать, которую я очень не хочу делать, потому что кажется хакерской, это создать новую сущность в контроллере, установить там данные, которые я получаю из формы, и сохраните его.

if ($form->isSubmitted() && $form->isValid()) {
    $formData = $form->getData();
    $entity = new Paste();
    $entity->setCreatedAt($formData->get('createdAt')->getData());
    ...

Я мог бы также создать какого-нибудь родового c родителя для формы и изменить его, но это кажется еще более хакерским.


Я не против к другому подходу здесь. Возможно, я смотрю на это неправильно с самого начала.

1 Ответ

1 голос
/ 06 февраля 2020

Если вы хотите изменить данные, вы никогда не должны вызывать $ form-> setData (), поскольку это обрабатывается внутренне.

->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
    $class= $event->getData();
    $class['new_field'] = 'some_data';
    $event->setData($class);
});

Но вместо этого вы можете использовать $ event-> setData ().

...