Forms 以Symfony4形式将实体对象值传入嵌套的CollectionTypes
概述:在Forms 以Symfony4形式将实体对象值传入嵌套的CollectionTypes,forms,e-commerce,symfony4,many-to-one,Forms,E Commerce,Symfony4,Many To One,概述:在产品中的每个变量组变量集我需要创建一个包含变量组变量的下拉列表,格式为Symfony 详细信息: 我有一个产品实体,它作为一个多个关系关联到多个变量集对象。VariantSet对象包含多个VariantGroup对象,每个对象都需要生成一个下拉列表来显示其Variant选择 对于嵌套的CollectionTypes,我只需要访问与父CollectionType相关的选项 因此,唯一可用的变体应与变体组相关,后者仅与与最初解析的产品相关的可用变体集相关 有一些信息指向使用查询生成器仅获取相
产品中的每个变量组
变量集
我需要创建一个包含变量组
变量
的下拉列表,格式为Symfony
详细信息:
我有一个产品
实体,它作为一个多个
关系关联到多个变量集
对象。VariantSet
对象包含多个VariantGroup
对象,每个对象都需要生成一个下拉列表来显示其Variant
选择
对于嵌套的CollectionTypes
,我只需要访问与父CollectionType
相关的选项
因此,唯一可用的变体
应与变体组
相关,后者仅与与最初解析的产品
相关的可用变体集
相关
有一些信息指向使用查询生成器仅获取相关项,但我想知道这是否是最佳实践。另外-我如何传递前面的表单(因此在VariantGroup
的嵌套CollectionType
中获取顶级Product
,因为VariantSets
位于这两者之间)
在Symfony表单中使用最佳实践是否可以实现这一点
所需输出的示例是。答案是嵌套的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,
));
}
}
呈现产品变量集:(获取与主要产品变量集
对象关联的正确变量组
)
在下拉列表中呈现变量集variantGroup
及其Variants
:
Variant
对象的下拉需要使用query\u builder
选项在FromEvent
中完成,否则我会遇到在DB中调用所有Variant
对象的问题
需要进行检查,以确保基于解析的VariantGroup
只调用了正确的Variant
对象
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',
));
}
}
我将使用多个嵌套的CollectionTypes
,以EntityType
作为下拉列表。感谢您的否决投票,但反馈为什么这是一个糟糕的问题,或者需要什么来帮助其他人回答此问题,这将真正有助于创建更具体、更合适的问题。。
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',
));
}
}