用户角色的双列表框 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。
使用 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。