2016-04-01 9 views
1

複雑なフォームを埋め込みフォームで作成しようとしています。symfonyフォームの提出が要求配列をエンティティに変換しない

フォームは、同時に2つのエンティティ(InstrumentおよびSpecification)を作成または変更する必要があります。フォームの問題点を説明する前に

いくつかの重要な情報:

Specificationが常に同じクラスではないので、この2つのエンティティ間には教義の関係はありません。たとえば、Instrumentがギターの場合、クラスはGuitarSpecification、レコーダーの場合はRecorderSpecificationです。

教義は関係のこのタイプを扱うことができないので、私はそれを手動で管理する:

  • エンティティがロードされる
  • Specification関連ゲッター/セッターを持つプロパティspecificationとしてInstrumentエンティティが、中で除去し、永続しましたDoctrine Eventsを使用してInstrumentと同じ時間です。

機器のルートフォームは(ライトバージョン)である:

class InstrumentType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->setRequestHandler(new JsonApiRequestHandler()); 

     $builder 
      ->add('name',   TextType::class) 
      // ... other fields 
     ; 

     // Add specification 
     $formModifier = function(FormInterface $form, \InstrumentBundle\Entity\InstrumentType $instrumentType = null) { 
      $prefix = null === $instrumentType ? 'Abstract' : $instrumentType->getPrefix(); 

      $form->add('specification', 'InstrumentBundle\\Form\\Specification\\' . $prefix . 'SpecificationType'); 
     }; 

     $builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function(FormEvent $event) use ($formModifier) { 
       // Get Instrument Entity 
       $data = $event->getData(); 

       $formModifier($event->getForm(), $data->getInstrumentType()); 
      } 
     ); 

     $builder->get('instrumentType')->addEventListener(
      FormEvents::POST_SUBMIT, 
      function(FormEvent $event) use ($formModifier) { 
       // Get Instrument Entity 
       $instrumentType = $event->getForm()->getData(); 

       $formModifier($event->getForm()->getParent(), $instrumentType); 
      } 
     ); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'csrf_protection' => false, 
      'cascade_validation' => true, 
      'data_class'  => 'InstrumentBundle\Entity\Instrument' 
     ]); 
    } 
} 

Instrument(ギターの種類を確認し、イベントリスナー(PRE_SET_DATAPOST_SUBMIT)が存在するこの形式の孤独な複雑であり、レコーダーなど)を入力し、正しいSpecificationフォーム(GuitarSpecification、RecorderSpecificationなど)を追加します。ここで

は私のSpecificationフォームタイプのうちの一つの例である:

class GuitarSpecificationType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('leftHanded', CheckboxType::class) 
      ->add('headstock',  TextType::class) 
      ->add('body',   TextType::class) 
      ->add('amplification', TextType::class) 
      ->add('strings',  IntegerType::class) 
      ->add('frets',   IntegerType::class) 
      ->add('tuning') 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'csrf_protection' => false, 
      'data_class'  => 'InstrumentBundle\Entity\Specification\GuitarSpecification' 
     ]); 
    } 
} 

フォームが送信されたときに私の問題は、Specification依頼アレイの一部がエンティティに変換されませんされ、そしてIエラーを取得します。

私はこの問題を解決する方法を見つけることができませんので、ご了承ください。

答えて

0

Doctrine2の継承マッピングを使用して異なる '仕様'の問題を解決することはできません。

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#inheritance-mapping

+0

私はテーブル継承を使用することもできましたが、私は、パフォーマンスへの影響を心配していました。 – Elorfin

+0

あなたの '$ form-> add(' specification '、' InstrumentBundle \\ Form \\ Specification \\ '。$接頭辞、' SpecificationType '); '' '$ form-> add(' specification '、EntityType :: class、array(' class '=>' InstrumentBundle:Specification \ '$プレフィックス' 'SpecificationType' '"いいえ? – lemairep

+0

EntityTypeは既存のエンティティを選択します。埋め込みフォームを使用して新しいものを作成/更新します。 – Elorfin

関連する問題