无法使用FOSUserBundle创建下拉列表以选择用户角色

时间:2015-10-10 10:34:54

标签: symfony fosuserbundle symfony-2.7

我正在为我的网站开发管理面板,其中一部分是管理用户。我正在使用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
));

我认为,对于角色选择,它应该是一个下拉列表,而不是一个多选框。我怎样才能做到这一点?我的代码有什么问题吗?谢谢:))

4 个答案:

答案 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的角色属性需要一个数组。如果您使用选择法线,则他们不会返回数组。