2

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

上面的函数将返回这个数组,这是与 Symfony 的字段类型getRolesForForm()一起使用的正确格式: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

4 回答 4

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
        ];
    }
}
于 2017-01-19T15:39:51.287 回答
0

FOSUserBundle 的 UserModel 的角色属性需要一个数组。如果您使用选择法线,它们不会返回数组。

于 2017-08-08T18:43:10.550 回答
0

不确定这是否可能是问题,因为我没有您的完整代码并且我不确定self::flatArray($this->rolesHierarchy)返回的是什么,但请注意您使用的是$roleName,而不是$roleId您的数组键。如果$roleName不是字符串,那么您将遇到此问题。

于 2015-10-11T08:13:35.153 回答
0

我认为它确实应该是一个多选框。考虑到用户可以(并且通常会)拥有多个角色。在您的情况下,具有 ROLE_ADMIN 的用户也具有 ROLE_USER(如果您使用 FOSUserBundle,ROLE_ADMIN “包括”ROLE_USER)。

于 2015-10-10T20:41:41.873 回答