İç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 özellikspecification
olarakInstrument
varlık çıkarıldı, kalıcı Doctrine Events aracılığıylaInstrument
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
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.
ben Tablo Kalıtım kullanmış olabilir, ama performans etkisi hakkında endişeliydi. – Elorfin
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
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