user_access($ string)関数で利用可能な$ string値のリストを見つけるにはどうすればよいですか?


27

user_access($ string、$ account = NULL)

$ string:チェック対象のアクセス許可(「ノードの管理」など)。

user_access()関数で利用可能な$ string値のリストを見つけるにはどうすればよいですか?

回答:


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が言ったように、どのパーミッションが利用可能であるかを確認する最も簡単な方法は、Drupal 7のパーミッションadmin / people / permissionsにアクセスすることです。

実行し続けた問題は、アクセス許可を実際に使用するために「アクセス引数」として指定する必要のある文字列がわからないことです。使用したい権限の文字列名を見つける方法は次のとおりです(この例では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バージョンは、print_rの代わりにDSMを使用し、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()定義済みのすべての権限とそのモジュールの配列を返す関数を使用できます。

パーミッションが属するモジュールを決定します。

戻り値

$ permission => $ moduleの形式の連想配列。


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で「公開コンテンツの表示」権限の名前が必要な場合、値は権限名である「コンテンツにアクセス」です。

パーミッションがどのモジュールからのものであるかがわかっている場合は、そのモジュールの対応するhook_perm()(D6)/ hook_pemission()(D7)実装も確認できます。

多くの場合、独自のペミッションを定義して使用したい場合は、上記のフックでそれを行うことができます。


RE:「最も簡単な方法は、アクセス許可ページ(D7:admin / people / permissions、)を確認することです。」ページには許可のリストが表示されますが、それらは機械可読文字列ではなく、人間可読文字列です。
ギルゼロ

1
以下に書いたように、マシンが読み取り可能な名前は、特定の許可のチェックボックスの値から抽出できます。
ベルディール

この答えは、Drupalの6,7、受け入れ1つのみのDrupal 6を覆っている-が、受け入れ答えは)=巧妙なトリックであり、容易にDrupalの7のために変更することができる
グレッグ

4

Develモジュールの使用

  • Develモジュールをインストールして有効にした後、に移動しadmin/config/development/develます。「権限とモジュールのマシン名を表示する」というタイトルの設定があります。それがチェックされていることを確認してください。

  • 権限ページpeople/permissionsので、質問している権限の名前にカーソルを合わせます。1〜2秒遅れることがありますが、文字列値が表示されます。


うわー、私はこれについて知りませんでした。答えを投稿してから見ました。ありがとう!
バタンドワ14年

非常に便利!TYVM。
DrCord 14

甘く、モジュールコードを開くよりもずっと簡単です!
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>");
});


これは本当に便利なツールです、ty!
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>)'; 
    }
}

よろしく

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.