diff options
Diffstat (limited to 'modules/system')
-rw-r--r-- | modules/system/system.admin.inc | 12 | ||||
-rw-r--r-- | modules/system/system.api.php | 2 | ||||
-rw-r--r-- | modules/system/system.install | 10 | ||||
-rw-r--r-- | modules/system/system.module | 225 |
4 files changed, 178 insertions, 71 deletions
diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc index 1ff8bdf9e..5fe1c2424 100644 --- a/modules/system/system.admin.inc +++ b/modules/system/system.admin.inc @@ -86,7 +86,7 @@ function system_admin_menu_block_page() { */ function system_admin_by_module() { - $modules = module_rebuild_cache(); + $modules = system_get_module_data(); $menu_items = array(); $help_arg = module_exists('help') ? drupal_help_arg() : FALSE; @@ -141,7 +141,7 @@ function system_settings_overview() { function system_themes_form() { drupal_clear_css_cache(); - $themes = system_theme_data(); + $themes = system_get_theme_data(); uasort($themes, 'system_sort_modules_by_info_name'); $status = array(); @@ -325,7 +325,7 @@ function system_theme_settings(&$form_state, $key = '') { if ($key) { $settings = theme_get_settings($key); $var = str_replace('/', '_', 'theme_' . $key . '_settings'); - $themes = system_theme_data(); + $themes = system_get_theme_data(); $features = $themes[$key]->info['features']; } else { @@ -580,7 +580,7 @@ function system_modules($form_state = array()) { node_types_rebuild(); cache_clear_all('schema', 'cache'); // Get current list of modules. - $files = module_rebuild_cache(); + $files = system_get_module_data(); // Remove hidden modules from display list. foreach ($files as $filename => $file) { @@ -761,7 +761,7 @@ function _system_modules_build_row($info, $extra) { * Display confirmation form for required modules. * * @param $modules - * Array of module file objects as returned from module_rebuild_cache(). + * Array of module file objects as returned from system_get_module_data(). * @param $storage * The contents of $form_state['storage']; an array with two * elements: the list of required modules and the list of status @@ -819,7 +819,7 @@ function system_modules_submit($form, &$form_state) { // Get a list of all modules, it will be used to find which module requires // which. - $files = module_rebuild_cache(); + $files = system_get_module_data(); // The modules to be enabled. $modules_to_be_enabled = array(); diff --git a/modules/system/system.api.php b/modules/system/system.api.php index 0fa5aeea3..0efcedbc3 100644 --- a/modules/system/system.api.php +++ b/modules/system/system.api.php @@ -530,7 +530,7 @@ function hook_mail_alter(&$message) { /** * Alter the information parsed from module and theme .info files * - * This hook is invoked in module_rebuild_cache() and in system_theme_data(). + * This hook is invoked in _system_get_module_data() and in _system_get_theme_data(). * A module may implement this hook in order to add to or alter the data * generated by reading the .info file with drupal_parse_info_file(). * diff --git a/modules/system/system.install b/modules/system/system.install index 8f856e1d7..5a68e7007 100644 --- a/modules/system/system.install +++ b/modules/system/system.install @@ -353,7 +353,7 @@ function system_install() { } // Load system theme data appropriately. - system_theme_data(); + system_get_theme_data(); // Inserting uid 0 here confuses MySQL -- the next user might be created as // uid 2 which is not what we want. So we insert the first user here, the @@ -1542,8 +1542,8 @@ function system_update_6008() { db_drop_field($ret, 'system', 'description'); // Rebuild system table contents. - module_rebuild_cache(); - system_theme_data(); + system_get_module_data(); + system_get_theme_data(); return $ret; } @@ -1614,8 +1614,8 @@ function system_update_6012() { */ function system_update_6013() { // Rebuild system table contents. - module_rebuild_cache(); - system_theme_data(); + system_get_module_data(); + system_get_theme_data(); return array(array('success' => TRUE, 'query' => 'Cache rebuilt.')); } diff --git a/modules/system/system.module b/modules/system/system.module index 767981c82..4635a3d3f 100644 --- a/modules/system/system.module +++ b/modules/system/system.module @@ -1159,9 +1159,8 @@ function system_get_files_database(&$files, $type) { foreach ($result as $file) { if (isset($files[$file->name]) && is_object($files[$file->name])) { $file->filepath = $file->filename; - $file->old_filepath = $file->filepath; foreach ($file as $key => $value) { - if (!isset($files[$file->name]) || !isset($files[$file->name]->$key)) { + if (!isset($files[$file->name]->key)) { $files[$file->name]->$key = $value; } } @@ -1170,75 +1169,139 @@ function system_get_files_database(&$files, $type) { } /** - * Prepare defaults for themes. - * - * @return - * An array of default themes settings. + * Updates the records in the system table based on the files array. + * + * @param $files + * An array of files. + * @param $type + * The type of the files. */ -function system_theme_default() { - return array( - 'regions' => array( - 'left' => 'Left sidebar', - 'right' => 'Right sidebar', - 'content' => 'Content', - 'header' => 'Header', - 'footer' => 'Footer', - 'highlight' => 'Highlighted content', - 'help' => 'Help', - ), - 'description' => '', - 'features' => array( - 'comment_user_picture', - 'comment_user_verification', - 'favicon', - 'logo', - 'name', - 'node_user_picture', - 'search', - 'slogan', - 'main_menu', - 'secondary_menu', - ), - 'screenshot' => 'screenshot.png', - 'php' => DRUPAL_MINIMUM_PHP, - ); +function system_update_files_database(&$files, $type) { + $result = db_query("SELECT * FROM {system} WHERE type = :type", array(':type' => $type)); + + // Add all files that need to be deleted to a DatabaseCondition. + $delete = db_or(); + foreach ($result as $file) { + if (isset($files[$file->name]) && is_object($files[$file->name])) { + // Keep the old filename from the database in case the file has moved. + $old_filename = $file->filename; + + $updated_fields = array(); + + // Handle info specially, compare the serialized value. + $serialized_info = serialize($files[$file->name]->info); + if ($serialized_info != $file->info) { + $updated_fields['info'] = $serialized_info; + } + unset($file->info); + + // Scan remaining fields to find only the updated values. + foreach ($file as $key => $value) { + if (isset($files[$file->name]->$key) && $files[$file->name]->$key != $value) { + $updated_fields[$key] = $files[$file->name]->$key; + } + } + + // Update the record. + if (count($updated_fields)) { + db_update('system') + ->fields($updated_fields) + ->condition('filename', $old_filename) + ->execute(); + } + + // Indiciate that the file exists already. + $files[$file->name]->exists = TRUE; + } + else { + // File is not found in file system, so delete record from the system table. + $delete->condition('filename', $file->filename); + } + } + + if (count($delete) > 0) { + // Delete all missing files from the system table + db_delete('system') + ->condition($delete) + ->execute(); + } + + // All remaining files are not in the system table, so we need to add them. + $query = db_insert('system')->fields(array('filename', 'name', 'type', 'owner', 'info')); + foreach($files as &$file) { + if (isset($file->exists)) { + unset($file->exists); + } + else { + $query->values(array( + 'filename' => $file->filepath, + 'name' => $file->name, + 'type' => $type, + 'owner' => isset($file->owner) ? $file->owner : '', + 'info' => serialize($file->info), + )); + $file->type = $type; + $file->status = 0; + $file->schema_version = -1; + } + } + $query->execute(); } /** - * Collect data about all currently available themes. + * Helper function to scan and collect module .info data. * * @return - * Array of all available themes and their data. + * An associative array of module information. */ -function system_theme_data() { - // Scan the installation theme .info files and their engines. - $themes = _system_theme_data(); +function _system_get_module_data() { + // Find modules + $modules = drupal_system_listing('/\.module$/', 'modules', 'name', 0); - // Extract current files from database. - system_get_files_database($themes, 'theme'); + // Set defaults for module info. + $defaults = array( + 'dependencies' => array(), + 'dependents' => array(), + 'description' => '', + 'version' => NULL, + 'php' => DRUPAL_MINIMUM_PHP, + ); - db_delete('system') - ->condition('type', 'theme') - ->execute(); + // Read info files for each module. + foreach ($modules as $key => $module) { + // Look for the info file. + $module->info = drupal_parse_info_file(dirname($module->filepath) . '/' . $module->name . '.info'); - $query = db_insert('system')->fields(array('name', 'owner', 'info', 'type', 'filename', 'status')); - foreach ($themes as $theme) { - if (!isset($theme->owner)) { - $theme->owner = ''; + // Skip modules that don't provide info. + if (empty($module->info)) { + unset($modules[$key]); + continue; } - $query->values(array( - 'name' => $theme->name, - 'owner' => $theme->owner, - 'info' => serialize($theme->info), - 'type' => 'theme', - 'filename' => $theme->filename, - 'status' => isset($theme->status) ? $theme->status : 0, - )); + // Merge in defaults and save. + $modules[$key]->info = $module->info + $defaults; + + // Invoke hook_system_info_alter() to give installed modules a chance to + // modify the data in the .info files if necessary. + drupal_alter('system_info', $modules[$key]->info, $modules[$key]); } - $query->execute(); - return $themes; + return $modules; +} + +/** + * Collect data about all currently available modules. + * + * @return + * Array of all available modules and their data. + */ +function system_get_module_data() { + $modules = _system_get_module_data(); + ksort($modules); + system_get_files_database($modules, 'module'); + system_update_files_database($modules, 'module'); + $modules = _module_build_dependencies($modules); + return $modules; } /** @@ -1247,7 +1310,7 @@ function system_theme_data() { * @return * An associative array of themes information. */ -function _system_theme_data() { +function _system_get_theme_data() { static $themes_info = array(); if (empty($themes_info)) { @@ -1256,7 +1319,37 @@ function _system_theme_data() { // Find theme engines $engines = drupal_system_listing('/\.engine$/', 'themes/engines'); - $defaults = system_theme_default(); + // Set defaults for theme info. + $defaults = array( + 'regions' => array( + 'left' => 'Left sidebar', + 'right' => 'Right sidebar', + 'content' => 'Content', + 'header' => 'Header', + 'footer' => 'Footer', + 'highlight' => 'Highlighted content', + 'help' => 'Help', + ), + 'description' => '', + 'features' => array( + 'comment_user_picture', + 'favicon', + 'mission', + 'logo', + 'name', + 'node_user_picture', + 'search', + 'slogan', + 'main_menu', + 'secondary_menu', + ), + 'stylesheets' => array( + 'all' => array('style.css') + ), + 'scripts' => array('script.js'), + 'screenshot' => 'screenshot.png', + 'php' => DRUPAL_MINIMUM_PHP, + ); $sub_themes = array(); // Read info files for each theme @@ -1340,6 +1433,20 @@ function _system_theme_data() { } /** + * Collect data about all currently available themes. + * + * @return + * Array of all available themes and their data. + */ +function system_get_theme_data() { + $themes = _system_get_theme_data(); + ksort($themes); + system_get_files_database($themes, 'theme'); + system_update_files_database($themes, 'theme'); + return $themes; +} + +/** * Recursive function to find the top level base theme. Themes can inherit * templates and function implementations from earlier themes. * |