Предположим, у меня есть следующая форма:
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 родителя для формы и изменить его, но это кажется еще более хакерским.
Я не против к другому подходу здесь. Возможно, я смотрю на это неправильно с самого начала.