Проверьте, есть ли у пользователя роль

46

Как я могу проверить, есть ли у пользователя определенная роль?

Я нашел это, но это для Drupal 6.

giorgio79
источник

Ответы:

87

Поскольку вы уже нашли этот пост , обязательно прочитайте комментарии. Это ясно объясняет, почему проверка на разрешение рекомендуется вместо проверки на роль. Когда вы используете разрешения, вы можете назначить это разрешение нескольким ролям, что делает вашу систему более гибкой. Кроме того, помните, что роли могут быть переименованы, что может нарушить ваш код.

Тем не менее, если вы хотите проверить роль, вы можете сделать это:

// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role.
if (in_array('editor', $user->roles)) {
  // do fancy stuff
}
marcvangend
источник
1
Что делать, если я хочу проверить более 1 роли. Например, если «редактор» или «издатель», чем делать причудливые вещи. Как кодировать Посоветуйте, пожалуйста. Не могу понять, на самом деле.
Адамтан
8
Пожалуйста, прочитайте ответ: не рекомендуется проверять роль (или более одной). Вместо этого проверьте разрешения. Остальная часть вашего вопроса (объединение двух условий в операторе if) - это базовый PHP, не связанный с Drupal. Прочитайте документацию PHP по логическим операторам .
marcvangend
11

Чтобы проверить, имеет ли текущий пользователь одну или несколько ролей, отличный способ сделать это:

//can be used in access callback too
function user_has_role($roles) {
    //checks if user has role/roles
    return !!count(array_intersect(is_array($roles)? $roles : array($roles), array_values($GLOBALS['user']->roles)));
};

if (user_has_role(array('moderator', 'administrator'))) {
  // $user is admin or moderator
} else if(user_has_role('tester')){
  // $user is tester
} else{
  // $user is not admin and not moderator
}
Садананд Кенганал
источник
9

Обновление для версии Drupal> = 7.36

Вы можете использовать функцию user_has_role из API Drupal https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 .

Попробуйте этот пример:

<?php
function MYMODULE_foo() {
  $role = user_role_load_by_name('Author');
  if (user_has_role($role->rid)) {
    // Code if user has 'Author' role...
  }
  else {
    // Code if user doesn't have 'Author' role...
  }

  $user = user_load(123);

  if(user_has_role($role->rid, $user)) {
    // Code if user has 'Author' role...
  }
  else {
    // Code if user doesn't have 'Author' role...
  }
}
?>
Marcin
источник
2

Вы можете установить модуль devel и сделать dpm ($ user). Это напечатает массив со всей пользовательской информацией, включая роль пользователя.

Из этого массива вы можете найти положение массива «role» и использовать его в своем модуле для поиска роли пользователя.

Субраманский харихаран
источник
В разделе Разработка-> Выполнить код PHP введите: global $ user; пм ($ пользователю);
Diamondsea
1

Чтобы быть защищенным от будущего в случае изменения имени роли, лучше всего проверить идентификатор роли (rid), который можно найти в таблице ролей в базе данных.

Если вы хотите проверить роль с помощью rid 16, выполните:

// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role, when 'editor' has role id 16
if (array_key_exists(16, $user->roles)) {
  // do fancy stuff
}
Ханс Россель
источник
1
На самом деле, когда вы переносите такие вещи, как роли, имя машины, вероятно, будет сохранено, а ID
Mołot
В таблице ролей нет имени машины, только имя человека и человека. Таблица users_roles назначает uid риду.
Ханс Россель
1

Вот фактический код из комментария, который упоминается в принятом ответе как лучшая практика

<?php
  function mymodule_perm() {
    return array('access something special');
  }

  function dosomethingspecial() {
    // For current user
    if (user_access('access something special')) {
      // Doing something special!
    }

    // For a specific user
    if (user_access('access something special', $theuser)) {
      // Doing something special!
    }
  }
?>
Эрик Джонсон
источник
0

Вы можете проверить роль пользователя с помощью print_r ($ user), и в результате вы получите что-то вроде этого

stdClass Object
(
    [uid] => 0
    [hostname] => :: 1
    [role] => Массив
        (
            [1] => анонимный пользователь // Моя текущая роль является анонимной, в вашем случае она может отличаться
        )
акаш бхавра
источник
0

чтобы проверить, есть ли у пользователя определенная роль:

function test_role(){
   global $user;
   if(isset($user->roles['my_role'])){
     return true;
   }
   else {
    return false;
 }
}
houmem
источник
0
global $user;
$roleid = 123; //
if(user_has_role($roleid, $user)) {
//yes this user has this role
}
Адал
источник
0

Вышеуказанные ответы не сработали, не верный путь, я нашел этот пост и код должен быть `

// Проверяем, есть ли у $ user роль администратора. if (in_array ('administrator', array_values ​​($ user-> role))) {// Сделать что-то. }?> `

pinueve
источник