我遇到了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)
答案 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);