許可に基づいてリンクを表示/非表示にする方法は?


7

現在のユーザーが特定の権限を持っている場合、メインメニューからリンクを非表示/表示する方法を探しています。メニュー項目はすでに作成されており、メニュー項目はhook_node_access()によって制御されるノードにリンクしています。


メニュー項目は何にリンクしていますか?
kiamlaluno

ノードにリンクしますが、ノードアクセスルールは、別のモジュールで定義されたnode_accessルールをすでに持っているため、hook_node_access()で定義されています。特定の権限を持つユーザーにノードを制限するためにhook_node_access()を使用しています。
Camsoft

回答:


4

デフォルトでは、Drupalはユーザーがアクセスできないすべてのメニュー項目を非表示にするため、最も簡単な方法は、メニュー項目がリンクしているページに対して選択したアクセスを要求することです。


残念ながら、ノードはnode_accessテーブルを使用せず、代わりにhook_node_access()を使用しているため、これは機能しません。メニューのアクセス許可では、hook_node_access()関数が無視されているようです。
Camsoft

Hook_node_accessは、ノードIIRCを定義するモジュールでのみ機能します。
googletorp

Drupal 7では、hook_node_access()は、コンテンツタイプを定義するものだけでなく、任意のモジュールから実装できます。
kiamlaluno

1
hook_node_access()は任意のモジュールから実装でき、正しく実装されている場合はノードへのアクセスを防止します。しかし、残念ながら、これはメニュー項目の生成には関係ありません。menu_tree_check_accessのコードを見ると、node_accessアクセス権を取得するためにタグ付きの選択クエリを使用していることがわかります。したがって、単に実装hook_node_access()するだけではそれはできません。
berliner 2014

2

あなたにできることは使って「ノード/%ノード」に関連付けられたアクセスコールバックを変更することである)(hook_menu_alterをし、その後のコードであなたのアクセスコールバック基点のためのコードを書く)(node_access。まだ処理したい特定のケースがありますnode_access()。たとえば、「ノードアクセスのバイパス」権限を持つユーザーは、常にノードにアクセスします。

function mymodule_menu_alter(&$items) {
  if (isset($items['node/%node'])) {
    $items['node/%node']['access callback'] = 'mymodule_node_access';
  }
}

アクセスコールバックは、リンクを表示できるユーザー、およびユーザーがブラウザーのアドレスバーに直接URLを書き込んだときにページにアクセスできるユーザーを決定することを考慮してください。


1

drupalモジュールmenu_item_visibilityを検討することができます

プロジェクトページを引用するには:

たとえば、/ userを指す「マイアカウント」リンクを作成する場合、匿名ユーザーと登録ユーザーの両方が/ userパスにアクセスできるため、匿名ユーザーが技術的にアカウントを持っていない場合でも、両方にリンクが表示されます。このモジュールを使用すると、「マイアカウント」リンクのみを登録ユーザーに表示し、匿名ユーザーには非表示にすることができます。

モジュールは、ブロックの表示設定に使用されているものとまったく同じUIを使い慣れています。

またはmenu_viewsモジュール-メニュー生成へのビューベースのアプローチを提供します(ユーザーに基づいて含めると思います)

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