Do not disable this module without first going to administration settings and clicking "deactivate menus."', array('%settings' => url('admin/settings/administration'))); case 'admin/settings/administration': return t('IMPORTANT! Before deactivating this module click the "Deactivate" button on this page. If you deactivate this module BEFORE clicking the "Deactivate" button on this page you will need to reactivate the administration module by going to url "admin/modules" and then return here and click "Deactivate".'); } } /** * Implementation of hook_menu(). */ function administration_menu($may_cache) { if ($may_cache) { $access = user_access('administer site configuration'); $top_path = 'sadmin'; if (variable_get('administration_module_active', FALSE)) { $config = administration_menu_config(); if ($config['top_path']) { $top_path = $config['top_path']; } $items[] = array( 'path' => $top_path, 'title' => t('administer site'), 'description' => t('Manage your site'), 'access' => $access, 'callback' => '_administration_dashboard_page', 'weight' => 9 ); } else { $items[] = array( 'path' => $top_path, 'title' => t('administer site'), 'access' => $access, 'description' => t('Manage your site'), 'pid' => 0, 'type' => MENU_CUSTOM_MENU, 'callback' => '_administration_dashboard_page', 'weight' => 9 ); } $items[] = array( 'path' => 'admin/settings/administration', 'title' => t('administration'), 'access' => $access, 'callback' => 'administration_form' ); $items[] = array( 'path' => "$top_path/panelshift", 'access' => $access, 'callback' => 'administration_move_panel', 'type' => MENU_CALLBACK, ); $items[] = array( 'path' => "$top_path/offsite", 'title' => t('administration'), 'access' => $access, 'callback' => 'administration_offsite', 'type' => MENU_CALLBACK ); if (variable_get('administration_module_active', FALSE)) { $menu_weight = -10; // Redefine the 'admin' menu here as a callback to get rid of it in the menu // we need to do this so 'logs' doesn't show up twice $items[] = array( 'path' => 'admin', 'type' => MENU_CALLBACK ); foreach ($config['section'] as $section_path => $section) { if ($section['callback']) { $items[] = array( 'path' => $section_path, 'title' => $section['title'], 'description' => $section['description'], 'access' => $access, 'callback' => $section['callback'], 'callback arguments' => $section['callback arguments'], 'type' => ($section['callback'] == '_administration_sub_dashboard_page' ? MENU_ITEM_GROUPING : MENU_NORMAL_ITEM), 'weight' => isset($section['weight']) ? $section['weight'] : $menu_weight++, ); $item_weight = 0; foreach ((array) $section['items'] as $item_path => $item_info) { if ($item_info['callback']) { $items[] = array( 'path' => $item_path, 'title' => $item_info['title'], 'description' => $item_info['description'], 'access' => $access, 'callback' => $item_info['callback'], 'callback arguments' => $item_info['callback arguments'], 'type' => MENU_NORMAL_ITEM, 'weight' => isset($item_info['weight']) ? $item_info['weight'] : $item_weight++, ); } } } } } } return $items; } // ------------------------------------------------------------------------ // Menu callbacks /** * Display a 'sub' page which is a more in-depth look at a given section. */ function _administration_sub_dashboard_page() { _administration_set_head(); $config = administration_menu_config(); $mid = menu_get_active_item(); $menu = menu_get_menu(); $path = $menu['items'][$mid]['path']; $panels[$path] = $config['section'][$path]; $output .= theme('administration_dashboard_container', $panels, $panels[$path]['sub_panel_css'], 'sub_panel_theme', $config['default']['sub_panel_theme']); return $output; } /** * Display a dashboard page. */ function _administration_dashboard_page() { $config = administration_menu_config(); _administration_set_head(); $panel_list = variable_get('administration_panels', $config['dashboard']); foreach ($panel_list as $dashboard_id => $panel_ids) { $panels = array(); foreach ($panel_ids as $panel_id) { $panels[$panel_id] = $config['section'][$panel_id]; } $output .= theme('administration_dashboard_container', $panels, $dashboard_id); } return $output; } /** * Special link in order to have offsite links in the menu system. */ function administration_offsite() { $args = func_get_args(); $dest = implode('/', $args); drupal_goto($dest); } /** * Display the form that turns on and off the menu configuration. */ function administration_form() { if (!module_exist('menu')) { drupal_set_message(t('IMPORTANT! The "Menu" must be enabled BEFORE you activate this module!'), 'error'); } if (variable_get('administration_module_active', FALSE)) { $config = administration_menu_config(); if (function_exists('administration_form_' . variable_get('administration_config', 'default'))) { $form[variable_get('administration_config', 'default')] = call_user_func('administration_form_' . variable_get('administration_config', 'default'), $form); } } else { $files = system_listing('\.inc$', drupal_get_path('module', 'administration'), 'name', 0); foreach ($files as $file => $info) { $options[$file] = $file; } $form['administration_config'] = array( '#type' => 'radios', '#title' => t('Configuration profile'), '#default_value' => variable_get('administration_config', 'default'), '#options' => $options, ); } $form['administration_module_active'] = array( '#type' => 'radios', '#title' => t('Administration menus'), '#default_value' => variable_get('administration_module_active', FALSE), '#options' => array(t('Disabled'), t('Enabled')), '#description' => t('Activate administration menus and dashboard.') ); $form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration')); return drupal_get_form('administration_form', $form); } /** * Submit function for the administration form. */ function administration_form_submit($formid, $form_values) { // Retrieve module state before saving changes $already_active = variable_get('administration_module_active', FALSE); if ($form_values['administration_config']) { variable_set('administration_config', $form_values['administration_config']); } if ($form_values['administration_module_active']) { if (!$already_active) { variable_set('administration_module_active', TRUE); // force a menu_rebuild to get the right menu sections. // Yes, this means menu_rebuild is performed twice. menu_rebuild(); _administration_activate_menus(); } } else { if ($already_active){ variable_set('administration_module_active', FALSE); _administration_deactivate_menus(); } } if (function_exists('administration_form_submit_' . variable_get('administration_config', 'default'))) { call_user_func('administration_form_submit_' . variable_get('administration_config', 'default'), $formid, $form_values); } } /** * De-activates custom menus */ function _administration_deactivate_menus() { _administration_unset_menus(); variable_del('administration_panels'); } /** * Activates custom menus */ function _administration_activate_menus() { _administration_set_menus(); } /** * Callback exists because we have some funky special handling with admin/settings. */ function _administration_settings_page() { if (arg(2) != NULL) { $args = func_get_args(); return call_user_func_array('system_site_settings', $args); } else { return _administration_sub_dashboard_page(); } } /** * Menu callback to allow dashboard panels to be moved */ function administration_move_panel($container, $panel, $direction) { $config = administration_menu_config(); $panel_list = variable_get('administration_panels', $config['dashboard']); $dashboard = "dashboard-container$container"; switch ($direction) { case 'swap': $dest = $container % 2 + 1; // silly math tricks $panel_list["dashboard-container$dest"][] = $panel_list[$dashboard][$panel]; unset($panel_list[$dashboard][$panel]); $panel_list[$dashboard] = array_values($panel_list[$dashboard]); // reindex break; case 'up': _administration_swap($panel_list[$dashboard], $panel, $panel - 1); break; case 'down': _administration_swap($panel_list[$dashboard], $panel, $panel + 1); break; } variable_set('administration_panels', $panel_list); drupal_goto(referer_uri()); } // ------------------------------------------------------------------------ // Configuration /** * Gets the current menu config. Caching it for performance. */ function administration_menu_config() { static $config = NULL; if (!$config) { $config_file = variable_get('administration_config', 'default'); $filename = drupal_get_path('module', 'administration') . "/" . $config_file . ".inc"; include_once $filename; // this'll be defined in the .inc $config = _administration_menu_config(); } return $config; } /** * Add the CSS file for our menu system into the stream. */ function _administration_set_head() { $config = administration_menu_config(); $cssfile = $config['cssfile'] ? $config['cssfile'] : 'default.css'; $path = drupal_get_path('module','administration') . '/'; theme_add_style($path . $cssfile); } /** * Helper function to swap places in an array */ function _administration_swap(&$arr, $a, $b) { $temp = $arr[$a]; $arr[$a] = $arr[$b]; $arr[$b] = $temp; } // ------------------------------------------------------------------------ // Menu re-organization /** * Reset the menus according to the config file. */ function _administration_set_menus() { $config = administration_menu_config(); foreach ($config['section'] as $section_path => $section) { if (is_array($section['items'])) { $weight = -10; foreach ($section['items'] as $path => $info) { _administration_reparent_menu_item($path, $section_path, $info['title'], $info['description'], isset($info['weight']) ? $info['weight'] : $weight++); } } } menu_rebuild(); if ($config['after_build']) { call_user_func($config['after_build'], $config); } } /** * Return the menus to a default state. */ function _administration_unset_menus() { $menu = menu_get_menu(); $config = administration_menu_config(); $top_path = $config['top_path'] ? $config['top_path'] : 'sadmin'; _administration_unset_menu_item($menu['path index'][$top_path]); menu_rebuild(); } /** * Move a menu item from its original location to our new administrative paths. */ function _administration_reparent_menu_item ($path, $new_path, $title = NULL, $desc = NULL, $weight = NULL) { $menu = menu_get_menu(); $pid = $menu['path index'][$new_path]; if (!empty($menu['path index'][$path])) { $mid = $menu['path index'][$path]; $type = $menu['items'][$mid]['type'] | MENU_MODIFIED_BY_ADMIN; if (empty($title)) { $title = $menu['items'][$mid]['title']; } if (empty($desc) && isset($menu['items'][$mid]['description'])) { $desc = $menu['items'][$mid]['description']; } if (empty($weight)) { $weight = $menu['items'][$mid]['weight']; } db_query("UPDATE {menu} SET pid = %d, title = '%s', description = '%s', weight = %d, type = %d WHERE mid = %d", $pid, $title, $desc, $weight, $type, $mid); } else { $mid = db_next_id('{menu}_mid'); $type = MENU_NORMAL_ITEM | MENU_MODIFIED_BY_ADMIN; db_query("INSERT INTO {menu} (mid, pid, path, title, description, weight, type) VALUES (%d, %d, '%s', '%s', '%s', %d, %d)", $mid, $pid, $path, $title, $desc, $weight, $type); } return; } /** * Return a single menu item to its basic state. */ function _administration_unset_menu_item($pid){ db_query('DELETE FROM {menu} WHERE pid = %d', $pid); $menu = menu_get_menu(); foreach ((array) $menu['items'][$pid]['children'] as $cid) { if (!empty($menu['items'][$cid]) && $menu['items'][$cid]['children']) { _administration_unset_menu_item($cid); } } variable_set('administration_module_active', FALSE); } // ------------------------------------------------------------------------ // Themables and display. /** * Display a dashboard container. Relies heavily on callbacks from the .inc file. */ function theme_administration_dashboard_container($panels, $css_class = NULL, $theme = 'panel_theme', $default_theme = NULL) { if (!$default_theme) { $default_theme = 'administration_sub_menu_panel'; } $output = '
'; $i = 0; $total = count($panels); foreach ($panels as $id => $panel) { $theme_func = $panel[$theme]; if (!$theme_func) { $theme_func = $panel['panel_theme']; } if (!$theme_func) { $theme_func = $default_theme; } $output .= theme($theme_func, $id, $css_class, $i, $total); $i++; } $output .= '
'; return $output; }