2017-03-23 70 views
0

我需要創建一個窗體來創建同一個實體的集合,但我不想重複收集每個條目的所有字段(只有字段會有不同值)。Symfony窗​​體創建實體的集合共享輸入

試想一個Product實體:

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

我想一個形式在同一時間創建相同category的多個Product實體。 所以形式應該有一個category場,和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

我會通過使用不需要類別成員值的產品的窗體來解決此問題。然後創建一個未映射的字段以接收類別值。一旦回到在提交後的控制器,未映射的類別值適用於每個產品的實體,然後加工/持續的/ etc。

簽出Symfony Forms page,搜索「映射」,你會看到如何添加一個未映射的字段到表單。

+0

這是我提供的一個非常基本的例子,但在我的實際使用情況中,這不僅僅涉及一個領域,而且我希望保留我放在所有領域的實體的約束條件。我希望有由symfony的用於此用途的情況下提供的東西。 – Seb33300

+0

那麼你可以額外的產品,使這形式只需要類別字段。現在,您可以獲得產品::類別的所有約束條件,包括原理,Symfony表單等。 「爲一組對象使用一個表單域」是一個相當不受歡迎的用例。充分利用一下就可以了,但是你一定要想到妥協,一些額外的工作。 – JasonGabler