Да.Ответом были вложенные CollectionType
формы и пользовательский конструктор запросов в окончательной форме (по какой-то причине он вызывал все Variant
объекты в БД, а не использовал объекты, связанные с проанализированным VariantGroup
объектом:
Основная форма продукта
class ComplexProductType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Render the variant sets based on the parsed product
$builder
->add('variantSets', CollectionType::class, [
'entry_type' => VariantSetComplexProductType::class,
'label'=> false,
'by_reference' => true,
] );
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
"data_class" => Product::class,
));
}
}
Отобразить продукты Наборы вариантов: (чтобы получить правильный VariantGroups
, связанный с основнымпродукты VarianSet
объекты)
class VariantSetComplexProductType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Render the groups based on the Variant sets
$builder
->add( 'label' )
->add( 'variantGroups', CollectionType::class, [
'entry_type' => VariantGroupComplexProductType::class,
'label'=> false,
'by_reference' => true
] )
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults( [
'data_class' => VariantSet::class,
] )
;
}
}
Отображение наборов вариантов VariantGroups
с его Variants
в выпадающем списке:
Выпадающий списокVariant
объекты должны быть выполнены в FromEvent
с использованием параметров query_builder
, так как в противном случае у меня возникла проблема, когда все объекты Variant
вызывались в БД.
Там должно бытьпроверка, чтобы убедиться, что только правильные Variant
объекты были вызваны на основе проанализированного VariantGroup
.
class VariantGroupComplexProductType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Render the drop downs based on the Parsed variant group
$builder
->add( 'label' )
// Rendering of the drop down must be done after the previous form data is available
->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'preSetData']);
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults( [
'data_class' => VariantGroup::class,
] );
}
public function preSetData(FormEvent $event)
{
$form = $event->getForm();
/** @var VariantGroup $child */
$child = $event->getData();
$form
->add('variants', EntityType::class, array(
'class' => Variant::class,
'by_reference' => true,
'query_builder' => function (EntityRepository $er) use ( $child ) {
return $er->createQueryBuilder('u')
->where('u.variant_group = :variant_group')
->setParameter('variant_group', $child )
->orderBy('u.label', 'DESC');
},
'choice_label' => 'label',
));
}
}