2013-02-24 118 views
4

我正在使用Symfony 2.1作为项目​​。我使用FOSUserBundle管理用户& SonataAdminBundle以管理使用情况。为用户设置奏鸣曲的编辑形式管理员

我有一些问题:

  1. 作为管理员,我想在用户编辑表单用户设置的角色。我如何才能访问role_hierarchy中的角色?我如何将它们用作选择字段,以便管理员可以为用户设置角色?

  2. 当我查看列表中的角色,它显示为字符串是这样的:

    [0 => ROLE_SUPER_ADMIN] [1 => ROLE_USER] 
    

    我怎么能改成这样?

    ROLE_SUPER_ADMIN, ROLE_USER 
    

    我的意思是,只有数组的值。

回答

2

,我发现我的第一个问题的答案(但第二个在还未回答..) 我configureFormFields功能添加的角色象下面这样:!

protected function configureFormFields(FormMapper $formMapper) { 
    //.. 
$formMapper 
->add('roles','choice',array('choices'=>$this->getConfigurationPool()->getContainer()->getParameter('security.role_hierarchy.roles'),'multiple'=>true)); 
} 

我会很幸福,如果有人回答了第二个问题:)

+0

这导致值被存储为整数而不是字符串。我相信'角色'应该是一串字符串。 – 2014-06-09 19:33:13

+0

@JasonHanley你是对的,当用户重新登录时它不起作用,因此他总是获得最不重要的角色。不应该接受答案。 – 2015-05-07 14:43:26

+0

虽然我认为这是最有趣的答案。 – 2015-05-07 14:54:47

9

至于我在User类,看起来像这样

/** 
* @return string 
*/ 
public function getRolesAsString() 
{ 
    $roles = array(); 
    foreach ($this->getRoles() as $role) { 
     $role = explode('_', $role); 
     array_shift($role); 
     $roles[] = ucfirst(strtolower(implode(' ', $role))); 
    } 

    return implode(', ', $roles); 
} 
012增加了一个方法的第二个问题

然后你就可以在你的configureListFields函数声明:

->add('rolesAsString', 'string') 
+0

谢谢你的回答对我来说非常有用。当我渲染角色时,该列现在被称为'rolesAsString',是否有一些方法可以重命名为“角色”? – 2015-03-05 18:56:17

1

第二个答案如下。 在sonata admin yml文件中添加行。

sonata_doctrine_orm_admin: 
    templates: 
     types: 
      list: 
       user_roles: AcmeDemoBundle:Default:user_roles.html.twig 

user_roles.html.twig文件添加以下行

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %} 

{% block field %} 
    {% for row in value %} 
     {{row}} 
     {% if not loop.last %} 
     , 
     {% endif %} 
    {% endfor %} 
{% endblock %} 

然后进入你的管理控制器和configureListFields功能加入这一行

->add('roles', 'user_roles') 

希望这将解决您的问题

12

基于@parisssss的答案,尽管它是wr ong,这是一个工作解决方案。如果保存一个角色,Sonata输入字段将显示给定角色下的所有角色。

另一方面,在数据库中将只存储最重要的角色。但这在Sf方式中是绝对有意义的。

protected function configureFormFields(FormMapper $formMapper) { 
// .. 
$container = $this->getConfigurationPool()->getContainer(); 
$roles = $container->getParameter('security.role_hierarchy.roles'); 

$rolesChoices = self::flattenRoles($roles); 

$formMapper 
    //... 
    ->add('roles', 'choice', array(
      'choices' => $rolesChoices, 
      'multiple' => true 
     ) 
    ); 

而在另一种方法:

/** 
* Turns the role's array keys into string <ROLES_NAME> keys. 
* @todo Move to convenience or make it recursive ? ;-) 
*/ 
protected static function flattenRoles($rolesHierarchy) 
{ 
    $flatRoles = array(); 
    foreach($rolesHierarchy as $roles) { 

     if(empty($roles)) { 
      continue; 
     } 

     foreach($roles as $role) { 
      if(!isset($flatRoles[$role])) { 
       $flatRoles[$role] = $role; 
      } 
     } 
    } 

    return $flatRoles; 
} 

看到它在行动:

enter image description here enter image description here

+0

该解决方案也适用于配置相同的'configureListFields'方法 – Eddie 2016-05-11 08:04:38

+0

非常好! :-) – 2016-05-11 09:50:48

