2017-02-14 10 views
2

私はFormBuilderの中にフィールド(EntityType =>選択)を持っていますが、空のデータで初期化されるようにしたいので、 。
は、だから私はsymfony's documentationについてEntityTypeを読んでいると私は、データの配列を受け取り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のを見ることができるように、私はnullを与える:
これはビルダーです!
私の目標を達成するにはどうすればよいですか?

+0

あなたはフォームの新しいインスタンスを作成するコントローラ側にコードを投稿できますか?回答のための@zizoujab Thnx – zizoujab

+1

私はすでにソリューションを見つけました。それは下の2番目の答えです。 – SlimenTN

答えて

3

すべての権利、これは解決策です:
まず、私は自分のフォームにEntityManagerを渡す必要があり、これを行うには、私は、サービス作成しました:その後

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

__construct機能でEntityManagerを呼び出す:

private $em; 
private $supplier; 

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

第二に、私は、フォームに2つのイベントを追加する必要があります。
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経由のレンダリング後にフォームにカスタム選択肢を渡すことはできません。フォームのイベントリスナーを作成する必要があります。詳細はenter link description hereのこちらのリンクを確認してください。ここに選択肢を追加する方法があります。 P.P.私の英語のため申し訳ありません)

+0

あなたの答えはThnxですが、エンティティはSBC \ TiersBundle \ Entity \ Supplierのインスタンスでなければならず、FormEvent内のquery_builderにアクセスできないため、IDでデータベースからエンティティを取得できません。 – SlimenTN

関連する問題