Skip navigation

Menu system

  1. drupal
    1. 6 drupal/includes/
    2. 7 drupal/includes/

Define the navigation menus, and route page requests to code based on URLs.

The Drupal menu system drives both the navigation system from a user perspective and the callback system that Drupal uses to respond to URLs passed from the browser. For this reason, a good understanding of the menu system is fundamental to the creation of complex modules. As a note, this is related to, but separate from menu.module, which allows menus (which in this context are hierarchical lists of links) to be customized from the Drupal administrative interface.

Drupal's menu system follows a simple hierarchy defined by paths. Implementations of hook_menu() define menu items and assign them to paths (which should be unique). The menu system aggregates these items and determines the menu hierarchy from the paths. For example, if the paths defined were a, a/b, e, a/b/c/d, f/g, and a/b/h, the menu system would form the structure:

  • a

    • a/b

      • a/b/c/d
      • a/b/h
  • e
  • f/g

Note that the number of elements in the path does not necessarily determine the depth of the menu item in the tree.

When responding to a page request, the menu system looks to see if the path requested by the browser is registered as a menu item with a callback. If not, the system searches up the menu tree for the most complete match with a callback it can find. If the path a/b/i is requested in the tree above, the callback for a/b would be used.

The found callback function is called with any arguments specified in the "page arguments" attribute of its menu item. The attribute must be an array. After these arguments, any remaining components of the path are appended as further arguments. In this way, the callback for a/b above could respond to a request for a/b/i differently than a request for a/b/j.

For an illustration of this process, see page_example.module.

Access to the callback functions is also protected by the menu system. The "access callback" with an optional "access arguments" of each menu item is called before the page callback proceeds. If this returns TRUE, then access is granted; if FALSE, then access is denied. Default local task menu items (see next paragraph) may omit this attribute to use the value provided by the parent item.

In the default Drupal interface, you will notice many links rendered as tabs. These are known in the menu system as "local tasks", and they are rendered as tabs by default, though other presentations are possible. Local tasks function just as other menu items in most respects. It is convention that the names of these tasks should be short verbs if possible. In addition, a "default" local task should be provided for each set. When visiting a local task's parent menu item, the default local task will be rendered as if it is selected; this provides for a normal tab user experience. This default task is special in that it links not to its provided path, but to its parent item's path instead. The default task's path is only used to place it appropriately in the menu hierarchy.

Everything described so far is stored in the menu_router table. The menu_links table holds the visible menu links. By default these are derived from the same hook_menu definitions, however you are free to add more with menu_link_save().

Functions & methods

