Symfony 5 - 带有 TextType 的自定义 ChoiceType

Posted

技术标签:

【中文标题】Symfony 5 - 带有 TextType 的自定义 ChoiceType【英文标题】:Symfony 5 - Custom ChoiceType with TextType 【发布时间】:2020-12-10 14:51:09 【问题描述】:

在 Symfony 5 中,我在表单中有一个 ChoiceType,我有 2 个选择。我想在你可以写你想要的东西的地方放一个“其他”选择。 我尝试在选项中添加一个 TextType。

提前致谢

->add('projectType', ChoiceType::class,[
                'label' => 'Votre projet concerne : ',
                'choices' => [
                    'Maison' => 'Maison',
                    'Appartement' => 'Appartement',
                ]
            ])

你知道如何将 TextType 添加到我的 ChoiceType 中吗?

【问题讨论】:

不确定你能做到这一点。但是当用户选择“其他”时,您可以显示其他文本字段 【参考方案1】:

这并不容易,但您可以使用自定义表单类型字段和 Twig 主题:

1.创建一个新的字段类型,如ChoiceInputType。该类应包含两种字段类型,ChoiceType 和 TextType。

/**
 * Class ChoiceInputType
 */
class ChoiceInputType extends AbstractType

    /**
     * @inheritdoc
     */
    public function buildForm(FormBuilderInterface $builder, array $options): void
    
        $builder
            ->add(
                'choiceType',
                ChoiceType::class,
                [
                    'required' => false,
                    'choices'  => $options['choices'],
                    'label' => 'Make your choice...',
                ]
            )
            ->add(
                'choiceInput',
                TextType::class,
                [
                    'required' => false,
                    'label'    => false,
                    'attr'     => [
                        'placeholder' => 'Other choice...',
                    ],
                ]
            );
    

    /**
     * @inheritdoc
     */
    public function buildView(FormView $view, FormInterface $form, array $options): void
    
        $view->vars['choices'] = $options['choices'];
    

    /**
     * @inheritdoc
     */
    public function configureOptions(OptionsResolver $resolver): void
    
        $resolver->setRequired(['choices']);

        $resolver->setDefaults(
            [
                'choices' => [],
            ]
        );
    

    /**
     * @inheritdoc
     */
    public function getName(): string
    
        return 'choiceInputType';
    

2.在您的新自定义字段类型上创建twig theme 并根据需要对其进行组织。

% block choiceInputType_widget %
    ... custom here ...
% endblock %

3.在表单中使用新的ChoiceInputType

$builder->add(
     'choiceInputType',
     ChoiceInputType::class,
         [
            'mapped'  => false,
            'block_prefix' => 'choiceInputType',
            'label'   => false,
            'choices' => [
                'test 1' => 1,
                'test 2' => 2,
                'test 3' => 3,
             ]
          ]
  );

这里有一些与此主题类似的其他问题的链接,可以帮助您:

Symfony Forms: html5 datalist Customize the rendering of a choice/entity field in Symfony2

【讨论】:

以上是关于Symfony 5 - 带有 TextType 的自定义 ChoiceType的主要内容,如果未能解决你的问题,请参考以下文章

Symfony ArrayCollection

Symfony 2 - 为 EntityType 定义选定的值

symfony如何知道从表单中使用哪个实体

Select2 与 collectionType - Symfony2

Symfony 5 作曲家更新失败并带有安全检查器

带有新身份验证方法的 Symfony 简单登录表单不起作用