为用户设置奏鸣曲的编辑形式管理员
我正在使用Symfony 2.1作为项目。我使用FOSUserBundle管理用户& SonataAdminBundle以管理使用情况。为用户设置奏鸣曲的编辑形式管理员
我有一些问题:
作为管理员,我想在用户编辑表单用户设置的角色。我如何才能访问
role_hierarchy
中的角色?我如何将它们用作选择字段,以便管理员可以为用户设置角色?-
当我查看列表中的角色,它显示为字符串是这样的:
[0 => ROLE_SUPER_ADMIN] [1 => ROLE_USER]
我怎么能改成这样?
ROLE_SUPER_ADMIN, ROLE_USER
我的意思是,只有数组的值。
,我发现我的第一个问题的答案(但第二个在还未回答..) 我configureFormFields
功能添加的角色象下面这样:!
protected function configureFormFields(FormMapper $formMapper) {
//..
$formMapper
->add('roles','choice',array('choices'=>$this->getConfigurationPool()->getContainer()->getParameter('security.role_hierarchy.roles'),'multiple'=>true));
}
我会很幸福,如果有人回答了第二个问题:)
至于我在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')
谢谢你的回答对我来说非常有用。当我渲染角色时,该列现在被称为'rolesAsString',是否有一些方法可以重命名为“角色”? – 2015-03-05 18:56:17
第二个答案如下。 在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')
希望这将解决您的问题
基于@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;
}
看到它在行动:
罗曼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已经张贴此修复程序在评论
只是为了夸大了一点,这是我的增强罗曼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))"
]
我知道它的很多代码,这是可以做到更好,但也许它可以帮助别人,也可以至少使用该代码段。
/**
* 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)));
}
这导致值被存储为整数而不是字符串。我相信'角色'应该是一串字符串。 – 2014-06-09 19:33:13
@JasonHanley你是对的,当用户重新登录时它不起作用,因此他总是获得最不重要的角色。不应该接受答案。 – 2015-05-07 14:43:26
虽然我认为这是最有趣的答案。 – 2015-05-07 14:54:47