'admin/menu', 'title' => t('menus'), 'callback' => 'menu_overview', 'access' => user_access('administer menu')); $items[] = array('path' => 'admin/menu/item/edit', 'title' => t('edit menu item'), 'callback' => 'menu_edit_item', 'access' => user_access('administer menu'), 'type' => MENU_CALLBACK); $items[] = array('path' => 'admin/menu/item/reset', 'title' => t('reset menu item'), 'callback' => 'menu_reset_item', 'access' => user_access('administer menu'), 'type' => MENU_CALLBACK); $items[] = array('path' => 'admin/menu/item/disable', 'title' => t('disable menu item'), 'callback' => 'menu_disable_item', 'access' => user_access('administer menu'), 'type' => MENU_CALLBACK); $items[] = array('path' => 'admin/menu/item/delete', 'title' => t('delete menu item'), 'callback' => 'menu_delete_item', 'access' => user_access('administer menu'), 'type' => MENU_CALLBACK); $items[] = array('path' => 'admin/menu/list', 'title' => t('list'), 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10); $items[] = array('path' => 'admin/menu/menu/add', 'title' => t('add menu'), 'callback' => 'menu_add_menu', 'access' => user_access('administer menu'), 'type' => MENU_LOCAL_TASK); $items[] = array('path' => 'admin/menu/item/add', 'title' => t('add menu item'), 'callback' => 'menu_edit_item', 'access' => user_access('administer menu'), 'type' => MENU_LOCAL_TASK); $items[] = array('path' => 'admin/menu/reset', 'title' => t('reset menus'), 'callback' => 'menu_reset', 'access' => user_access('administer menu'), 'type' => MENU_LOCAL_TASK); $items[] = array('path' => 'admin/settings/menu', 'title' => t('menus'), 'callback' => 'menu_configure'); } return $items; } /** * Implementation of hook_help(). */ function menu_help($section) { switch ($section) { case 'admin/help#menu': $output = t('
The menu module allows for customization of the menus. Menus are useful for providing navigation in your site. The main menu for navigation is the navigation menu. Menus appear in blocks on your site.
You can
'. t('For more information please read the configuration and customization handbook Menu page.', array('%menu' => 'http://www.drupal.org/handbook/modules/menu/')) .'
'; return $output; case 'admin/modules#description': return t('Allows administrators to customize the site navigation menu.'); case 'admin/menu': return t('Select an operation from the list to move, change, or delete a menu item.
'); case 'admin/menu/menu/add': return t('Enter the name for your new menu. Remember to enable the newly created block in the blocks administration page.
', array('%blocks' => url('admin/block'))); case 'admin/menu/item/add': return t('Enter the title, path, position and the weight for your new menu item.
'); case 'admin/settings/menu': return t('Customize the menu settings.
'); } } /** * Menu callback; presents menu configuration options. */ function menu_configure() { $menu = menu_get_menu(); $primary_options[0] = t('No primary links'); foreach ($menu['items'][0]['children'] as $mid) { $primary_options[$mid] = $menu['items'][$mid]['title']; } $form['settings_links'] = array( '#type' => 'fieldset', '#title' => t('Primary links settings'), ); $form['settings_links']['intro'] = array( '#type' => 'item', '#value' => t('Primary links is a navigation system which usually (depending on your theme) appears at the top-right of the browser window. There are usually two rows of links, primary and secondary. You may control which links appear in this area by choosing a menu from which the links will be generated and then placing your links into the menu using the menu administration or the menu settings pane on each post authoring form.', array('%menu' => url('admin/menu'))), ); $form['settings_links']['menu_primary_menu'] = array( '#type' => 'select', '#title' => t('Menu containing primary links'), '#default_value' => variable_get('menu_primary_menu', 0), '#options' => $primary_options, ); $secondary_options[0] = t('No secondary links'); foreach ($menu['items'][0]['children'] as $mid) { $secondary_options[$mid] = $menu['items'][$mid]['title']; } $form['settings_links']['menu_secondary_menu'] = array( '#type' => 'select', '#title' => t('Menu containing secondary links'), '#default_value' => variable_get('menu_secondary_menu', 0), '#options' => $secondary_options, '#description' => t('If you select the same menu as primary links then secondary links will display the appropriate second level of your navigation hierarchy.'), ); $form['settings_authoring'] = array( '#type' => 'fieldset', '#title' => t('Post authoring form settings'), ); $form['settings_authoring']['intro'] = array( '#type' => 'item', '#value' => t('On each post authoring form there is a menu settings pane. This setting allows you to limit what is displayed in the parent item drop-down menu of that pane. This can be used to force new menu items to be created in the primary links menu or to hide admin menu items.'), ); $authoring_options = array(0 => t('Show all menus')); foreach ($menu['items'][0]['children'] as $mid) { $authoring_options[$mid] = $menu['items'][$mid]['title']; } $form['settings_authoring']['menu_parent_items'] = array( '#type' => 'select', '#title' => t('Restrict parent items to'), '#default_value' => variable_get('menu_parent_items', 0), '#options' => $authoring_options, '#description' => t('Choose the menu from which parent items will be made available. Only this menu item and its children will be shown.'), ); return system_settings_form('menu_configure', $form); } /** * Implementation of hook_block(). */ function menu_block($op = 'list', $delta = 0) { $menu = menu_get_menu(); if ($op == 'list') { $blocks = array(); foreach ($menu['items'][0]['children'] as $mid) { // Default "Navigation" block is handled by user.module. if ($mid != 1) { $blocks[$mid]['info'] = $menu['items'][$mid]['title']; } } return $blocks; } else if ($op == 'view') { $data['subject'] = $menu['items'][$delta]['title']; $data['content'] = theme('menu_tree', $delta); return $data; } } /** * Implementation of hook_nodeapi(). */ function menu_nodeapi(&$node, $op) { if (user_access('administer menu')) { switch ($op) { case 'insert': case 'update': if ($node->menu['delete']) { menu_node_form_delete($node); menu_rebuild(); } elseif ($node->menu['title']) { $node->menu['path'] = ($node->menu['path']) ? $node->menu['path'] : "node/$node->nid"; menu_edit_item_save($node->menu); menu_rebuild(); } break; case 'delete': menu_node_form_delete($node); menu_rebuild(); break; } } } /** * Implementation of hook_perm(). */ function menu_perm() { return array('administer menu'); } /** * Menu callback; present the main menu management page. */ function menu_overview() { menu_rebuild(); return menu_overview_tree(); } /** * Menu callback; clear the database, resetting the menu to factory defaults. */ function menu_reset() { $op = isset($_POST['op']) ? $_POST['op'] : ''; switch ($op) { case t('Reset all'): db_query('DELETE FROM {menu}'); $mid = menu_edit_item_save(array('title' => t('Primary menu links'), 'pid' => 0, 'type' => MENU_CUSTOM_MENU)); variable_set('menu_primary_menu', $mid); variable_set('menu_secondary_menu', $mid); drupal_set_message(t('The menu items have been reset to their default settings.')); drupal_goto('admin/menu'); break; default: return confirm_form('menu_confirm_reset', array(), t('Are you sure you want to reset all menu items to their default settings?'), 'admin/menu', t('Any custom additions or changes to the menu will be lost.'), t('Reset all')); } } /** * Menu callback; handle the adding of a new menu. */ function menu_add_menu() { $op = isset($_POST['op']) ? $_POST['op'] : ''; $edit = isset($_POST['edit']) ? $_POST['edit'] : ''; $output = ''; switch ($op) { case t('Submit'): menu_edit_item_validate($edit); if (!form_get_errors()) { menu_edit_item_save($edit); drupal_goto('admin/menu'); } // Fall through. default: $edit['pid'] = 0; $edit['type'] = MENU_CUSTOM_MENU; $output .= menu_edit_item_form($edit); } return $output; } /** * Menu callback; reset a single modified item. */ function menu_reset_item($mid) { $op = isset($_POST['op']) ? $_POST['op'] : ''; switch ($op) { case t('Reset'): db_query('DELETE FROM {menu} WHERE mid = %d', $mid); drupal_set_message(t("The menu item was reset to its default settings.")); drupal_goto('admin/menu'); break; default: $title = db_result(db_query('SELECT title FROM {menu} WHERE mid = %d', $mid)); return confirm_form('menu_item_confirm_reset', array(), t('Are you sure you want to reset the item %item to its default values?', array('%item' => theme('placeholder', $title))), 'admin/menu', t('Any customizations will be lost. This action cannot be undone.'), t('Reset')); } } /** * Menu callback; delete a single custom item. */ function menu_delete_item($mid) { $op = isset($_POST['op']) ? $_POST['op'] : ''; $result = db_query('SELECT type, title FROM {menu} WHERE mid = %d', $mid); $menu = db_fetch_object($result); if (!$menu) { drupal_goto('admin/menu'); } switch ($op) { case t('Delete'): db_query('DELETE FROM {menu} WHERE mid = %d', $mid); if ($menu->type & MENU_IS_ROOT) { drupal_set_message(t('The menu has been removed.')); } else { drupal_set_message(t('The menu item has been removed.')); } drupal_goto('admin/menu'); break; default: if ($menu->type & MENU_IS_ROOT) { $message = t('Are you sure you want to delete the menu %item?', array('%item' => theme('placeholder', $menu->title))); } else { $message = t('Are you sure you want to delete the custom menu item %item?', array('%item' => theme('placeholder', $menu->title))); } return confirm_form('menu_confirm_delete', $form, $message, 'admin/menu', t('This action cannot be undone.'), t('Delete')); } } /** * Menu callback; hide a menu item. */ function menu_disable_item($mid) { $menu = menu_get_menu(); $type = $menu['items'][$mid]['type']; $type &= ~MENU_VISIBLE_IN_TREE; $type &= ~MENU_VISIBLE_IN_BREADCRUMB; $type |= MENU_MODIFIED_BY_ADMIN; db_query('UPDATE {menu} SET type = %d WHERE mid = %d', $type, $mid); drupal_set_message(t('The menu item has been disabled.')); drupal_goto('admin/menu'); } /** * Menu callback; dispatch to the appropriate menu item edit function. */ function menu_edit_item($mid = 0) { $op = isset($_POST['op']) ? $_POST['op'] : ''; $edit = isset($_POST['edit']) ? $_POST['edit'] : ''; $output = ''; switch ($op) { case t('Submit'): menu_edit_item_validate($edit); if (!form_get_errors()) { menu_edit_item_save($edit); drupal_goto('admin/menu'); } $output .= menu_edit_item_form($edit); break; default: if ($mid > 0) { $item = db_fetch_object(db_query('SELECT * FROM {menu} WHERE mid = %d', $mid)); $edit['mid'] = $item->mid; $edit['pid'] = $item->pid; $edit['path'] = $item->path; $edit['title'] = $item->title; $edit['description'] = $item->description; $edit['weight'] = $item->weight; $edit['type'] = $item->type; } else { $edit['mid'] = 0; // In case a negative ID was passed in. $edit['pid'] = 1; // default to "Navigation" menu. $edit['type'] = MENU_CUSTOM_ITEM; } $output .= menu_edit_item_form($edit); } return $output; } /** * Present the menu item editing form. */ function menu_edit_item_form($edit) { $menu = menu_get_menu(); $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#default_value' => $edit['title'], '#description' => t('The name of the menu.'), '#required' => TRUE); if ($edit['pid'] == 0) { // Display a limited set of fields for menus (not items). $form['path'] = array('#type' => 'hidden', '#value' => ''); $form['pid'] = array('#type' => 'hidden', '#value' => 0); $form['weight'] = array('#type' => 'hidden', '#value' => 0); } else { $form['description'] = array('#type' => 'textfield', '#title' => t('Description'), '#default_value' => $edit['description'], '#description' => t('The description displayed when hovering over a menu item.')); $path_description = t('The Drupal path this menu item links to. Enter %front to link to the front page.', array('%front' => theme('placeholder', '