web-dev-qa-db-ja.com

HOOK_menu_alterは、特定のユーザーロールのメインメニュー項目を削除します

「スーパーバイザー」のユーザーロールのメインメニューにメニューリンク(admin/people/create?operator = 1)を追加しようとしています。

私はこれをやろうとしました:

function mymodule_menu_alter(&$items) {

 if(in_array('Supervisor', array_values($user->roles)))
   $items['admin/people/create?operator=1']['type'] = {idk what goes here};

}

しかし、私が正しい方向に進んでいるかはわかりません。

4
Mike

メインメニューにリンクを追加し、ユーザーが適切な権限を持っている場合にのみリンクを表示させたいと思います。その場合、hook_menu_alter()は実装するのに適切なフックではありません。

  • そのメニューに追加されたリンクを上書きするためには使用されません
  • hook_menu()またはhook_menu_alter()のメニューリンクのパスとしてadmin/people/create?operator = 1を使用することはできません

リンクをメインメニューに追加したら、次のコードを含むモジュールを有効にする必要があります。

function mymodule_menu_link_alter(&$link) {
  if ($link['link_path'] == 'admin/people/create?operator=1' && $link['module'] == 'menu') {
    $link['options']['alter'] = TRUE;
  }    
}

function mymodule_translated_menu_link_alter(&$link) {
  if ($link['link_path'] == 'admin/people/create?operator=1' && $link['module'] == 'menu' && user_access('use advanced user creation link')) {
    $link['hidden'] = 1;
  }
}

function mymodule_permission() {
  return array(
    'use advanced user creation link' => array(
      'title' => t('Use advanced user creation link'), 
    ),
  );
}

$link['module'] == 'menu'パーツを使用すると、メインメニューで手動で追加したリンクを変更できます。他のリンク(モジュールから追加したリンク)は変更できません。最初の関数では、$link['options']['alter'] = TRUEはDrupalを呼び出して、そのリンクに対して hook_translated_menu_link_alter() を呼び出すように指示します。2番目の関数では、実際にはhook_translated_menu_link_alter()、最初の関数は hook_menu_link_alter() の実装ですが、$link['hidden'] = 1は実際に現在ログインしているユーザーに対してメニューを非表示にします。
「高度なユーザー作成リンクを使用」の代わりに、別の許可文字列を使用できます。アクセス許可は、それを必要とするロールにのみ付与され、一意である限り、任意の文字列を使用できます。

見つかりませんでしたが、メインメニューに追加されたリンクを特定の役割を持つユーザーに表示するモジュールがある場合は、代わりにそれを使用します。

補足として、権限を確認することは、ログインしているユーザーが持つ役割を確認するよりも望ましい方法です。その理由は、権限を確認するとき、コードは常にif (user_access('permission to check')) {}に似ており、役割がその権限を持っている場合は、役割を確認すると、コードがif (in_array('supervisor', array_values($user->roles))) {}からif (in_array('supervisor', array_values($user->roles)) || in_array('another role', array_values($user->roles))) {};つまり、将来変更する可能性のあるものをハードコーディングしています。

11
kiamlaluno

各メニュー項目を表示できるロールを定義できる ロールごとのメニュー モジュールがあります。どのロールを表示するか、どのロールを非表示にするかを定義します。他の役割については、デフォルトのままです。これは設定画面のスクリーンショットです:

Menu item settings screen

0
Druvision