Symfony CollectionType -> EntryType -> 带参数的表单

Posted

技术标签:

【中文标题】Symfony CollectionType -> EntryType -> 带参数的表单【英文标题】:Symfony CollectionType -> EntryType -> Form with params 【发布时间】:2022-01-01 19:48:37 【问题描述】:

我有两个表单,第一个允许我添加项目ProjectType,第二个是允许向项目添加贡献者的表单ProjectContactType

在第一种形式中,我得到带有解析器的实体公司

public function buildForm(FormBuilderInterface $builder, array $options): void

    $builder
        ->add('name', TextType::class)
        ->add('projectContacts', CollectionType::class, [
            'label' => false,
            'entry_type' => ProjectContactType::class,
            'by_reference' => false,
            'allow_add' => true,
            'allow_delete' => true,
        ]);


public function configureOptions(OptionsResolver $resolver): void

    $resolver
        ->setDefaults([
            'data_class' => Project::class,
        ])
        ->setRequired([
            'company',
        ]);

我希望能够在我的第二种形式中接收同样的实体。

public function buildForm(FormBuilderInterface $builder, array $options): void

    $builder
        ->add('user', EntityType::class, [
            'placeholder' => 'Choisir un client',
            'required' => true,
            'class' => User::class,
            'choice_label' => function (User $user) 
                return $user->getFirstName() . " " . $user->getLastName();
            
        ]);


public function configureOptions(OptionsResolver $resolver): void

    $resolver
        ->setDefaults([
            'data_class' => ProjectContact::class,
        ]);

我的目标是能够按公司实体过滤用户。 谢谢。

【问题讨论】:

【参考方案1】:

您应该能够像这样将 ProjectType 的公司传递给 ProjectContactType:

在 ProjectContactType 中制作所需的公司:

public function configureOptions(OptionsResolver $resolver): void

    $resolver
        ->setDefaults([
            'data_class' => ProjectContact::class,
        ])
        ->setRequired([
            'company',
        ]);

然后(在 ProjectType 中)将公司从 ProjectType 的选项传递给 ProjectContactType:

public function buildForm(FormBuilderInterface $builder, array $options): void

    $builder
        ->add('name', TextType::class)
        ->add('projectContacts', CollectionType::class, [
            'label' => false,
            'entry_type' => ProjectContactType::class,
            'by_reference' => false,
            'allow_add' => true,
            'allow_delete' => true,
            'entry_options' => [
                'company' => $options['company'], 
            ],
        ]);

【讨论】:

以上是关于Symfony CollectionType -> EntryType -> 带参数的表单的主要内容,如果未能解决你的问题,请参考以下文章

Symfony5 handleRequest 更新原始 collectionType 对象

Symfony 表单 - 在 CollectionType 中的子条目类型中访问实体

Symfony 4.4如何使用collectionType从0个字段开始

Symfony 4 表单 CollectionType:仅使新行需要 FileType 元素

Select2 与 collectionType - Symfony2

Symfony2.8 表单 CollectionType 字段 manyTo many