2016-04-01 31 views
1

İçinde yerleşik bir form bulunan karmaşık bir form oluşturmaya çalışıyorum.Symfony form sunulması İstek dizisini Varlığa dönüştürmez

Formun aynı anda 2 varlık oluşturması/değiştirmeniz gerekiyor: Instrument ve Specification.

formu problemi açıklayan önce bazı önemli bilgiler: Specification hep aynı sınıf olmadığı için bu iki varlık arasında hiçbir doktrin ilişki yoktur

olduğunu. Örneğin, Instrument bir gitarsa, cihaz GuitarSpecification ise, cihaz bir kayıt cihazı ise, sınıf RecorderSpecification'dur.

Doktrin ilişkisi bu tür işleyemez, bu yüzden elle yönetmek:

  • varlık yüklenir
  • Specification ilişkili alıcı/ayarlayıcı ile bir özellik specification olarak Instrument varlık çıkarıldı, kalıcı Doctrine Events aracılığıyla Instrument ile aynı zamanda.

Enstrüman için kök formu (ışık versiyon) 'dir:

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 (gitar türünü kontrol olay dinleyicileri (PRE_SET_DATA ve POST_SUBMIT) vardır bu formun yalnız karmaşıklığı olduğunu Kaydedici, vb.) ve doğru Specification formunu (GuitarSpecification, RecorderSpecification, vb.) ekleyin. İşte

benim Specification form türü birinin bir örnek:

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' 
     ]); 
    } 
} 

Benim sorunum form gönderildiğinde, Specification talebi dizinin parçası Varlık dönüştürülür ve ben değil mi bir hatayı edin:

Expected argument of type "InstrumentBundle\Entity\Specification\AbstractSpecification", "array" given 

Bunu çözmenin bir yolunu bulamıyorum, bu nedenle herhangi bir fikir açığız.

cevap

0

Sadece bir soru, farklı 'şartname' sorununuzu, Doctrine2 miras eşlemesiyle çözmek mümkün değil mi?

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

+0

ben Tablo Kalıtım kullanmış olabilir, ama performans etkisi hakkında endişeliydi. – Elorfin

+0

satırınız '$ form-> add (' şartname ',' InstrumentBundle \\ Form \\ Spesifikasyon \\ '. $ Önek.' SpecificationType '); "olmalıdır" $ form-> add ('specification', EntityType :: class, array ('class' => 'InstrumentBundle: Specification \'. $ öneki. 'SpecificationType' '"no? – lemairep

+0

EntityType yalnızca izin verir varolan Varlıklar içine seçin.İsteğe bağlı bir form ile yeni bir tane oluşturmak/güncelleştirmek istiyorum: – Elorfin