欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

根据角色 role 的访问权限 d7 drupal7 drupal 7 access callback by roles 角色 我们使用 access callback 不使用 access arguments 有大用 有大大用 有大大大用

3个


  可以看看   /node-admin/13271


我正在尝试为特定菜单项的每个角色实现访问回调,但其他角色也可以查看该菜单项。欢迎任何提示。

/**
 * Implements hook_menu();
 */
function MODULENAME_menu() {
  global $user;
  $items['admin/backoffice/production/taxonomie'] = array(
    'title' => 'Taxonomie',
    'type' => MENU_LOCAL_TASK,
    'weight' => 0,
    'page callback' => 'MODULENAME_backoff_taxonomy',
    'access callback' => 'MODULENAME_user_has_role',   
    'access arguments' =>  array($user, array('éditeur taxonomie', 'administrator')),
    );
  return $items;
}

function MODULENAME_backoff_taxonomy(){
  module_load_include('inc', 'taxonomy', 'taxonomy.admin');
  $form = drupal_get_form('taxonomy_overview_vocabularies');
  drupal_set_title('Backoffice - Taxonomie');
  return drupal_render($form);
}

function MODULENAME_user_has_role($user,$roles) { 
  foreach ($roles as $role) {
    if (in_array($role, $user->roles)) {
      return TRUE;
    }
  }
  return FALSE; 
}





我的做法  有大用

function custom_twenty_one_modify_pwd_menu()
{    
   $items['es_ad_modify_my_pwd'] = array(
       'title' => '嘉善es人员修改AD密码',
       'page callback' => 'custom_twenty_one_modify_pwd_es_ad_modify_my_pwd',
       'access callback' => '_user_has_role',
       'access arguments' => array(array('es角色')),
//        'access arguments' => array('create wp_blog_clone_1 content'), //创建博客内,,就相当于是 es 人员的角色 权限吧!
   );
   return $items;
}


function _user_has_role($roles)  //这里 $roles 就是 access arguments 对应的数组的值,即  array('es角色')  
{
   
if (user_is_logged_in()) {
       
global $user;
       
if (in_array('administrator', $user->roles)) {
           
return TRUE;
       }
       
foreach ($roles as $role) {
           
if (in_array($role, $user->roles)) {
               
return TRUE;
           }
       }
   }
   
else {
       
return FALSE;
   }
}



2 个回答  正确答案 

2个

要让一个人access callback处理动态数量的角色,每个菜单链接都不同,请在hook_menu()...中尝试这样的事情

// hook_menu()
$items['foo'] = array(
  /* ... */
  'access callback' => 'MODULENAME_user_has_role',   
  'access arguments' =>  array('éditeur taxonomie', 'administrator'),
);
$items['bar'] = array(
  /* ... */
  'access callback' => 'MODULENAME_user_has_role',   
  'access arguments' =>  array('some other role'),
);

然后你的access callback实现:

function MODULENAME_user_has_role() { 
  global $user;
  $roles = func_get_args();
  foreach ($roles as $role) {
    if (in_array($role, $user->roles)) {
      return TRUE;
    }
  }
  return FALSE; 
}

应该这样做。

一些选择

从 中删除global $useraccess argumentshook_menu()

然后将您的access callback函数实现更改为:

function MODULENAME_user_has_role() { 
  global $user;
  $roles = array('éditeur taxonomie', 'administrator');
  foreach ($roles as $role) {
    if (in_array($role, $user->roles)) {
      return TRUE;
    }
  }
  return FALSE; 
}

由于hook_menu()仅在重建菜单路由器时调用(例如,清除缓存,通常由管理员或 drush 完成),因此global $user在该功能中通常不是很有用。相反,一个access callback函数在更合适的时间被调用(即当页面正在被查看时,或者菜单链接将要在菜单中显示[或不]),此时更容易做出关于当前用户的上下文。

为了access callback更通用,并能够处理多个菜单链接路径,我通常会在 an 上使用开关/案例arg()来进一步管理上下文:

switch (arg(3)) {
  case 'taxonomie':
    // do stuff...
    break;
}
1个

我要做的一个小补充是像 D7 的其余部分一样检查 UID = 1。有点晚了,但希望它能对某些人有所帮助。

function MODULE_user_has_role() {
  global $user;
  if ($user->uid == 1) {
    return TRUE;
  }
  $roles = func_get_args();
  foreach ($roles as $role) {
    if (in_array($role, $user->roles)) {
      return TRUE;
    }
  }
  return FALSE;
}

您的答案

来自   https://drupal.stackexchange.com/questions/166237/menu-access-callback-per-role


普通分类: