2017-03-23 12 views
0

同じエンティティのコレクションを作成するフォームを作成する必要がありますが、コレクションの各エントリのすべてのフィールドを繰り返す必要はありません(異なる値)。私は同時に同じcategoryの複数Productエンティティを作成するためのフォームを希望入力を共有するエンティティのコレクションを作成するためのsymfonyフォーム

class Product 
{ 
    private $category; 
    private $name; 
    private $price; 
} 

Product実体を想像してみてください。 フォームにはcategoryフィールドが1つあり、コレクションはnamepriceです。

私のフォームは次のようになります:

class ProductCollectionType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('category') 
      ->add('products', CollectionType::class, array(
       'entry_type' => ProductType::class, 
       'allow_add' => true, 
       'mapped'  => false, 
      )) 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => Product::class, 
     )); 
    } 
} 

class ProductType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('price') 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => Product::class, 
     )); 
    } 
} 

自動的に親フィールドとコレクション型のすべてのエンティティを埋めるための方法がある場合は誰でも知っていますか? (この例ではcategoryのみ)

ありがとう!

答えて

0

私は、カテゴリーメンバーに値を必要としない製品のフォームを持つことでこれを解決します。次に、カテゴリ値を受け取る単一のマップされていないフィールドを作成します。送信後にコントローラに戻ったら、マップされていないカテゴリ値を各Productエンティティに適用し、/ persist/etcを処理します。

Symfony Forms pageを確認し、「マップ済み」を検索すると、マップされていないフィールドをフォームに追加する方法がわかります。

+0

これは私が提供している非常に基本的な例ですが、実際の使用例ではこれは1つのフィールドだけではなく、すべてのフィールドで自分のエンティティに適用する制約を利用したいと考えています。私はsymfonyがこのユースケースのために意図したものがあることを期待していました。 – Seb33300

+0

追加の製品をインスタンス化してフォームにカテゴリフィールドのみを必要とするようにすることができます。 Doctrine、SymfonyフォームなどのProduct :: categoryのすべての制約を取得しました。 「オブジェクトのセットに1つのフォームフィールドを使用する」は、かなり慣れ親しみのないパスの使用例です。あなたができることを活かすが、妥協といくつかの余分な仕事を期待しなければならない。 – JasonGabler

関連する問題