web-dev-qa-db-ja.com

カスタムコードを使用してメインメニュー項目をアクティブに設定する

メインメニューのメニュー項目をアクティブに設定したい(class = "active")。

具体的には、contribモジュールではなく、フックまたは関数を探しています。

Context の推奨事項を確認し、モジュールコードを調べましたが、- API-Site では見つからないフックを使用しています。

4
rekire

私の解決策はこれです:

function mymodule_init() {
    $link=menu_link_load(346);
    $link["options"]["attributes"]["class"]="active";
    menu_link_save($link);
}

ID 346はmlidです。これが何を意味するかはわかりませんが、この小さなダンプでこのIDを取得しました。

echo('<pre>');
dump(menu_tree_all_data('main-menu'));
echo('</pre>');
1
rekire

「アクティブ」クラスをメニュー項目に追加するだけの場合は、メニューを印刷する前にコードで追加できます。メニュー項目をアクティブな項目のように機能させたい場合は、Drupal 7.9で追加されたと考えられる menu_tree_set_path() を使用できます。

以前のバージョンとDrupal 6では、これを使用しました:

function mymodule_init() {
  $item = menu_get_item($_GET['q']);
  $item['href'] = 'node/1';
  menu_set_item(NULL, $item);
}

ただし、どちらのオプションも「active-trail」(「active」ではない)クラスを追加するだけですが、ほとんどの場合それで十分です。

2
Madis

menu_set_active_trail どのメニューをアクティブとしてレンダリングするかを設定します。

もう1つの方法は、$_GET['q']、しかし、それはいくつかの奇妙なバグにつながる可能性があるので、可能であれば、本当にそれを避けたいです。

1
googletorp

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;

        }

    }
}
1
batMask