Drupal 7.のメインシステムメニューを変更します。実際には、特定の場合にのみメニューの特定の要素のみを表示し、他の特定の要素を非表示にしたい(これは関数内のif
またはswitch
ステートメント)。
これを行う最も簡単な方法は何ですか?そしてそれを行う方法は?例を挙げていただけますか?
hook_theme
またはhook_menu
を使用して実行できることを読みましたが、これを行う方法がわかりません。
システムメニューを変更するには、さまざまなレベルがあります。 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'),
セクションにメニュー項目を作成するときは、通常のメニュー項目を作成するだけです。
更新
メニュー構造がキャッシュされるため、ユーザーごとのシナリオでメニューを変更することはできません。しかし、まだいくつかの方法が利用可能です。
メニューを変更する必要がある場合、アクセス制御を変更するには、hook_menu_alter
を使用する必要があります。
条件に基づいてメニューを非表示にしたい。ただし、状態によって異なります。ロールに基づいてそれを行うことができる場合、そのためのモジュールがあります: ロールごとのメニュー
より複雑なロジックがある場合は、ケースごとに異なるメニューを作成する必要があります。メニューシステムはメニューをキャッシュするため、動的に変更することは困難です。複数のメニューを作成することにより、 Menu Block モジュールを使用して、条件に基づいて異なるメニューをブロックに表示できます。
ユースケースに関する詳細情報(「関数のifステートメントまたはswitchステートメントによって実装される」という神秘的な条件の内容、および「メニューの一部」の定義)がないと、難しいあなたに明確な答えを与えるために。
Drupalのメニューシステムは、さまざまな使用例とメニュー構造を処理するように設計された複雑なツールであることを知っておいてください。その標準的な表示ロジックは、実際にアクセスできるリンクのみをユーザーに表示するように設計されているため、Drupalユーザーが403ページにアクセスすることはありません。
メニューシステムは、hook_translated_menu_link_alter()
を介したメニューリンク(およびその可視性)の動的な変更もサポートしていますが、少し作業が必要です。
$link['options']['alter']
をTRUEに設定します。hook_translated_menu_link_alter()
を実装し、非表示にするリンクの'access'
プロパティをFALSE
に設定できます。すでに述べたmenu_per_roleモジュールのようなパッケージごとのソリューションを使用することもできます。
テーマレベルでレンダリングする直前にメニュー構造を変更することはneverソリューションです。
テーマテンプレートファイルまたはプリプロセッサでこれを行う方法はたくさんあります。ただし、メニューにリンクが必要ない場合は、/ admin/build/menuに移動してメニューから削除しないでください。