Mercurial > defr > drupal > core
comparison includes/menu.inc @ 7:fff6d4c8c043 6.3
Drupal 6.3
author | Franck Deroche <webmaster@defr.org> |
---|---|
date | Tue, 23 Dec 2008 14:30:28 +0100 |
parents | 2427550111ae |
children | 589fb7c02327 |
comparison
equal
deleted
inserted
replaced
6:2cfdc3c92142 | 7:fff6d4c8c043 |
---|---|
1 <?php | 1 <?php |
2 // $Id: menu.inc,v 1.255.2.11 2008/04/09 21:11:44 goba Exp $ | 2 // $Id: menu.inc,v 1.255.2.17 2008/07/09 15:23:50 goba Exp $ |
3 | 3 |
4 /** | 4 /** |
5 * @file | 5 * @file |
6 * API for the Drupal menu system. | 6 * API for the Drupal menu system. |
7 */ | 7 */ |
512 | 512 |
513 // Translate description, see the motivation above. | 513 // Translate description, see the motivation above. |
514 if (!empty($item['description'])) { | 514 if (!empty($item['description'])) { |
515 $original_description = $item['description']; | 515 $original_description = $item['description']; |
516 $item['description'] = t($item['description']); | 516 $item['description'] = t($item['description']); |
517 if ($link_translate && $item['options']['attributes']['title'] == $original_description) { | 517 if ($link_translate && isset($item['options']['attributes']['title']) && $item['options']['attributes']['title'] == $original_description) { |
518 $item['localized_options']['attributes']['title'] = $item['description']; | 518 $item['localized_options']['attributes']['title'] = $item['description']; |
519 } | 519 } |
520 } | 520 } |
521 } | 521 } |
522 | 522 |
568 } | 568 } |
569 } | 569 } |
570 $router_item['href'] = implode('/', $link_map); | 570 $router_item['href'] = implode('/', $link_map); |
571 $router_item['options'] = array(); | 571 $router_item['options'] = array(); |
572 _menu_check_access($router_item, $map); | 572 _menu_check_access($router_item, $map); |
573 | 573 |
574 _menu_item_localize($router_item, $map); | 574 // For performance, don't localize an item the user can't access. |
575 if ($router_item['access']) { | |
576 _menu_item_localize($router_item, $map); | |
577 } | |
575 | 578 |
576 return $map; | 579 return $map; |
577 } | 580 } |
578 | 581 |
579 /** | 582 /** |
647 $item['access'] = FALSE; | 650 $item['access'] = FALSE; |
648 return FALSE; | 651 return FALSE; |
649 } | 652 } |
650 _menu_check_access($item, $map); | 653 _menu_check_access($item, $map); |
651 } | 654 } |
652 | 655 // For performance, don't localize a link the user can't access. |
653 _menu_item_localize($item, $map, TRUE); | 656 if ($item['access']) { |
657 _menu_item_localize($item, $map, TRUE); | |
658 } | |
654 } | 659 } |
655 | 660 |
656 // Allow other customizations - e.g. adding a page-specific query string to the | 661 // Allow other customizations - e.g. adding a page-specific query string to the |
657 // options array. For performance reasons we only invoke this hook if the link | 662 // options array. For performance reasons we only invoke this hook if the link |
658 // has the 'alter' flag set in the options array. | 663 // has the 'alter' flag set in the options array. |
1255 foreach ($tree as $item) { | 1260 foreach ($tree as $item) { |
1256 if (!$item['link']['hidden']) { | 1261 if (!$item['link']['hidden']) { |
1257 $l = $item['link']['localized_options']; | 1262 $l = $item['link']['localized_options']; |
1258 $l['href'] = $item['link']['href']; | 1263 $l['href'] = $item['link']['href']; |
1259 $l['title'] = $item['link']['title']; | 1264 $l['title'] = $item['link']['title']; |
1265 if ($item['link']['in_active_trail']) { | |
1266 if (empty($l['attributes']['class'])) { | |
1267 $l['attributes']['class'] = 'active-trail'; | |
1268 } | |
1269 else { | |
1270 $l['attributes']['class'] .= ' active-trail'; | |
1271 } | |
1272 } | |
1260 // Keyed with unique menu id to generate classes from theme_links(). | 1273 // Keyed with unique menu id to generate classes from theme_links(). |
1261 $links['menu-'. $item['link']['mlid']] = $l; | 1274 $links['menu-'. $item['link']['mlid']] = $l; |
1262 } | 1275 } |
1263 } | 1276 } |
1264 return $links; | 1277 return $links; |
1512 if ($curr['link']['href'] == $item['href']) { | 1525 if ($curr['link']['href'] == $item['href']) { |
1513 $trail[] = $curr['link']; | 1526 $trail[] = $curr['link']; |
1514 $curr = FALSE; | 1527 $curr = FALSE; |
1515 } | 1528 } |
1516 else { | 1529 else { |
1517 // Move to the child link if it's in the active trail. | 1530 // Add the link if it's in the active trail, then move to the link below. |
1518 if ($curr['below'] && $curr['link']['in_active_trail']) { | 1531 if ($curr['link']['in_active_trail']) { |
1519 $trail[] = $curr['link']; | 1532 $trail[] = $curr['link']; |
1520 $tree = $curr['below']; | 1533 $tree = $curr['below'] ? $curr['below'] : array(); |
1521 } | 1534 } |
1522 list($key, $curr) = each($tree); | 1535 list($key, $curr) = each($tree); |
1523 } | 1536 } |
1524 } | 1537 } |
1525 // Make sure the current page is in the trail (needed for the page title), | 1538 // Make sure the current page is in the trail (needed for the page title), |
1656 if (!isset($menu) || $reset) { | 1669 if (!isset($menu) || $reset) { |
1657 if (!$reset && ($cache = cache_get('router:', 'cache_menu')) && isset($cache->data)) { | 1670 if (!$reset && ($cache = cache_get('router:', 'cache_menu')) && isset($cache->data)) { |
1658 $menu = $cache->data; | 1671 $menu = $cache->data; |
1659 } | 1672 } |
1660 else { | 1673 else { |
1661 db_query('DELETE FROM {menu_router}'); | |
1662 // We need to manually call each module so that we can know which module | 1674 // We need to manually call each module so that we can know which module |
1663 // a given item came from. | 1675 // a given item came from. |
1664 $callbacks = array(); | 1676 $callbacks = array(); |
1665 foreach (module_implements('menu') as $module) { | 1677 foreach (module_implements('menu') as $module) { |
1666 $router_items = call_user_func($module .'_menu'); | 1678 $router_items = call_user_func($module .'_menu'); |
1672 } | 1684 } |
1673 } | 1685 } |
1674 // Alter the menu as defined in modules, keys are like user/%user. | 1686 // Alter the menu as defined in modules, keys are like user/%user. |
1675 drupal_alter('menu', $callbacks); | 1687 drupal_alter('menu', $callbacks); |
1676 $menu = _menu_router_build($callbacks); | 1688 $menu = _menu_router_build($callbacks); |
1677 cache_set('router:', $menu, 'cache_menu'); | |
1678 } | 1689 } |
1679 } | 1690 } |
1680 return $menu; | 1691 return $menu; |
1681 } | 1692 } |
1682 | 1693 |
2252 $sort[$path] = $number_parts; | 2263 $sort[$path] = $number_parts; |
2253 } | 2264 } |
2254 } | 2265 } |
2255 array_multisort($sort, SORT_NUMERIC, $menu); | 2266 array_multisort($sort, SORT_NUMERIC, $menu); |
2256 | 2267 |
2268 if (!$menu) { | |
2269 // We must have a serious error - there is no data to save. | |
2270 watchdog('php', 'Menu router rebuild failed - some paths may not work correctly.', array(), WATCHDOG_ERROR); | |
2271 return array(); | |
2272 } | |
2273 // Delete the existing router since we have some data to replace it. | |
2274 db_query('DELETE FROM {menu_router}'); | |
2257 // Apply inheritance rules. | 2275 // Apply inheritance rules. |
2258 foreach ($menu as $path => $v) { | 2276 foreach ($menu as $path => $v) { |
2259 $item = &$menu[$path]; | 2277 $item = &$menu[$path]; |
2260 if (!$item['_tab']) { | 2278 if (!$item['_tab']) { |
2261 // Non-tab items. | 2279 // Non-tab items. |
2354 } | 2372 } |
2355 // Sort the masks so they are in order of descending fit, and store them. | 2373 // Sort the masks so they are in order of descending fit, and store them. |
2356 $masks = array_keys($masks); | 2374 $masks = array_keys($masks); |
2357 rsort($masks); | 2375 rsort($masks); |
2358 variable_set('menu_masks', $masks); | 2376 variable_set('menu_masks', $masks); |
2377 cache_set('router:', $menu, 'cache_menu'); | |
2359 return $menu; | 2378 return $menu; |
2360 } | 2379 } |
2361 | 2380 |
2362 /** | 2381 /** |
2363 * Returns TRUE if a path is external (e.g. http://example.com). | 2382 * Returns TRUE if a path is external (e.g. http://example.com). |