Mercurial > defr > drupal > core
comparison includes/menu.inc @ 5:2427550111ae 6.2
Drupal 6.2
author | Franck Deroche <webmaster@defr.org> |
---|---|
date | Tue, 23 Dec 2008 14:30:08 +0100 |
parents | 165d43f946a8 |
children | fff6d4c8c043 |
comparison
equal
deleted
inserted
replaced
4:d94886ac61a0 | 5:2427550111ae |
---|---|
1 <?php | 1 <?php |
2 // $Id: menu.inc,v 1.255.2.9 2008/02/27 12:12:01 goba Exp $ | 2 // $Id: menu.inc,v 1.255.2.11 2008/04/09 21:11:44 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 */ |
770 function menu_tree_all_data($menu_name = 'navigation', $item = NULL) { | 770 function menu_tree_all_data($menu_name = 'navigation', $item = NULL) { |
771 static $tree = array(); | 771 static $tree = array(); |
772 | 772 |
773 // Use $mlid as a flag for whether the data being loaded is for the whole tree. | 773 // Use $mlid as a flag for whether the data being loaded is for the whole tree. |
774 $mlid = isset($item['mlid']) ? $item['mlid'] : 0; | 774 $mlid = isset($item['mlid']) ? $item['mlid'] : 0; |
775 // Generate the cache ID. | 775 // Generate a cache ID (cid) specific for this $menu_name and $item. |
776 $cid = 'links:'. $menu_name .':all:'. $mlid; | 776 $cid = 'links:'. $menu_name .':all-cid:'. $mlid; |
777 | 777 |
778 if (!isset($tree[$cid])) { | 778 if (!isset($tree[$cid])) { |
779 // If the static variable doesn't have the data, check {cache_menu}. | 779 // If the static variable doesn't have the data, check {cache_menu}. |
780 $cache = cache_get($cid, 'cache_menu'); | 780 $cache = cache_get($cid, 'cache_menu'); |
781 if ($cache && isset($cache->data)) { | 781 if ($cache && isset($cache->data)) { |
782 $data = $cache->data; | 782 // If the cache entry exists, it will just be the cid for the actual data. |
783 } | 783 // This avoids duplication of large amounts of data. |
784 else { | 784 $cache = cache_get($cache->data, 'cache_menu'); |
785 if ($cache && isset($cache->data)) { | |
786 $data = $cache->data; | |
787 } | |
788 } | |
789 // If the tree data was not in the cache, $data will be NULL. | |
790 if (!isset($data)) { | |
785 // Build and run the query, and build the tree. | 791 // Build and run the query, and build the tree. |
786 if ($mlid) { | 792 if ($mlid) { |
787 // The tree is for a single item, so we need to match the values in its | 793 // The tree is for a single item, so we need to match the values in its |
788 // p columns and 0 (the top level) with the plid values of other links. | 794 // p columns and 0 (the top level) with the plid values of other links. |
789 $args = array(0); | 795 $args = array(0); |
811 FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path | 817 FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path |
812 WHERE ml.menu_name = '%s'". $where ." | 818 WHERE ml.menu_name = '%s'". $where ." |
813 ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC", $args), $parents); | 819 ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC", $args), $parents); |
814 $data['node_links'] = array(); | 820 $data['node_links'] = array(); |
815 menu_tree_collect_node_links($data['tree'], $data['node_links']); | 821 menu_tree_collect_node_links($data['tree'], $data['node_links']); |
816 // Cache the data. | 822 // Cache the data, if it is not already in the cache. |
817 cache_set($cid, $data, 'cache_menu'); | 823 $tree_cid = _menu_tree_cid($menu_name, $data); |
824 if (!cache_get($tree_cid, 'cache_menu')) { | |
825 cache_set($tree_cid, $data, 'cache_menu'); | |
826 } | |
827 // Cache the cid of the (shared) data using the menu and item-specific cid. | |
828 cache_set($cid, $tree_cid, 'cache_menu'); | |
818 } | 829 } |
819 // Check access for the current user to each item in the tree. | 830 // Check access for the current user to each item in the tree. |
820 menu_tree_check_access($data['tree'], $data['node_links']); | 831 menu_tree_check_access($data['tree'], $data['node_links']); |
821 $tree[$cid] = $data['tree']; | 832 $tree[$cid] = $data['tree']; |
822 } | 833 } |
842 function menu_tree_page_data($menu_name = 'navigation') { | 853 function menu_tree_page_data($menu_name = 'navigation') { |
843 static $tree = array(); | 854 static $tree = array(); |
844 | 855 |
845 // Load the menu item corresponding to the current page. | 856 // Load the menu item corresponding to the current page. |
846 if ($item = menu_get_item()) { | 857 if ($item = menu_get_item()) { |
847 // Generate the cache ID. | 858 // Generate a cache ID (cid) specific for this page. |
848 $cid = 'links:'. $menu_name .':page:'. $item['href'] .':'. (int)$item['access']; | 859 $cid = 'links:'. $menu_name .':page-cid:'. $item['href'] .':'. (int)$item['access']; |
849 | 860 |
850 if (!isset($tree[$cid])) { | 861 if (!isset($tree[$cid])) { |
851 // If the static variable doesn't have the data, check {cache_menu}. | 862 // If the static variable doesn't have the data, check {cache_menu}. |
852 $cache = cache_get($cid, 'cache_menu'); | 863 $cache = cache_get($cid, 'cache_menu'); |
853 if ($cache && isset($cache->data)) { | 864 if ($cache && isset($cache->data)) { |
854 $data = $cache->data; | 865 // If the cache entry exists, it will just be the cid for the actual data. |
855 } | 866 // This avoids duplication of large amounts of data. |
856 else { | 867 $cache = cache_get($cache->data, 'cache_menu'); |
868 if ($cache && isset($cache->data)) { | |
869 $data = $cache->data; | |
870 } | |
871 } | |
872 // If the tree data was not in the cache, $data will be NULL. | |
873 if (!isset($data)) { | |
857 // Build and run the query, and build the tree. | 874 // Build and run the query, and build the tree. |
858 if ($item['access']) { | 875 if ($item['access']) { |
859 // Check whether a menu link exists that corresponds to the current path. | 876 // Check whether a menu link exists that corresponds to the current path. |
860 $args = array($menu_name, $item['href']); | 877 $args = array($menu_name, $item['href']); |
861 $placeholders = "'%s'"; | 878 $placeholders = "'%s'"; |
907 FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path | 924 FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path |
908 WHERE ml.menu_name = '%s' AND ml.plid IN (". $placeholders .") | 925 WHERE ml.menu_name = '%s' AND ml.plid IN (". $placeholders .") |
909 ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC", $args), $parents); | 926 ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC", $args), $parents); |
910 $data['node_links'] = array(); | 927 $data['node_links'] = array(); |
911 menu_tree_collect_node_links($data['tree'], $data['node_links']); | 928 menu_tree_collect_node_links($data['tree'], $data['node_links']); |
912 // Cache the data. | 929 // Cache the data, if it is not already in the cache. |
913 cache_set($cid, $data, 'cache_menu'); | 930 $tree_cid = _menu_tree_cid($menu_name, $data); |
931 if (!cache_get($tree_cid, 'cache_menu')) { | |
932 cache_set($tree_cid, $data, 'cache_menu'); | |
933 } | |
934 // Cache the cid of the (shared) data using the page-specific cid. | |
935 cache_set($cid, $tree_cid, 'cache_menu'); | |
914 } | 936 } |
915 // Check access for the current user to each item in the tree. | 937 // Check access for the current user to each item in the tree. |
916 menu_tree_check_access($data['tree'], $data['node_links']); | 938 menu_tree_check_access($data['tree'], $data['node_links']); |
917 $tree[$cid] = $data['tree']; | 939 $tree[$cid] = $data['tree']; |
918 } | 940 } |
919 return $tree[$cid]; | 941 return $tree[$cid]; |
920 } | 942 } |
921 | 943 |
922 return array(); | 944 return array(); |
945 } | |
946 | |
947 /** | |
948 * Helper function - compute the real cache ID for menu tree data. | |
949 */ | |
950 function _menu_tree_cid($menu_name, $data) { | |
951 return 'links:'. $menu_name .':tree-data:'. md5(serialize($data)); | |
923 } | 952 } |
924 | 953 |
925 /** | 954 /** |
926 * Recursive helper function - collect node links. | 955 * Recursive helper function - collect node links. |
927 */ | 956 */ |
2244 $item['tab_parent'] = $parent_path; | 2273 $item['tab_parent'] = $parent_path; |
2245 } | 2274 } |
2246 if (!isset($item['tab_root']) && !$parent['_tab']) { | 2275 if (!isset($item['tab_root']) && !$parent['_tab']) { |
2247 $item['tab_root'] = $parent_path; | 2276 $item['tab_root'] = $parent_path; |
2248 } | 2277 } |
2249 // If a callback is not found, we try to find the first parent that | 2278 // If an access callback is not found for a default local task we use |
2250 // has a callback. | 2279 // the callback from the parent, since we expect them to be identical. |
2251 if (!isset($item['access callback']) && isset($parent['access callback'])) { | 2280 // In all other cases, the access parameters must be specified. |
2281 if (($item['type'] == MENU_DEFAULT_LOCAL_TASK) && !isset($item['access callback']) && isset($parent['access callback'])) { | |
2252 $item['access callback'] = $parent['access callback']; | 2282 $item['access callback'] = $parent['access callback']; |
2253 if (!isset($item['access arguments']) && isset($parent['access arguments'])) { | 2283 if (!isset($item['access arguments']) && isset($parent['access arguments'])) { |
2254 $item['access arguments'] = $parent['access arguments']; | 2284 $item['access arguments'] = $parent['access arguments']; |
2255 } | 2285 } |
2256 } | 2286 } |