Drupal创建自定义块挂钩以呈现动态菜单

时间:2012-02-13 17:59:37

标签: php drupal drupal-7 drupal-modules

如何编写一个块挂钩,根据当前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 :(得分:0)

我不记得我从哪里偷了这个,但是如果你调用'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));