web-dev-qa-db-ja.com

drupal 7でメインシステムメニューのテーマをフックして一部の要素のみを表示する方法は?

Drupal 7.のメインシステムメニューを変更します。実際には、特定の場合にのみメニューの特定の要素のみを表示し、他の特定の要素を非表示にしたい(これは関数内のifまたはswitchステートメント)。

これを行う最も簡単な方法は何ですか?そしてそれを行う方法は?例を挙げていただけますか?

hook_themeまたはhook_menuを使用して実行できることを読みましたが、これを行う方法がわかりません。

3
Ek Kosmos

システムメニューを変更するには、さまざまなレベルがあります。 drupalコマースが管理ショップセクションに対して行うような)トップレベルのコンテナーを追加する場合は、次のようなフックメニューを含むメニュー項目を追加する必要があります。

// Top level "Store" container.
$items['admin/commerce'] = array(
  'title' => 'Store',
  'description' => 'Administer your store.',
  'page callback' => 'system_admin_menu_block_page',
  'access arguments' => array('access administration pages'),
  'file path' => drupal_get_path('module', 'system'),
  'file' => 'system.admin.inc',
  'weight' => -7,
);

system_admin_menu_block_pageは、システムメニューの一部にするための機能です。

設定などのセクションの1つにメニューを表示する場合は、hook_menu、fxでパスを調整するだけです。

$items['admin/config/section'] = array(...);

他のメニュー項目を保持するセクションを作成するたびに、単に追加します

'page callback' => 'system_admin_menu_block_page',
'access arguments' => array('access administration pages'),
'file' => 'system.admin.inc',
'file path' => drupal_get_path('module', 'system'),

セクションにメニュー項目を作成するときは、通常のメニュー項目を作成するだけです。

更新
メニュー構造がキャッシュされるため、ユーザーごとのシナリオでメニューを変更することはできません。しかし、まだいくつかの方法が利用可能です。

  • メニューはユーザーがアクセスできる場合にのみ表示されるため、すべてのメニュー用のカスタムアクセス制御関数を作成し、そこにロジックを配置できます。
  • また、これをテーマレイヤーで実行して、目的のメニューのみを表示するように出力を変更することもできます。私はDrupal 7でこれを試していませんが、メニューシステムが非常に複雑であるため、一般に、この方法でメニューの出力を変更することは困難です。

メニューを変更する必要がある場合、アクセス制御を変更するには、hook_menu_alterを使用する必要があります。

3
googletorp

条件に基づいてメニューを非表示にしたい。ただし、状態によって異なります。ロールに基づいてそれを行うことができる場合、そのためのモジュールがあります: ロールごとのメニュー

より複雑なロジックがある場合は、ケースごとに異なるメニューを作成する必要があります。メニューシステムはメニューをキャッシュするため、動的に変更することは困難です。複数のメニューを作成することにより、 Menu Block モジュールを使用して、条件に基づいて異なるメニューをブロックに表示できます。

2
cleaver

ユースケースに関する詳細情報(「関数のifステートメントまたはswitchステートメントによって実装される」という神秘的な条件の内容、および「メニューの一部」の定義)がないと、難しいあなたに明確な答えを与えるために。

Drupalのメニューシステムは、さまざまな使用例とメニュー構造を処理するように設計された複雑なツールであることを知っておいてください。その標準的な表示ロジックは、実際にアクセスできるリンクのみをユーザーに表示するように設計されているため、Drupalユーザーが403ページにアクセスすることはありません。

メニューシステムは、hook_translated_menu_link_alter()を介したメニューリンク(およびその可視性)の動的な変更もサポートしていますが、少し作業が必要です。

  • 最初に、ターゲットにするメニューリンクを「変更可能」としてマークする必要があります。たとえば、メニュールーターアイテムの場合は、hook_menu_link_alter()またはhook_menu_alter()で$link['options']['alter']をTRUEに設定します。
  • 次に、hook_translated_menu_link_alter()を実装し、非表示にするリンクの'access'プロパティをFALSEに設定できます。

すでに述べたmenu_per_roleモジュールのようなパッケージごとのソリューションを使用することもできます。

テーマレベルでレンダリングする直前にメニュー構造を変更することはneverソリューションです。

2
Damien Tournoud

テーマテンプレートファイルまたはプリプロセッサでこれを行う方法はたくさんあります。ただし、メニューにリンクが必要ない場合は、/ admin/build/menuに移動してメニューから削除しないでください。

1
Jeremy French