2017-02-14 36 views
2

我在我的FormBuilder我有一個字段(EntityType =>在視圖中選擇),我希望它在初始化與空數據,所以我可以填充它後,在視圖中通過ajax 。
所以我已閱讀symfony's documentationEntityType我發現接收數據的數組choices屬性,所以我給它一個空'choices' => array()和它的伎倆。
現在的問題是,當我提交表單,symfony的不知道了該字段的類型,並給我null
這是建設者:
Symfony2:初始EntityType字段與空數據

$buidler->add('supplier', EntityType::class, array(
       'class' => 'SBC\TiersBundle\Entity\Supplier', 
       'attr' => array(
        'class' => 'uk-select uk-select-supplier' 
       ), 
       'choices' => array(), 
      )) 

正如你可以看到該字段的類型是SBC\TiersBundle\Entity\Supplier但提交後的symfony讓我空!
我該怎麼做才能實現我的目標?

+0

您可以張貼在您創建表單 – zizoujab

+1

@zizoujab日Thnx你的答案我已經找到它的下方的第二個答案的解決方案的新實例在控制器端的代碼。 – SlimenTN

回答

3

好吧,這是解決方案:
首先,我需要將EntityManager傳遞給我的形式,而要做到這一點,我已經創建了一個服務:

services: 
    payment.supplier.form: 
     class: SBC\PaymentBundle\Form\PaymentSupplierType 
     tags: 
      - { name: form.type, alias: form_em } 
     arguments: ["@doctrine.orm.entity_manager"] 

然後調用EntityManager__construct功能:

private $em; 
private $supplier; 

function __construct(EntityManager $em) 
{ 
    $this->em = $em; 
} 

其次,我需要兩個事件添加到窗體:
PRE_SUBMIT(獲得供應商的代碼並創建使用EntityManager供應商對象):

$builder->addEventListener(
      FormEvents::PRE_SUBMIT, 
      function(FormEvent $event){ 
       $data = $event->getData(); 
       $code = $data['supplier']; 
       $this->supplier = $this->em->getRepository('TiersBundle:Supplier')->find($code); 
      } 
     ); 

最後,使用POST_SUBMIT事件來設置供應商對象在提交的數據:

$builder->addEventListener(
      FormEvents::POST_SUBMIT, 
      function(FormEvent $event){ 
       $object = $event->getData(); 
       $object->setSupplier($this->supplier); 
       $event->setData($object); 

      } 
     ); 

Thanx toВиталийБойко誰給了我關於表單事件的提示。
所以這就是我的知識,如果你有更好的解決方案,請與我們分享。

0

Symfony的默認使用安全的形式,因此,如果你沒有在表單生成器的選擇,你可以不通過自定義選擇的形式呈現僅通過JavaScript後,因爲你不是有效的形式。您需要爲表單創建eventlistener。查看此鏈接以獲取更多信息enter link description here,在這裏您可以找到如何添加選項。 P.S.對不起,我的英語)

+0

Thnx爲你的答案,但我的實體應該是SBC \ TiersBundle \ Entity \ Supplier的一個實例,我無法訪問FormEvent中的query_builder以通過它的id從數據庫獲取實體。 – SlimenTN