2016-06-17 34 views
1

を注入します私は、この製品がフォームに追加するために利用できるオプション(色、サイズなど)を知っています。symfonyのフォームは、私はsymfonyのフォームタイプを持っていると私はそれに私が作成した別のフォームを注入したいオブジェクト

class ProductOptionType extends AbstractType 
{  
    private $productOptions; 

    public function __construct(Product $product) 
    { 
     $this->productOptions = $product->getOptions(); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     foreach ($this->productOptions as $option) { 
      $builder->add($option->getId(), ChoiceType::class, [ 
       'choices' => $option->getChoicesForForm(), 
       'label' => $option->getName() 
      ]); 
     } 
    } 
} 

問題はここでコンストラクタを渡すのですか?

$form->add('options', ProductOptionType::class); 

上記は、インジェクタの製品に合格することなくタイプをインスタンス化するので、contstructorなしのエラーをスローします。それは文字列ではなくオブジェクトを想定しているため

$form->add('options', new ProductOptionType($product)); 

また、この1は例外をスローします。

+0

をサービス:http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-your-field-type-as-a-service。ただし、フォームタイプを作成するには、フォームファクトリを使用する必要があるため、通常、あるフォームタイプを別のフォームタイプに挿入しないでください。それはできますが、それは珍しいことです。コレクション、http://symfony.com/doc/current/cookbook/form/form_collections.htmlが良いかもしれません。 – Cerad

答えて

3

あなたはオプション

class ProductOptionType extends AbstractType 
{  

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $productOptions = $options['productOptions']; 

     foreach ($productOptions as $option) { 
      $builder->add($option->getId(), ChoiceType::class, [ 
       'choices' => $option->getChoicesForForm(), 
       'label' => $option->getName() 
      ]); 
     } 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     // you can define a required option field for work 
     $resolver->setRequired([ 
      'productOptions', 
     ]); 
     // ... 
     // You could specify which type of class is supported 
     $resolver->setAllowedTypes([ 
      'productOptions' => ProductOptions:class, 
     ]); 
    } 

} 

そして、次のようにフォーム作成でそれを使用すると、余分なデータを渡すことができます。

$form->add('options', ProductOptionType::class, ['productOptions' => $product]); 

希望あなたのようにあなたのProductOptionTypeを定義する必要があり、このヘルプ

+0

はい、これは素晴らしいソリューションです!この$ form-> add( 'options'、ProductOptionType :: class、null、['productOptions' => $ product])のレコードだけです。それは4つの引数を持っているので、nullを削除します。 –

+0

こんにちは@ Crash21あなたは大歓迎です!私は間違いを修正する – Matteo

関連する問題