文档解释了how to dynamically modify forms using form events,特别是POST_SUBMIT事件。
按照此示例,在POST_SUBMIT事件侦听器中,我无法添加具有预填充数据的字段,如:$form->add('position', 'text', array('data' => 'It works'));
该字段已添加但为空。
知道我该怎么办?
修改
基本上,表单类型如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('colors', 'choice', array(
'choices' => array('blue', 'green', 'red'),
'multiple' => true,
'expanded' => true,
'mapped' => false,
));
$builder->get('colors')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
// ... Some logic to determine data to pre populate $myValue
$myValue = 'It works';
$form = $event->getForm()->getParent();
$form->add('position', 'text', array(
'data' => $myValue
));
});
}
答案 0 :(得分:1)
我遇到了同样的问题,提交的数据替换了默认值。 所以,在我的PRE_SUBMIT监听器中,我检查了数据是否已提交,如果不是,我将其插入:
public function onPreSubmit(FormEvent $event)
{
$form = $event->getForm();
$data = $event->getData();
if(!isset($data['MY_FIELD'])) {
$data['MY_FIELD'] = $myCustomData;
$event->setData($data);
}
}
在我的情况下' MY_FIELD'是一个实体的嵌入形式,$ myCustomData是我的实体与它的字段集。
答案 1 :(得分:0)
你的意思是当你加载它时字段显示为空,或者字段没有发布$ myValue数据?在提交表单之前,表单不会运行post_submit事件侦听器,因此在呈现表单时它将显示为空白。提交表单后,它仍然不会显示$ myValue数据,因为控制器将重定向或加载不同的页面。 如果您只想在加载表单时最初显示数据,我认为您不需要使用事件侦听器。在创建表单之后但在呈现表单之前,您可以直接在控制器中设置表单值。
$form->get('position')->setData($myValue);
或许你确实想在那里使用一个事件监听器,你可能想要使用PRE_SET_DATA。您提到的食谱链接有几个示例,我想您可能想重新访问该代码。