diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 960321085239e8c81c8a5551bbe87db71c9c0506..ef6c7d099fc2bf6aa6aed0ee168720c42cd55034 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -43,6 +43,8 @@ Drupal 6.0, xxxx-xx-xx (development version) - Added the HTML corrector filter: * Fixes faulty and chopped off HTML in postings. * Tags are now automatically closed at the end of the teaser. +- Performance: + * Made it easier to conditionally load include files. Drupal 5.0, 2007-01-15 ---------------------- diff --git a/includes/menu.inc b/includes/menu.inc index bd063f6cca4e36345337d42c5a8dea9281a33edd..0750dddcccd5e2ba4cb6fdde358ffe340fc70452 100644 --- a/includes/menu.inc +++ b/includes/menu.inc @@ -306,7 +306,15 @@ function menu_get_item($path = NULL) { */ function menu_execute_active_handler() { if ($item = menu_get_item()) { - return $item->access ? call_user_func_array($item->page_callback, $item->page_arguments) : MENU_ACCESS_DENIED; + if ($item->access) { + if ($item->file) { + include_once($item->file); + } + return call_user_func_array($item->page_callback, $item->page_arguments); + } + else { + return MENU_ACCESS_DENIED; + } } return MENU_NOT_FOUND; } @@ -1060,7 +1068,17 @@ function menu_rebuild() { */ function menu_router_build() { db_query('DELETE FROM {menu_router}'); - $callbacks = module_invoke_all('menu'); + // We need to manually call each module so that we can know which module a given item came from. + $callbacks = array(); + foreach (module_implements('menu') as $module) { + $items = call_user_func($module . '_menu'); + if (isset($items) && is_array($items)) { + foreach (array_keys($items) as $path) { + $items[$path]['module'] = $module; + } + $callbacks = array_merge($callbacks, $items); + } + } // Alter the menu as defined in modules, keys are like user/%user. drupal_alter('menu', $callbacks); $menu = _menu_router_build($callbacks); @@ -1380,6 +1398,12 @@ function _menu_router_build($callbacks) { if (!isset($item['page arguments']) && isset($parent['page arguments'])) { $item['page arguments'] = $parent['page arguments']; } + if (!isset($item['file']) && isset($parent['file'])) { + $item['file'] = $parent['file']; + } + if (!isset($item['file path']) && isset($parent['file path'])) { + $item['file path'] = $parent['file path']; + } } } } @@ -1403,23 +1427,33 @@ function _menu_router_build($callbacks) { 'tab_parent' => '', 'tab_root' => $path, 'path' => $path, + 'file' => '', + 'file path' => '', + 'include file' => '', ); + + // Calculate out the file to be included for each callback, if any. + if ($item['file']) { + $file_path = $item['file path'] ? $item['file path'] : drupal_get_path('module', $item['module']); + $item['include file'] = $file_path . '/' . $item['file']; + } + db_query("INSERT INTO {menu_router} (path, load_functions, to_arg_functions, access_callback, access_arguments, page_callback, page_arguments, fit, number_parts, tab_parent, tab_root, title, title_callback, title_arguments, - type, block_callback, description, position, weight) + type, block_callback, description, position, weight, file) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', - %d, '%s', '%s', '%s', %d)", + %d, '%s', '%s', '%s', %d, '%s')", $path, $item['load_functions'], $item['to_arg_functions'], $item['access callback'], serialize($item['access arguments']), $item['page callback'], serialize($item['page arguments']), $item['_fit'], $item['_number_parts'], $item['tab_parent'], $item['tab_root'], $item['title'], $item['title callback'], serialize($item['title arguments']), - $item['type'], $item['block callback'], $item['description'], $item['position'], $item['weight']); + $item['type'], $item['block callback'], $item['description'], $item['position'], $item['weight'], $item['include file']); } return $menu; } diff --git a/modules/node/node.module b/modules/node/node.module index 916018c807ea22d501a6d5946afa7a9ce7d47468..e0dcfc8d87fd0ca3f42aac269c3cf23a1f2e6b34 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -1135,6 +1135,8 @@ function node_menu() { 'weight' => -10, 'page callback' => 'system_admin_menu_block_page', 'access arguments' => array('administer site configuration'), + 'file' => 'system.admin.inc', + 'file path' => drupal_get_path('module', 'system'), ); $items['admin/content/node'] = array( diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc new file mode 100644 index 0000000000000000000000000000000000000000..41ed65edb170e1ccfbc25fe0adee0c74b7c82b54 --- /dev/null +++ b/modules/system/system.admin.inc @@ -0,0 +1,52 @@ +<?php + +/** + * Provide the administration overview page. + */ +function system_main_admin_page($arg = NULL) { + // If we received an argument, they probably meant some other page. + // Let's 404 them since the menu system cannot be told we do not + // accept arguments. + if (isset($arg) && substr($arg, 0, 3) != 'by-') { + return drupal_not_found(); + } + + // Check for status report errors. + if (system_status(TRUE)) { + drupal_set_message(t('One or more problems were detected with your Drupal installation. Check the <a href="@status">status report</a> for more information.', array('@status' => url('admin/logs/status'))), 'error'); + } + $result = db_query("SELECT * FROM {menu_links} ml INNER JOIN {menu_router} m ON ml.router_path = m.path + WHERE ml.href like 'admin/%' AND ml.href != 'admin/help' AND ml.depth = 2 AND ml.menu_name = 'navigation' + ORDER BY p1 ASC, p2 ASC, p3 ASC"); + while ($item = db_fetch_object($result)) { + _menu_link_translate($item); + if (!$item->access) { + continue; + } + $block = (array)$item; + $block['content'] = ''; + if ($item->block_callback && function_exists($item->block_callback)) { + $function = $item->block_callback; + $block['content'] .= $function(); + } + $block['content'] .= theme('admin_block_content', system_admin_menu_block($item)); + $blocks[] = $block; + } + return theme('admin_page', $blocks); +} + + +/** + * Provide a single block from the administration menu as a page. + * This function is often a destination for these blocks. + * For example, 'admin/content/types' needs to have a destination to be valid + * in the Drupal menu system, but too much information there might be + * hidden, so we supply the contents of the block. + */ +function system_admin_menu_block_page() { + $item = menu_get_item(); + $content = system_admin_menu_block($item); + + $output = theme('admin_block_content', $content); + return $output; +} diff --git a/modules/system/system.install b/modules/system/system.install index 30d4a62d3018599a3a9e98b104d274ea0cfeae94..366ad44ea7cb3706d2a6ec849c0c959edaa82267 100644 --- a/modules/system/system.install +++ b/modules/system/system.install @@ -371,6 +371,7 @@ function system_install() { description TEXT, position varchar(255) NOT NULL default '', weight int NOT NULL default 0, + file mediumtext NOT NULL default '', PRIMARY KEY (path), KEY fit (fit), KEY tab_parent (tab_parent) @@ -891,6 +892,7 @@ function system_install() { description TEXT, position varchar(255) NOT NULL default '', weight int NOT NULL default 0, + file text NOT NULL default '', PRIMARY KEY (path) )"); db_query("CREATE INDEX {menu_router}_fit_idx ON {menu_router} (fit)"); diff --git a/modules/system/system.module b/modules/system/system.module index 430880b334ee1381eda0b113d928a9aa2f346572..23d910788c3a80213dbb3adb9cb7601e853cc76d 100644 --- a/modules/system/system.module +++ b/modules/system/system.module @@ -134,6 +134,7 @@ function system_menu() { 'access arguments' => array('access administration pages'), 'page callback' => 'system_main_admin_page', 'weight' => 9, + 'file' => 'system.admin.inc', ); $items['admin/compact'] = array( 'title' => 'Compact mode', @@ -167,6 +168,7 @@ function system_menu() { 'weight' => -10, 'page callback' => 'system_admin_menu_block_page', 'access arguments' => array('administer site configuration'), + 'file' => 'system.admin.inc', ); $items['admin/settings/admin'] = array( 'title' => 'Administration theme', @@ -309,6 +311,7 @@ function system_menu() { 'page callback' => 'system_admin_menu_block_page', 'weight' => 5, 'position' => 'left', + 'file' => 'system.admin.inc', ); $items['admin/logs/status'] = array( 'title' => 'Status report', @@ -384,41 +387,6 @@ function system_user($type, $edit, &$user, $category = NULL) { } } -/** - * Provide the administration overview page. - */ -function system_main_admin_page($arg = NULL) { - // If we received an argument, they probably meant some other page. - // Let's 404 them since the menu system cannot be told we do not - // accept arguments. - if (isset($arg) && substr($arg, 0, 3) != 'by-') { - return drupal_not_found(); - } - - // Check for status report errors. - if (system_status(TRUE)) { - drupal_set_message(t('One or more problems were detected with your Drupal installation. Check the <a href="@status">status report</a> for more information.', array('@status' => url('admin/logs/status'))), 'error'); - } - $result = db_query("SELECT * FROM {menu_links} ml INNER JOIN {menu_router} m ON ml.router_path = m.path - WHERE ml.href like 'admin/%' AND ml.href != 'admin/help' AND ml.depth = 2 AND ml.menu_name = 'navigation' - ORDER BY p1 ASC, p2 ASC, p3 ASC"); - while ($item = db_fetch_object($result)) { - _menu_link_translate($item); - if (!$item->access) { - continue; - } - $block = (array)$item; - $block['content'] = ''; - if ($item->block_callback && function_exists($item->block_callback)) { - $function = $item->block_callback; - $block['content'] .= $function(); - } - $block['content'] .= theme('admin_block_content', system_admin_menu_block($item)); - $blocks[] = $block; - } - return theme('admin_page', $blocks); -} - /** * Provide a single block on the administration overview page. */ @@ -439,21 +407,6 @@ function system_admin_menu_block($item) { return $content; } -/** - * Provide a single block from the administration menu as a page. - * This function is often a destination for these blocks. - * For example, 'admin/content/types' needs to have a destination to be valid - * in the Drupal menu system, but too much information there might be - * hidden, so we supply the contents of the block. - */ -function system_admin_menu_block_page() { - $item = menu_get_item(); - $content = system_admin_menu_block($item); - - $output = theme('admin_block_content', $content); - return $output; -} - function system_admin_compact_page($mode = 'off') { global $user; user_save($user, array('admin_compact_mode' => ($mode == 'on'))); @@ -1444,12 +1397,12 @@ function system_themes_form_submit($form_values, $form, &$form_state) { menu_rebuild(); drupal_set_message(t('The configuration options have been saved.')); $form_state['redirect'] = 'admin/build/themes'; - + // Notify locale module about new themes being enabled, so translations can // be imported. This might start a batch, and only return to the redirect // path after that. module_invoke('locale', 'system_update', array_diff($new_theme_list, $old_theme_list)); - + return; } diff --git a/modules/user/user.module b/modules/user/user.module index 456cb99a574c86fc45081e59fab9a101fd7e257c..b431b9eae30885bf711c75bfbc68304b861d8966 100644 --- a/modules/user/user.module +++ b/modules/user/user.module @@ -825,6 +825,8 @@ function user_menu() { 'position' => 'left', 'page callback' => 'system_admin_menu_block_page', 'access arguments' => array('administer site configuration'), + 'file' => 'system.admin.inc', + 'file path' => drupal_get_path('module', 'system'), ); $items['admin/user/user'] = array( 'title' => 'Users',