メニューがたくさんあるサイトを持っています。そのうちの1つは、項目の少ないメインメニューです。これらのアイテムはサイトのメインエリアにリンクしており、これらの各メインエリアには1つの特定のメニューがあります。これらのメイン領域のいずれかのランディングページにいるときは、メインメニューのその項目がアクティブですが、これらの領域のいずれかの内部ページにいるときは、メインメニューの項目がアクティブではありません。
自動的にアクティブにする方法はありますか?
Menu_positionを使用してみましたが、機能していないようです。
Context は、この機能をそのまま使用できます。
彼らのやり方はたくさんあります。ここでは、D7と互換性のあるものだけをリストし、最終的にはD6にリストアップします。
モジュールを使用します
自分のものをコーディングする
それらは現在ネイティブAPIです menu_tree_set_path メニューのアクティブな軌跡の計算に使用するパスを設定します。
theme_links でも作業できますが、他のモジュールがアクティブなリンクを認識できるように、menu_tree_set_pathを使用することをお勧めします。利点は、モジュールを作成せずにテーマでこの関数を使用できることです。
なお、menu_positionにはカスタムルールを作成するためのAPIがあります。
それで私は何を使うべきですか???
それはあなたのニーズ次第です。このような単純なルールがある場合:このノードタイプ/ビュー/分類法では、このアクティブなメニューが必要なので、コンテキストは適切です。
メニュー構造に従うよりも適切なURL構造(自動パス)を使用している場合、menu_trail_by_pathは簡単に機能します。
Menu_positionを使用したことはないので、わかります。
特別なロジックが必要な場合は、40のコンテキストまたはルールを作成するよりも、コーディングを速くすることができます...
最も簡単な方法は、「内部」ページ(領域/ランディングページに属するサブページ)のメニュー項目をランディングページのメニュー項目の子にすることです。
何かのようなもの:
主要リンクメニュー | +-ランディングページ1メニュー項目 | | | +-内部ページ1メニュー項目 | +-内部ページ2メニュー項目 | +-ランディングページ2メニュー項目 | +-内部ページ3メニュー項目 +-内部ページ4メニュー項目
ただし、それらを別々のメニューに保持する必要がある場合は、おそらく theme_links() で遊んで、適切な「アクティブトレイル」または「アクティブ」クラスを維持する必要があります。
おそらく Menu Block module が役立つでしょう。
(Maciejが上で概説したアプローチと併せて)。
メニューブロックプロジェクトページから:
これは、任意のメニューの任意のレベルで始まるメニューツリーの構成可能なブロックを提供します。もっと!
したがって、テーマのメインメニューリンク機能のみを使用している場合は、「メインメニュー(レベル2+)」ブロックを追加して構成できます。このブロックは、メインメニューのいずれかのページに移動すると表示され、メインメニューの第2レベル(およびより深い)のメニューツリーを表示し、ツリーを下に移動すると展開します。メニューのツリーの深さを制限したり(「メインメニュー(レベル2〜3)」など)、および/またはすべての子サブメニューを展開したりすることもできます(たとえば、「メインメニュー(レベル2以上の展開)」)。
hook_translated_menu_link_alter()
を使用することもできます。これは少し注意が必要です。
/**
* Implements hook_translated_menu_link_alter()
*/
function Module_translated_menu_link_alter(&$item, $map) {
if ($item['menu_name'] == 'menu-name') {
//check first two arg from url
$path = arg(0)."/".arg(1);
//add class active-trail if path match
if (strpos($item['link_path'], $path) !== false) {
$item['in_active_trail'] = true;
}
}
}