Symfony 3:提交后修改表单数据

时间:2018-04-17 15:00:59

标签: symfony formbuilder symfony-3.4

我遇到了Symfony 3.4的问题:

我有一个formbuilder包括2个按钮('add'和'extract'),当点击'add'时,我想在CollectionType中添加一个新字段,而不是做“提取”的东西。

我尝试使用FormEvent但是当我可以告诉哪个按钮isClicked()(SUBMIT)时,调用$ event-> setData()和$ event-> getForm() - > setData为时已晚() 没做什么。 另一方面,当我可以设置setData()(PRE_SUBMIT)时,由于在提交过程中尚未计算信息,我无法确定哪个按钮是isClicked()。

如何在点击“添加”按钮后在我的CollectionType中添加值(以及新字段)。

由于

$this->createFormBuilder(array('columns' => array(1, 2, 3)))
            ->add('columns', CollectionType::class, array(
                'entry_type' => TextType::class
            ))
            ->add('extract', SubmitType::class)
            ->add('add', SubmitType::class)
            ->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) {

                if ($event->getForm()->get('add')->isClicked()) {

                    $data = $event->getData();
                    $data['columns'][] = null;
                    $event->setData($data);
                }
            })
            ->getForm()
            ->handleRequest($request)

2 个答案:

答案 0 :(得分:1)

您无法在SUBMIT事件中添加或删除字段。太晚了。您需要在PRE_SUBMIT(cf:https://symfony.com/doc/current/form/events.html#b-the-formevents-submit-event

中执行此操作

尝试检查$ data中是否存在'add'键而不是检查isClicked():

->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
        $data = $event->getData();
        if (isset($data['add'])) {
              $data['columns'][] = null;
              $event->setData($data);
        } 
})

答案 1 :(得分:1)

@Youri_G大多是正确的,但setData必须由定义的表单字段而不是FormEvent调用,以便symfony知道应该修改哪个字段:

$form = $this->createFormBuilder(array('columns' => array(1, 2, 3)))
        ->add('columns', CollectionType::class, array(
            'entry_type' => TextType::class
        ))
        ->add('extract', SubmitType::class)
        ->add('add', SubmitType::class)
        ->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {

            $data = $event->getData();

            if (isset($data["add"])) {

                $data['columns'][] = null;
                // in this way the symfony knows which field should be modified
                $event->getForm()->get("columns")->setData($data['columns']);

            }
        })
        ->getForm();

$form->handleRequest($request);