Symfony 表单 - 内部带有复选框的集合类型

Posted

技术标签:

【中文标题】Symfony 表单 - 内部带有复选框的集合类型【英文标题】:Symfony Form - Collection Type with Checkboxes inside 【发布时间】:2020-07-18 00:33:02 【问题描述】:

我正在使用 Symfony 5,我想在管理中有一个“用户编辑”页面,我将在其中更改用户角色,我想有复选框来定义分配给用户的角色,因此,我需要 Collection在里面输入 CheckboxType 条目(如果我是真的),但首先我不能使用用户角色数组作为集合类型的值

$builder
        ->add('roles', CollectionType::class, [
            'entry_type' => CheckboxType::class,
            'entry_options' => [
                'required' => false,
            ],
        ])

这会引发错误

无法转换属性路径“[0]”的值:应为布尔值。

之后,我尝试使用模型转换器来更改值,下面是我如何做到的代码

$builder->get('roles')
        ->addModelTransformer(new CallbackTransformer(
            function($rolesAsArray)
                $rolesAsArray = array_flip($rolesAsArray);
                foreach($rolesAsArray as &$role)
                    $role = true; // I also tried to set key instead of value - true
                
                return $rolesAsArray;
            ,
            function($rolesAsString)
                dump($rolesAsString);die;
            
        ));

在此之后,我没有收到错误,但我得到了具有这种外观的表单

所以我没有任何更改标签的选项,即使我提交包含这些字段的表单也会引发错误

在属性路径“roles”处给出“array”、“null”类型的预期参数。

我找到了一种使用 Select Box 的方法,但我找不到任何使用 Checkbox 的方法。

如果你有什么想法,请告诉我。

【问题讨论】:

【参考方案1】:

您可以使用 ChoiceType :

$builder->add('roles', ChoiceType::class, array(
                'label' => 'form.label.role',

                'choices' => User::ROLES,
                'choice_translation_domain' => 'user',
                'multiple'  => true,
                'expanded' => true,
                'required' => true,
                ));

在用户实体中:

const ROLES = array(
    'roles.admin' => 'ROLE_ADMIN',
    'roles.secretary' => 'ROLE_SECRETARY',
    'roles.user' => 'ROLE_USER'
);

【讨论】:

不,我需要多个角色,用我已经做过的选择框,这并不难,问题是复选框有这个功能 当您将 ChoiceType 与 multiple=true 和 expand=true 一起使用时,您有多个带复选框的角色,我将它用于我的用户角色

以上是关于Symfony 表单 - 内部带有复选框的集合类型的主要内容,如果未能解决你的问题,请参考以下文章

带有URL的Symfony 4表单复选框,标签中的标签

Symfony 集合表单控制器问题

带有两个提交按钮的 Symfony 2 表单

Symfony 渲染一个集合表单类型原型

内部带有 jQ​​uery 对话框的表单不提交

symfony2 中的复选框验证