我正在为我的网站开发管理面板,其中一部分是管理用户。我正在使用FOSUserBundle完成这些任务。
我正在使用表单的自定义模板(AdminLTE),并且在添加新表单时,我无法为用户选择角色添加下拉列表。
在UserType.php
$builder->add('roles', 'choice', array(
'label' => 'User Role',
'choices' => $this->roleHelper->getRolesForForm()
));
在WCB\SaleBundle\Helper\RoleHelper.php
...
public function getRolesForForm()
{
$roleList = self::flatArray($this->rolesHierarchy);
$roles = array();
foreach ($roleList as $roleId => $roleName) {
if ($roleId == 'ROLE_ADMIN') {
$roles[$roleName] = 'Admin';
}
if ($roleId == 'ROLE_USER') {
$roles[$roleName] = 'User';
}
}
return $roles;
}
...
以上getRolesForForm()
函数将返回此数组,这是与Symfony的choice
字段类型一起使用的正确格式:
Array
(
[ROLE_ADMIN] => Admin
[ROLE_USER] => User
)
表单不再有效,除了这个例外:
The value of type "array" cannot be converted to a valid array key.
当我将'multiple' = true
添加到表单构建器时,它可以正常工作,但它不是下拉列表。它的HTML选择框允许多个选择。
$builder->add('roles', 'choice', array(
'label' => 'User Role',
'choices' => $this->roleHelper->getRolesForForm(),
'multiple' => true
));
我认为,对于角色选择,它应该是一个下拉列表,而不是一个多选框。我怎样才能做到这一点?我的代码有什么问题吗?谢谢:))
答案 0 :(得分:0)
我认为它确实应该是一个多选框。 考虑到用户可以(通常会)拥有多个角色。在您的情况下,具有ROLE_ADMIN的用户也具有ROLE_USER(ROLE_ADMIN"如果您使用FOSUserBundle,则包括" ROLE_USER)。
答案 1 :(得分:0)
不确定这是否可能是问题,因为我没有完整的代码,我不确定self::flatArray($this->rolesHierarchy)
返回的是什么,但请注意您使用的是$roleName
,而不是$roleId
作为您的数组键。如果$roleName
不是字符串,那么您将遇到此问题。
答案 2 :(得分:0)
我最近遇到了同样的问题,这是我的工作(我创建了DataTransformer):
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
...
$builder->get('roles')->addModelTransformer(new RolesTransformer());
}
}
和DataTransformer类:
use AppBundle\Entity\User;
use Symfony\Component\Form\DataTransformerInterface;
class RolesTransformer implements DataTransformerInterface
{
public function transform($roles)
{
foreach ($roles as $role) {
if ($role !== User::ROLE_DEFAULT) {
return $role;
}
}
return $roles[0];
}
public function reverseTransform($string)
{
return [
$string, User::ROLE_DEFAULT
];
}
}
答案 3 :(得分:0)
FOSUserBundle的UserModel的角色属性需要一个数组。如果您使用选择法线,则他们不会返回数组。