Symfony形式:formtype字段的集合不映射

时间:2020-04-25 21:30:45

标签: symfony symfony-forms

考虑以下架构

entityA
{
    entityB [12]
}

entityB
{
    entityC[]
}

entityC
{
   name, defaultValue
}

当创建一个entityA的新对象时,我想列出数据库中的每个entityC,以便能够选择它们并自定义defaultValue,如下所示:

CHECKBOX [x] LABEL name1, INPUT defaultValue1
CHECKBOX [ ] LABEL name2, INPUT defaultValue2
CHECKBOX [x] LABEL name3, INPUT defaultValue3
CHECKBOX [x] LABEL name4, INPUT defaultValue4
etc

...的目的是根据上述选择,在此新的entityA的12个entityB对象的每一个中自动生成entityC对象

->add('categories', CollectionType::class, [
    "mapped" => false,
    'entry_type'    => SharedCategoryType::class
])

使用类别(entityC)作为实体类型不起作用,因为我也想公开默认值。这是SharedCategoryType

class SharedCategoryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('enabled', CheckboxType::class, [
                "mapped" => false
            ])
            ->add('name' , TextType::class) //not a label but not important for now
            ->add('defaultValue' , MoneyType::class); 
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Category::class,
        ]);
    }
}

使用此代码,映射无法正常工作,但我不知道缺少什么...

编辑:我的第一次尝试是这样的:

->add('budgets', EntityType::class, [
            "class" => Category::class,
            "mapped" => false,
            "multiple" => true,
            "expanded" => true
}

但是我不能修改defaultValue字段。它会根据名称自动创建标签(使用我可能定义的__toString方法),但是我找不到如何向暴露的字段中添加defaultValue

1 个答案:

答案 0 :(得分:0)

如果创建相关实体,则可以使用表单事件,例如

public function buildForm(FormBuilderInterface $builder, array $options)
{
  ...
  $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) 
  {
            /** @var ResultModel $model */
            $model = $event->getData();
            $form = $event->getForm();
            if (!$model->getExecutive()) {
                $form->add('executive', EntityType::class, [
                    'class' => BundesligaExecutive::class,
                    'placeholder' => 'bundesliga.executive.choose',
                    'help' => 'bundesliga.executive.help',
                ]);
            } 
...
}

在这里找到更多详细信息https://symfony.com/doc/current/form/dynamic_form_modification.html

顺便说一句,使用selectBox而不是复选框可能是一个更好的主意