2017-10-20 7 views
0

まず、私がsymfonyフォームのアマチュアであることを認めましょう。どんな助けでも本当に感謝しています。私は実際のコードを共有することは許されていないので、私はユースケースを示すためにいくつかのサンプルコードを使用しています。下記のsymfonyで複数のフォームタイプを使用してデータクラスを持つ単一のフォームを作成する方法

は、ユースケース、

である私はtestEntityと呼ばれるエンティティ、私はformType1と呼ばれるフォームタイプを持っている

class testEntity { 
    private $property1; 
    private $property2; 
    private $property3; 

    //with setters and getters 
} 

class formType1 extends AbstractType { 
     public function buildForm(FormBuilderInterface $builder, array $options) { 
      $builder 
       ->add('property2') 
       ->add('property3) 
      ; 
     } 

     public function buildView() { 
      // Code that create view vars 
     } 
    } 

を持っていると私は、フォームタイプを持っていますtestEntityの場合、

class testEntityType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('property1) 
     .... 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults([ 
      'data_class' => testEntity::class 
     ]); 
    } 
} 

formType1は、outデータクラスを持つフォームタイプであり、独自のテンプレートであり、単独で使用されます。私がしたいのは、testEntityのformType1を再利用することです。formType1にはtestEntityのプロパティにマップされるフィールドがあります。これにより、フォームデータとともにtestEntityオブジェクトを取得できるようになり、最終フォームでformType1のビューを取得できます。

私は十分質問を額装していない場合、フォームは、フォームからのデータを事前に

謝罪とI GET $ testEntityを送信したときに、なるようにコントローラのアクションは、この、

$testEntity = new testEntity(); 
$form = $this->createForm(PostType::class, $testEntity); 

を持っています理解されるべきである。

falseにオプションや敷石mappedを介してデータを渡され

class testEntityType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('property1') 
      ->add('formType1', formType1::class, [ 
       'mapped' => false, 
       'data' => $options['data'] 
      ]) 
     .... 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults([ 
      'data_class' => testEntity::class 
     ]); 
    } 
} 

、これを行うことによって、この作業を手に入れました。

答えて

0

実際、お客様のformType1は単なるカスタムタイプです。 あなたがしなければならないのは、カスタムタイプ以外のタイプ(ChoiceType、TextTypeなど)と同じように、使用するタイプをインポートしてビルダーに追加することだけです。

use YourBundle\Type\formType1; 

class testEntityType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('property1') 
      ->add('formType1', formType1::class, [ 
       'data_class' => testEntity::class, //line edited 
      ]) 
     .... 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults([ 
      'data_class' => testEntity::class 
     ]); 
    } 
} 

PS:あなたのクラスの命名規則についてのあなたの迅速な応答を

+0

感謝を付けろ。あなたがあなたのアップデートで言及したように 'formType1'を子フォームの名前として使用すると、' getFormType1() 'や' testEntity'の 'formType1'のようなプロパティが存在しないというエラーが出力されます。 –

+0

このフォームを使用してコントローラアクションで質問を更新できますか?ビルダーに 'data_class'を追加するとどうなりますか(編集を参照) –

+0

コントローラーアクションのコードで質問を更新しました。また、data_classをビルダに渡すと、次のようなエラーが返されます。 'プロパティ" formType1 "と" getFormType1() "、" formType1() "、" isFormType1() "のいずれも使用できません、 "hasFormType1()"、 "__get()"が存在し、 "Entity \ testEntity"クラスのパブリックアクセスを持っています data_classを渡しているので、フォームはデータクラスのプロパティにマップされた名前を持つ子'formType1'は' testEntity'のどのプロパティにもマッピングされません。 –

関連する問題