+0

很酷,刚添加了“foreach($ rolesHierarchy as $ key => $ roles)$ flatRoles [$ key] = $ key;(...)”所以它抓住了所有可用的角色,不仅仅是儿童角色。 – TrtG 2016-05-13 15:12:03

2

罗曼Bruckert的解决方案几乎是完美的,但它不允许设置角色,这是角色层次的根源。例如ROLE_SUPER_ADMIN。 这里的固定方法flattenRoles,这也将返回根角色:

protected static function flattenRoles($rolesHierarchy) 
{ 
    $flatRoles = []; 
    foreach ($rolesHierarchy as $key => $roles) { 
     $flatRoles[$key] = $key; 
     if (empty($roles)) { 
      continue; 
     } 

     foreach($roles as $role) { 
      if(!isset($flatRoles[$role])) { 
       $flatRoles[$role] = $role; 
      } 
     } 
    } 

    return $flatRoles; 
} 

编辑:TrtG已经张贴此修复程序在评论

2

只是为了夸大了一点,这是我的增强罗曼Bruckert和窗扇的版本它给你一个这样的数组:

array:4 [▼ 
    "ROLE_USER" => "User" 
    "ROLE_ALLOWED_TO_SWITCH" => "Allowed To Switch" 
    "ROLE_ADMIN" => "Admin (User, Allowed To Switch)" 
    "ROLE_SUPER_ADMIN" => "Super Admin (Admin (User, Allowed To Switch))" 
] 

enter image description here

这可以帮助你找到所有角色,即包括特定作用: enter image description here

我知道它的很多代码,这是可以做到更好,但也许它可以帮助别人,也可以至少使用该代码段。

/** 
* Turns the role's array keys into string <ROLES_NAME> keys. 
* @param array $rolesHierarchy 
* @param bool $niceName 
* @param bool $withChildren 
* @param bool $withGrandChildren 
* @return array 
*/ 
protected static function flattenRoles($rolesHierarchy, $niceName = false, $withChildren = false, $withGrandChildren = false) 
{ 
    $flatRoles = []; 
    foreach ($rolesHierarchy as $key => $roles) { 
     if(!empty($roles)) { 
      foreach($roles as $role) { 
       if(!isset($flatRoles[$role])) { 
        $flatRoles[$role] = $niceName ? self::niceRoleName($role) : $role; 
       } 
      } 
     } 
     $flatRoles[$key] = $niceName ? self::niceRoleName($key) : $key; 
     if ($withChildren && !empty($roles)) { 
      if (!$recursive) { 
       if ($niceName) { 
        array_walk($roles, function(&$item) { $item = self::niceRoleName($item);}); 
       } 
       $flatRoles[$key] .= ' (' . join(', ', $roles) . ')'; 
      } else { 
       $childRoles = []; 
       foreach($roles as $role) { 
        $childRoles[$role] = $niceName ? self::niceRoleName($role) : $role; 
        if (!empty($rolesHierarchy[$role])) { 
         if ($niceName) { 
          array_walk($rolesHierarchy[$role], function(&$item) { $item = self::niceRoleName($item);}); 
         } 
         $childRoles[$role] .= ' (' . join(', ', $rolesHierarchy[$role]) . ')'; 
        } 
       } 
       $flatRoles[$key] .= ' (' . join(', ', $childRoles) . ')'; 
      } 
     } 
    } 
    return $flatRoles; 
} 

/** 
* Remove underscors, ROLE_ prefix and uppercase words 
* @param string $role 
* @return string 
*/ 
protected static function niceRoleName($role) { 
    return ucwords(strtolower(preg_replace(['/\AROLE_/', '/_/'], ['', ' '], $role))); 
} 
相关问题