[英]set role for users in edit form of sonata admin
我正在使用Symfony 2.1進行項目。 我使用FOSUserBundle管理用戶和SonataAdminBundle管理用法。
我有一些問題:
作為管理員,我想在用戶編輯表單中設置用戶角色。 如何訪問role_hierarchy
角色? 我如何將它們用作選擇字段,以便管理員可以為用戶設置角色?
當我在列表中顯示角色時,它顯示為如下字符串:
[0 => ROLE_SUPER_ADMIN] [1 => ROLE_USER]
我該如何改變它呢?
ROLE_SUPER_ADMIN, ROLE_USER
我的意思是,只有數組的值。
根據@parisssss的答案雖然這是錯誤的,但這是一個有效的解決方案。 如果您保存一個角色,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;
}
看到它的實際效果:
至於第二個問題,我在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);
}
然后你可以在configureListFields
函數中聲明:
->add('rolesAsString', 'string')
我找到了第一個問題的答案!(但第二個問題尚未解答..)我在configureFormFields
函數中添加如下角色:
protected function configureFormFields(FormMapper $formMapper) {
//..
$formMapper
->add('roles','choice',array('choices'=>$this->getConfigurationPool()->getContainer()->getParameter('security.role_hierarchy.roles'),'multiple'=>true ));
}
如果有人回答第二個問題我會很高興:)
Romain 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已在評論中發布此修復程序
只是為了誇大它,這是我的Romain Bruckert和Sash的增強版本,它給你一個這樣的數組:
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)));
}
第二個答案如下。 在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')
希望這能解決你的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.