2013-10-30 172 views
2

该文档说明了how to dynamically modify forms using form events,尤其是POST_SUBMIT事件。 $form->add('position', 'text', array('data' => 'It works'));预填充动态表单字段

该字段添加,但为空:

根据这个实例,在POST_SUBMIT事件监听器,我不能像预填充数据添加一个字段。

任何想法我该怎么做?


编辑

基本上表单类型应该是这样的:

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

你可以添加更多的信息吗?就像事件监听器类或表单类型(如果第一个不存在)。 – cheesemacfly

+0

我的猜测是表单正在尝试使用提交的数据来填充字段,而没有提交数据。 – Andrew

回答

0

你的意思是字段显示为空当您加载它,或现场没有张贴$ myvalue的数据?在表单提交之前,表单将不会运行post_submit事件侦听器,因此在呈现表单时它将会空白。在您提交表单后,它仍然不会显示$ myValue数据,因为控制器会重定向或加载其他页面。 我不认为你需要使用事件监听器,如果你只想在加载表单时显示数据。创建表单之后但在呈现表单之前,可以在控制器中直接设置表单值。

$form->get('position')->setData($myValue); 

或者你也许想在那里使用事件监听器,你可能想使用PRE_SET_DATA代替。您提到的食谱链接有几个例子,我想您可能想重新访问该代码。

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是我的实体,它的字段设置。