Как узнать список доступных значений $ string для функции user_access ($ string)?


27

user_access ($ string, $ account = NULL)

$ string: проверяется разрешение, такое как «администрирование узлов».

Как я могу узнать список доступных значений $ string для user_access()функции?

Ответы:


12

Пока каждый модуль может определять свои собственные разрешения, нет «строгого» списка этих строк. Вам нужно будет «построить» его, если вам действительно нужен такой список программно.

Вы можете запустить этот скрипт на странице / devel / php. (Конечно, вам нужен модуль Devel .)

// Render role/permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  print_r($module);
  // Drupal 6
  // if ($permissions = module_invoke($module, 'perm')) {
  //  print_r($permissions);
  // }

  // Drupal 7
  if ($permissions = module_invoke($module, 'permission')) {
    print_r($permissions);
  }
}

26

Как сказал @Berdir, самый простой способ узнать, какие разрешения доступны, - это перейти к разрешениям admin / people / permissions в Drupal 7.

Проблема, с которой я продолжал сталкиваться, заключается в том, что я никогда не мог понять, какую строку мне нужно было предоставить в качестве «аргумента доступа», чтобы фактически использовать разрешение. Итак, вот как вы можете найти имя строки для разрешений, которые вы хотите использовать (в этом примере используется Google Chrome.)

Первый шаг. Перейдите к admin / people / permissions, найдите разрешение, которое вы хотели бы использовать, и щелкните правой кнопкой мыши по флажку справа от разрешения, которое вы хотите использовать. Выберите «Проверить элемент» или просто посмотрите на источник.

пример

Затем найдите значение флажка и запишите это значение. (В этом случае строка «создать содержимое купона»)

введите описание изображения здесь

Это строка, которую вы должны предоставить в качестве аргумента доступа в hook_menu ()

Пример кода: (не релевантные элементы удалены, не забудьте заголовок, обратный вызов и т. Д. В hook_menu ())

function fsrsys_menu() {
    $items = array();
    $items['my-custom-url'] = array(
        'access callback' => 'user_access',
        'access arguments' => array('create coupon content'),
    );
    return $items;
}

9

Вот версия ответа Haza для D7, модифицированная для использования DSM вместо print_r и для исключения модулей, которые не реализуют hook_permission:

// Render permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  if ($permissions = module_invoke($module, 'permission')) {
    // List only the modules that have permissions.
    dsm($module);
    dsm($permissions);
  }
}

6

Вы можете использовать user_permission_get_modules()функцию, которая возвращает массив всех определенных разрешений и их модулей.

Определите модули, которым принадлежат разрешения.

Возвращаемое значение

Ассоциативный массив в формате $ Права => $ Модуль.


2
Если вы завернете его, array_keys()вы, очевидно, получите только запрошенную информацию. Вы можете также использовать результат user_role_grant_permissions, например , с целью предоставление роли администратора всех разрешений:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
aross

4

Самый простой способ - проверить страницу разрешений (D7: admin / people / permissions, D6: admin / user / permissions). Обратите внимание, что вы напрямую используете отображаемую строку в Drupal 6, для 7 вам нужно взглянуть на имя / значение флажка. Это связано с тем, что разрешения теперь имеют переведенный заголовок и описание в Drupal 7.

Поэтому, если вы хотите указать имя для разрешения «Просмотр опубликованного контента» в Drupal 7, значение «access content» - это имя вашего разрешения.

Если вы знаете, от какого модуля исходит разрешение, вы также можете проверить соответствующую реализацию hook_perm () (D6) / hook_pemission () (D7) этого модуля.

Во многих случаях вы хотите определить свои собственные разрешения и использовать их, вы можете сделать это с помощью описанных выше хуков.


RE: «Самый простой способ - проверить страницу разрешений (D7: admin / people / permissions,).». На странице показан список разрешений, но они представляют собой читаемую человеком строку, а не машиночитаемую строку.
gilzero

1
Как я писал ниже, машиночитаемое имя может быть извлечено из значения любого из флажков для данного разрешения.
Бердир

Этот ответ охватывает Drupal 6 и 7, принятый только Drupal 6 - но принятый ответ - изящный трюк, который можно легко изменить для Drupal 7. =)
Грег,

4

Использование модуля Devel

  • После установки и включения модуля Devel перейдите к admin/config/development/devel. Существует настройка под названием «Отображать имена компьютеров для разрешений и модулей». Будьте уверены, что проверено.

  • Теперь на странице разрешений people/permissionsнаведите указатель мыши на название разрешения, которое вы запрашиваете. Это может задержать секунду или две, но тогда появится строковое значение.


Вау, я не знал об этом. Увидел это после того, как я опубликовал свой ответ. Благодарность!
Батандва

Очень полезный! TYVM.
DrCord

Сладко, намного проще, чем открыть код модуля!
bloke_zero

1

Вот простое изменение формы, которое добавит ключ доступа к имени на странице разрешений. Это должно облегчить поиск. Вам нужно будет добавить его в пользовательский модуль и заменить «mymodule» на имя этого модуля.

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_user_admin_permissions_alter(&$form, $form_state) {
  foreach ($form['permission'] as $key => &$item) {
    if (isset($item['#type']) && $item['#type'] == 'item') {
      $item['#markup'] .= ' (' . $key . ')';
    }
  }
}

1

Я создал этот фрагмент JavaScript, который помогает мне в этом. Я тестировал его в Drupal 7 только на тему Shiny .

Он в основном выводит имя машины, взятое из первого флажка этого имени, в первую ячейку под меткой. Скрипт опирается на jQuery, что не должно быть проблемой в Drupal 7.

Обычно я вставляю его в консоль Developer Tools и запускаю оттуда. Я мог бы создать букмарклет для этого в будущем.

// Go through each of the rows on the permissin table
rows = jQuery('#permissions tr');
rows.each(function() {
    // Get the first checkbox in the row.
    checkbox = jQuery('.checkbox .form-checkbox', this).first();
    // Get the first cell, containing the permission label.
    nameCell = jQuery('td:first-child', this);
    // In case this is not a permission row
    if(checkbox.length == 0) {
        return;
    }

    // Embed the permission maching name on permission label cell.
    nameCell.append("<div><code>" + checkbox.val() + "</code></div>");
});

А благодаря сервису Bookmarkify.it вы можете найти букмарклет здесь .
Батандва

Это действительно полезный инструмент, ты!
DrCord



0

просто загляните в какой-нибудь модуль, вы увидите права доступа к машине в / admin / people / permissions

function YOURMODULE_form_user_admin_permissions_alter(&$form, &$form_state) 
{
    $perms = &$form['permission'];

    $group_counter = 0;
    foreach ($perms as $k => &$v) {
        if ($k == $group_counter) { // skip fieldsets
            $group_counter++;
            continue;
        }

        $v['#markup'] .= ' (<span class="description" style="color:brown">'.$k.'</span>)'; 
    }
}

С уважением

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.