2013-10-30 222 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是我的實體,它的字段設置。