Установите пункт главного меню активным с помощью пользовательского кода
Я хочу установить пункт меню главного меню как активный (класс="активный").
Я специально ищу крючок или функцию, а не модуль contrib.
Я видел рекомендации для Контекста , и я заглянул в код модуля, но он использует крючки, которые я не могу найти на API-сайте .
4 answers
Если вы просто хотите добавить класс "активный" в пункт меню, вы можете сделать это в коде перед печатью меню. Если вы хотите, чтобы пункт меню также действовал как активный элемент, вы можете использовать menu_tree_set_path(), который предположительно был добавлен в Drupal 7.9.
В более ранних версиях и Drupal 6 я использовал это:
function mymodule_init() {
$item = menu_get_item($_GET['q']);
$item['href'] = 'node/1';
menu_set_item(NULL, $item);
}
Однако оба варианта просто добавляют класс (классы) "активный след" (не "активный"), но этого должно быть достаточно в большинстве случаев.
Вы могли бы использовать menu_set_active_trail
чтобы установить, какое меню должно отображаться как активное.
Другой способ - возиться с $_GET['q']
, но вы действительно хотите избежать этого, если это вообще возможно, так как это может привести к некоторым странным ошибкам.
Мое решение таково:
function mymodule_init() {
$link=menu_link_load(346);
$link["options"]["attributes"]["class"]="active";
menu_link_save($link);
}
Идентификатор 346 - это mlid
понятия не имею, что это значит, но я получил этот идентификатор с этой маленькой свалкой:
echo('<pre>');
dump(menu_tree_all_data('main-menu'));
echo('</pre>');
Вы также можете использовать 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;
}
}
}