--- token/token_node.inc 2008-06-07 20:57:40.000000000 +0200 +++ token/fixed_token_node.inc 2008-06-17 10:58:21.000000000 +0200 @@ -52,25 +52,35 @@ function node_token_values($type, $objec } // Now get the menu related information. - if (!empty($node->menu['mlid'])) { - $menus = menu_get_menus(); - $menu_name = $node->menu['menu_name']; - $menu_title = $menus[$menu_name]; - $trail_raw = _menu_titles($menu_name, $node->nid); - $trail = array(); - foreach ($trail_raw as $title) { - $trail[] = check_plain($title); - } - $values['menupath'] = implode('/', $trail); - $values['menupath-raw'] = implode('/', $trail_raw); - $values['menu'] = check_plain($menu_title); - $values['menu-raw'] = $menu_title; - } - else { - $values['menu'] = ''; - $values['menu-raw'] = ''; - $values['menupath'] = ''; - $values['menupath-raw'] = ''; + $menus = menu_get_menus(); + + if (isset($node->menu['menu_name']) && !empty($node->menu['menu_name'])) { + $menu_name = $node->menu['menu_name']; + } else { + $menu_name = extract_menu_name($node); + } + + $menu_title = $menus[$menu_name]; + $trail_raw = _menu_titles($menu_name, $node->nid); + $trail = array(); + + if (!empty($trail_raw)) { + foreach ($trail_raw as $title) { + $trail[] = check_plain($title); + } + + $link_title = array_pop($trail); + $link_title_raw = array_pop($trail_raw); + + $values['menupath'] = implode('/', $trail); + $values['menupath-raw'] = implode('/', $trail_raw); + $values['menu'] = check_plain($menu_title); + $values['menu-raw'] = $menu_title; + } else { + $values['menu'] = ''; + $values['menu-raw'] = ''; + $values['menupath'] = ''; + $values['menupath-raw'] = ''; } // And now taxonomy, which is a bit more work. This code is adapted from @@ -199,22 +209,37 @@ function node_token_list($type = 'all') * An array of titles through the specified node */ function _menu_titles($menu_name, $nid) { - // Get the menu hierarchy for the specified page. - $item = array_shift(menu_tree_all_data($menu_name)); + // get the plid of our target node + $item = db_fetch_array(db_query("SELECT mlid, plid, link_title, menu_name FROM {menu_links} WHERE menu_name = '%s' AND link_path = '%s'", $menu_name, 'node/' . $nid)); + + if(!(bool)$item['mlid']){ + // not in this menu, or the item was just dissasociated + return array(); + } + $titles = array(); - // Go down the active trail until the right level is reached. - while ($item) { - $titles[] = $item['link']['title']; - // Break AFTER getting the desired node's title - if ($item['link']['href'] == "node/$nid" || !$item['below']) { - break; - } - $item = array_shift($item['below']); + $titles[] = $item['link_title']; // include the node link title as well + while($item['plid']){ + $item = db_fetch_array(db_query("SELECT mlid, plid, link_title FROM {menu_links} WHERE mlid = %d", $item['plid'])); + $titles[] = $item['link_title']; } - + + // invert the array to return it to path order + $titles = array_reverse($titles); + return $titles; } +function extract_menu_name($node) { + + $item = db_fetch_array(db_query("SELECT menu_name FROM {menu_links} WHERE link_path = '%s'", 'node/' . $node->nid)); + + if ($item && isset($item['menu_name'])) { + return $item['menu_name']; + } + return false; +} + /** * Implementation of hook_token_values() for book nodes */