Drupal создает пользовательский хук для рендеринга динамического меню - PullRequest
0 голосов
/ 13 февраля 2012

Как написать хук блока, который отображает пользовательское меню в зависимости от текущего URL с активным трейлом? Я не могу сделать это с обычными меню, так как они кэшируются. Под кастомом я подразумеваю разные пункты меню для разных пользователей.

Пример меню может выглядеть следующим образом при просмотре профиля пользователя X

|-- User X's profile (active)
|-- User X's groups
    |-- Group A
    |-- Group B
    |-- Group C

Но если я зайду в свой профиль пользователя, зайду в настройки, меню может выглядеть следующим образом

|-- My profile
|-- My settings
    |-- Profile settings (active)
    |-- Group settings
|-- My groups
    |-- Group X
    |-- Group Y
    |-- Group Z

Было бы очень просто создать блок, который выводит это в простом HTML. Но, как уже было сказано выше, мне нужен актив-трейл, примененный к ссылкам. И я также хочу редактировать маршруты только из разных хуков меню, а не из жесткого кода или чего-то подобного.

Есть предложения?

1 Ответ

0 голосов
/ 13 февраля 2012

Я не помню, откуда я это украл, но если вы вызовете 'your_module_menu_tree_full ()', вы получите названное меню в виде массива с аннотированным активным элементом.

function your_module_menu_tree_full($menu_name = 'main-menu') {
  static $menu_output = array();
  if (!isset($menu_output[$menu_name])) {
    $tree = _your_module__menu_find_active_trail(menu_tree_all_data($menu_name));
    $menu_output[$menu_name] = menu_tree_output($tree);
  }
  return $menu_output[$menu_name];
}

function _your_module__menu_find_active_trail(&$menu_tree) {
  $item = menu_get_item();
  _your_module_menu_find_active_trail($menu_tree, $item);
  return $menu_tree;
}

function _your_module_menu_find_active_trail(&$menu_tree, $item) {
  $level_is_expanded = FALSE;
  foreach($menu_tree as &$menu_item) {
    $link = &$menu_item['link'];
    if ($link['href']==$item['href']) { // Found the exact location in the tree
      $link['active'] = TRUE;
      $link['in_active_trail'] = TRUE;
      return true;
    } else {
      if ($link['has_children']) {
        $result = _your_module_menu_find_active_trail($menu_item['below'], $item);
        $link['in_active_trail'] = $result;
        if ($result) $level_is_expanded = TRUE;
      }
    }
  }
  return $level_is_expanded;
}

Попробуйте:

$menu = your_module_menu_tree_full('main-menu');
error_log(print_r($menu, TRUE));
...