web-dev-qa-db-ja.com

メニュー項目をアクティブに設定するにはどうすればよいですか?

メニューがたくさんあるサイトを持っています。そのうちの1つは、項目の少ないメインメニューです。これらのアイテムはサイトのメインエリアにリンクしており、これらの各メインエリアには1つの特定のメニューがあります。これらのメイン領域のいずれかのランディングページにいるときは、メインメニューのその項目がアクティブですが、これらの領域のいずれかの内部ページにいるときは、メインメニューの項目がアクティブではありません。

自動的にアクティブにする方法はありますか?

Menu_positionを使用してみましたが、機能していないようです。

5
Luiz Guilherme

Context は、この機能をそのまま使用できます。

10
Capi Etheriel

彼らのやり方はたくさんあります。ここでは、D7と互換性のあるものだけをリストし、最終的にはD6にリストアップします。

モジュールを使用します

自分のものをコーディングする

それらは現在ネイティブAPIです menu_tree_set_path メニューのアクティブな軌跡の計算に使用するパスを設定します。

theme_links でも作業できますが、他のモジュールがアクティブなリンクを認識できるように、menu_tree_set_pathを使用することをお勧めします。利点は、モジュールを作成せずにテーマでこの関数を使用できることです。

なお、menu_positionにはカスタムルールを作成するためのAPIがあります。

それで私は何を使うべきですか???

それはあなたのニーズ次第です。このような単純なルールがある場合:このノードタイプ/ビュー/分類法では、このアクティブなメニューが必要なので、コンテキストは適切です。

メニュー構造に従うよりも適切なURL構造(自動パス)を使用している場合、menu_trail_by_pathは簡単に機能します。

Menu_positionを使用したことはないので、わかります。

特別なロジックが必要な場合は、40のコンテキストまたはルールを作成するよりも、コーディングを速くすることができます...

13
gagarine

最も簡単な方法は、「内部」ページ(領域/ランディングページに属するサブページ)のメニュー項目をランディングページのメニュー項目の子にすることです。

何かのようなもの:

主要リンクメニュー
 | 
 +-ランディングページ1メニュー項目
 | | 
 | +-内部ページ1メニュー項目
 | +-内部ページ2メニュー項目
 | 
 +-ランディングページ2メニュー項目
 | 
 +-内部ページ3メニュー項目
 +-内部ページ4メニュー項目

ただし、それらを別々のメニューに保持する必要がある場合は、おそらく theme_links() で遊んで、適切な「アクティブトレイル」または「アクティブ」クラスを維持する必要があります。

3
Maciej Zgadzaj

おそらく Menu Block module が役立つでしょう。

(Maciejが上で概説したアプローチと併せて)。

メニューブロックプロジェクトページから:

これは、任意のメニューの任意のレベルで始まるメニューツリーの構成可能なブロックを提供します。もっと!

したがって、テーマのメインメニューリンク機能のみを使用している場合は、「メインメニュー(レベル2+)」ブロックを追加して構成できます。このブロックは、メインメニューのいずれかのページに移動すると表示され、メインメニューの第2レベル(およびより深い)のメニューツリーを表示し、ツリーを下に移動すると展開します。メニューのツリーの深さを制限したり(「メインメニュー(レベル2〜3)」など)、および/またはすべての子サブメニューを展開したりすることもできます(たとえば、「メインメニュー(レベル2以上の展開)」)。

1
iainp999

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;

        }

    }
}
0
batMask