2015-08-26 15 views
0

我有一個這樣的形式定義(用於演示目的):與靜態記錄實體表單字段

$builder->add('field', 'entity', [ 
    'class' => EntityA::class, 
    'query_builder' => function($repo) { 
     return $repo->createQueryBuilder('e') 
      ->andWhere('e.active = 1'); 
    } 
]); 

這確保了只有活動記錄可以在下拉字段採用這種形式時,可以選擇。

這導致了這種情況:當我使用上面的表單定義編輯一個實體,並且該實體被指定爲非活動的EntityA時,它將不會出現在下拉字段中。當我點擊保存按鈕時,它將獲得分配的第一個激活(如果有的話)EntityA。此外,該表單將向用戶建議分配一個不同的Entity比實際情況。

正確的方法是表單顯示所有活動記錄和當前分配的一個非活動記錄。

我看着表單事件監聽器,但這似乎過於複雜。此外,擴展僅用於編輯的表單可能是一件事情,但對我來說似乎不是「正確的方式」。

如何解決此問題,最好不使用第三方軟件包?

回答

0

獲取對象和到下拉取決於操作類型的加載不同的數據:編輯/製作:

$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) 
{ 
    $data = $event->getData(); 
    $form = $event->getForm(); 

    $form ->add('field', 'entity', [ 
     'class' => EntityA::class, 
     'query_builder' => function($repo) use ($data) { 
      if ($data->getId()) { 
       // Edit mode: append the pre-selected record to dropdown 
       return $repo->createQueryBuilder('e') 
        ->andWhere('e.active = 1') 
        ->orWhere('e.id = :id') 
        ->setParameter('id', $data->getId()); 
       } else { 
       // Display only active records 
       return $repo->createQueryBuilder('e')->andWhere('e.active = 1');       
       } 
      } 
    ]); 
}); 
+0

如果我把這個代碼放到'buildForm'方法,我總是得到'null'的'$ object'。此時執行的時間太早。 – Joshua

+0

當FormEvents :: POST_SET_DATA事件事件被觸發時添加字段(http://symfony.com/doc/current/components/form/form_events.html) –

+0

謝謝。我使用了'PRE_SET_DATA'和自定義字段類型的組合來掃描我的表單並更改'query_builder'。 – Joshua