用户角色的双列表框 CollectionType/ChoiceType

Double listbox with CollectionType/ChoiceType for user roles

使用 Symfony 4,我没有这个问题:一个简单的表单来选择或编辑带有列表框的用户的角色。

因为我在编辑用户配置文件时使用 Symfony 5(使用相同的代码)开始了一个新项目,所以我有一个像这样的双列表框:

Form example

用户表单类型的一部分:

$roles = [User::USER_DEFAULT => 'Simple User',
            User::USER_ADMIN_APP => 'App. Admin',
            User::USER_ADMIN_PROJECT => 'Project Admin',
            User::USER_ADMIN => 'Administrator'];

$builder->add('username')
            ->add('roles', CollectionType::class, [
                'label' => 'Roles', 'required' => true, 'entry_type' => ChoiceType::class,
                'entry_options' => ['label' => false, 'choices' => array_flip($roles)],])
            ->add('password')
            ->add('email')
            ->add('save', SubmitType::class);

在数据库中,我有一个经典的 json 用户角色格式

#[ORM\Column(type: 'json')]
private $roles = [];

我创建的夹具中的一些数据:

Database

我在此页面中创建了一个 GitHub 新示例:form-tests-with-CollectionType

我知道,我错过了一些东西,但是什么??我应该使用 Data Transformers 还是 Mappers 只有一个列表框选择

谢谢你的灯。 ;)

2022-05-04 更新:

从我的旧 SF4 项目到新的 SF5 项目,Roles 字段的唯一变化是 Doctrine 中的“Array”到“Json”:

//Migration file with "Json"
roles CLOB NOT NULL --(DC2Type:json)

//Migration file with "Array"
roles CLOB NOT NULL --(DC2Type:array)

现在,我在数据库中为“数组”的角色字段创建了一种新格式:

a:1:{i:0;s:14:"ROLE_ADMIN_APP";}

在使用“Json”之前,我在夹具“ROLE_USER”中的错误:

["ROLE_USER","ROLE_ADMIN_APP"]

通过此更改,我有一个列表框,用户只有一个选择:

<select id="user_roles_0" name="user[roles][0]">
   <option value="ROLE_USER">Simple User</option>
   <option value="ROLE_ADMIN_APP">App. Admin</option>
   <option value="ROLE_ADMIN_PROJECT" selected="selected">Project Admin</option>
   <option value="ROLE_ADMIN">Administrator</option>
</select>

最后,我可以创建或编辑具有多个角色的 CollectionType 和 ChoiceType 的用户...

希望它能像我一样对以后的 devs/noob 有所帮助 ;)

干杯!

你可以试试这个:

$roles = [
    'Super Admin' => 'ROLE_SUPER_ADMIN',
    'Admin' => 'ROLE_ADMIN',
    ...
];

$builder->add('roles', ChoiceType::class, [
    'label' => 'form.label.role',
    'choices' => $roles,
    'required' => true,
    'multiple' => true,
    'expanded' => false
]);

我的 key => value 被颠倒了,我直接使用 ChoiceType。