drupal_help_argGenerates elements for the $arg array in the help hook.
menu_build_treeBuild a menu tree, translate links, and check access.
menu_cache_clearClears the cached cached data for a single named menu.
menu_cache_clear_allClears all cached menu data. This should be called any time broad changes might have been made to the router items or menu links.
menu_contextual_linksRetrieve contextual links for a system object based on registered local tasks.
menu_delete_linksDeletes all links for a menu.
menu_execute_active_handlerExecute the page callback associated with the current path.
menu_get_active_breadcrumbGet the breadcrumb for the current page, as determined by the active trail.
menu_get_active_helpReturns the help associated with the active menu item.
menu_get_active_menu_namesGet the active menu for the current page - determines the active trail.
menu_get_active_titleGet the title of the current page, as determined by the active trail.
menu_get_active_trailGets the active trail (path to root menu root) of the current page.
menu_get_ancestorsReturns the ancestors (and relevant placeholders) for any given path.
menu_get_custom_themeGets the custom theme for the current page, if there is one.
menu_get_itemGet a router item.
menu_get_namesBuild a list of named menus.
menu_get_objectGet a loaded object from a router item.
menu_get_routerGet the menu router.
menu_links_cloneClone an array of menu links.
menu_link_children_relative_depthFind the depth of an item's children relative to its depth.
menu_link_deleteDelete one or several menu links.
menu_link_get_preferredLookup the preferred menu link for a given system path.
menu_link_loadGet a menu link by its mlid, access checked and link translated for rendering.
menu_link_maintainInsert, update or delete an uncustomized menu link related to a module.
menu_link_saveSaves a menu link.
menu_list_system_menusReturn an array containing the names of system-defined (default) menus.
menu_load_linksReturns an array containing all links for a menu.
menu_local_actionsReturns the rendered local actions at the current level.
menu_local_tabsReturns a renderable element for the primary and secondary tabs.
menu_local_tasksCollects the local tasks (tabs), action links, and the root path.
menu_main_menuReturn an array of links to be rendered as the Main menu.
menu_navigation_linksReturn an array of links for a navigation menu.
menu_primary_local_tasksReturns the rendered local tasks at the top level.
menu_rebuild(Re)populate the database tables used by various menu functions.
menu_reset_static_cacheResets the menu system static cache.
menu_router_buildCollect and alter the menu definitions.
menu_secondary_local_tasksReturns the rendered local tasks at the second level.
menu_secondary_menuReturn an array of links to be rendered as the Secondary links.
menu_set_active_itemSet the active path, which determines which page is loaded.
menu_set_active_menu_namesSet (or get) the active menu for the current page - determines the active trail.
menu_set_active_trailSets or gets the active trail (path to menu tree root) of the current page.
menu_set_custom_themeSets a custom theme for the current page, if there is one.
menu_set_itemReplaces the statically cached item for a given path.
menu_tab_root_pathReturns the router path, or the path of the parent tab of a default local task.
menu_tail_loadLoads path as one string from the argument we are currently at.
menu_tail_to_argReturns path as one string from the argument we are currently at.
menu_treeRenders a menu tree based on the current path.
menu_tree_all_dataGet the data structure representing a named menu tree.
menu_tree_check_accessCheck access and perform other dynamic operations for each link in the tree.
menu_tree_collect_node_linksRecursive helper function - collect node links.
menu_tree_dataBuild the data representing a menu tree.
menu_tree_outputReturns a rendered menu tree.
menu_tree_page_dataGet the data structure representing a named menu tree, based on the current page.
menu_unserializeUnserializes menu data, using a map to replace path elements.
template_preprocess_menu_treePreprocesses the rendered tree for theme_menu_tree().
theme_menu_linkReturns HTML for a menu link and submenu.
theme_menu_local_actionReturns HTML for a single local action link.
theme_menu_local_taskReturns HTML for a single local task link.
theme_menu_local_tasksReturns HTML for primary and secondary local tasks.
theme_menu_treeReturns HTML for a wrapper for a menu sub-tree.
_menu_build_treeBuild a menu tree.
_menu_check_accessCheck access to a menu item using the access callback
_menu_clear_page_cacheHelper function to clear the page and block caches at most twice per page load.
_menu_delete_itemHelper function for menu_link_delete; deletes a single menu link.
_menu_find_router_pathFind the router path which will serve this path.
_menu_item_localizeLocalize the router item title using t() or another callback.
_menu_link_buildBuilds a link from a router item.
_menu_link_find_parentFind a possible parent for a given menu link.
_menu_link_map_translateThis function translates the path elements in the map using any to_arg helper function. These functions take an argument and return an object. See for more information.
_menu_link_move_childrenUpdate the children of a menu link that's being moved.
_menu_link_parents_setHelper function that sets the p1..p9 values for a menu link being saved.
_menu_link_translateThis function is similar to _menu_translate() but does link-specific preparation such as always calling to_arg functions
_menu_load_objectsLoads objects into the map as defined in the $item['load_functions'].
_menu_navigation_links_rebuildHelper function to build menu links for the items in the menu router.
_menu_router_buildHelper function to build the router table based on the data from hook_menu.
_menu_router_cacheHelper function to store the menu router if we have it in memory.
_menu_router_saveHelper function to save data from menu_router_build() to the router table.
_menu_set_expanded_menusHelper function to update a list of menus with expanded items
_menu_site_is_offlineChecks whether the site is in maintenance mode.
_menu_translateHandles dynamic path translation and menu access control.
_menu_tree_check_accessRecursive helper function for menu_tree_check_access()
_menu_tree_dataRecursive helper function to build the data representing a menu tree.
_menu_update_parental_statusCheck and update the has_children status for the parent of a link.


MENU_ACCESS_DENIEDInternal menu status code -- Menu item access is denied.
MENU_CALLBACKMenu type -- A hidden, internal callback, typically used for API calls.
MENU_CONTEXT_INLINEInternal menu flag: Local task should be displayed inline.
MENU_CONTEXT_NONEInternal menu flag: Invisible local task.
MENU_CONTEXT_PAGEInternal menu flag: Local task should be displayed in page context.
MENU_CREATED_BY_ADMINInternal menu flag -- menu item was created by administrator.
MENU_DEFAULT_LOCAL_TASKMenu type -- The "default" local task, which is initially active.
MENU_FOUNDInternal menu status code -- Menu item was found.
MENU_IS_LOCAL_ACTIONInternal menu flag -- menu item is a local action.
MENU_IS_LOCAL_TASKInternal menu flag -- menu item is a local task.
MENU_IS_ROOTInternal menu flag -- menu item is the root of the menu tree.
MENU_LINKS_TO_PARENTInternal menu flag -- menu item links back to its parent.
MENU_LOCAL_ACTIONMenu type -- An action specific to the parent, usually rendered as a link.
MENU_LOCAL_TASKMenu type -- A task specific to the parent item, usually rendered as a tab.
MENU_MAX_DEPTHThe maximum depth of a menu links tree - matches the number of p columns.
MENU_MAX_PARTSThe maximum number of path elements for a menu callback
MENU_MODIFIED_BY_ADMINInternal menu flag -- menu item can be modified by administrator.
MENU_NORMAL_ITEMMenu type -- A "normal" menu item that's shown in menu and breadcrumbs.
MENU_NOT_FOUNDInternal menu status code -- Menu item was not found.
MENU_SITE_OFFLINEInternal menu status code -- Menu item inaccessible because site is offline.
MENU_SITE_ONLINEInternal menu status code -- Everything is working fine.
MENU_SUGGESTED_ITEMMenu type -- A normal menu item, hidden until enabled by an administrator.
MENU_VISIBLE_IN_BREADCRUMBInternal menu flag -- menu item is visible in the breadcrumb.
MENU_VISIBLE_IN_TREEInternal menu flag -- menu item is visible in the menu tree.


Menu context typesFlags for use in the "context" attribute of menu router items.
Menu flagsFlags for use in the "type" attribute of menu items.
Menu item typesDefinitions for various menu item types.
Menu status codesStatus codes for menu callbacks.
Menu tree parametersParameters for a menu tree.


drupal/includes/, line 8
API for the Drupal menu system.