summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/module.inc20
-rw-r--r--includes/theme.inc1
-rw-r--r--modules/system/system.install12
-rw-r--r--modules/system/system.module27
4 files changed, 43 insertions, 17 deletions
diff --git a/includes/module.inc b/includes/module.inc
index bb7d32621..f932b7f49 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -72,7 +72,9 @@ function module_list($refresh = FALSE, $bootstrap = FALSE, $sort = FALSE, $fixed
$list = system_list('bootstrap');
}
else {
- $list = system_list('module_enabled');
+ // Not using drupal_map_assoc() here as that requires common.inc.
+ $list = array_keys(system_list('module_enabled'));
+ $list = (!empty($list) ? array_combine($list, $list) : array());
}
}
}
@@ -96,9 +98,10 @@ function module_list($refresh = FALSE, $bootstrap = FALSE, $sort = FALSE, $fixed
* - theme: All themes.
*
* @return
- * An associative array of modules or themes, keyed by name, and having the
- * respective database row as value. For $type 'module_enabled' and
- * 'bootstrap', the array values equal the keys.
+ * An associative array of modules or themes, keyed by name. For $type
+ * 'bootstrap', the array values equal the keys. For $type 'module_enabled'
+ * or 'theme', the array values are objects representing the respective
+ * database row, with the 'info' property already unserialized.
*
* @see module_list()
* @see list_themes()
@@ -143,11 +146,12 @@ function system_list($type) {
// Drupal installations, which might have modules installed in different
// locations in the file system. The ordering here must also be
// consistent with the one used in module_implements().
- $result = db_query("SELECT * FROM {system} ORDER BY weight ASC, name ASC");
+ $result = db_query("SELECT * FROM {system} WHERE type = 'theme' OR (type = 'module' AND status = 1) ORDER BY weight ASC, name ASC");
foreach ($result as $record) {
- if ($record->type == 'module' && $record->status) {
- // Build a list of all enabled modules.
- $lists['module_enabled'][$record->name] = $record->name;
+ $record->info = unserialize($record->info);
+ // Build a list of all enabled modules.
+ if ($record->type == 'module') {
+ $lists['module_enabled'][$record->name] = $record;
}
// Build a list of themes.
if ($record->type == 'theme') {
diff --git a/includes/theme.inc b/includes/theme.inc
index f5731693f..adbffbe92 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -583,7 +583,6 @@ function list_themes($refresh = FALSE) {
try {
foreach (system_list('theme') as $theme) {
if (file_exists($theme->filename)) {
- $theme->info = unserialize($theme->info);
$themes[] = $theme;
}
}
diff --git a/modules/system/system.install b/modules/system/system.install
index 4c8dcb9fa..1e110d880 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -1573,8 +1573,7 @@ function system_schema() {
),
'primary key' => array('filename'),
'indexes' => array(
- 'bootstrap' => array('status', 'bootstrap', 'type', 'weight', 'name'),
- 'system_list' => array('weight', 'name'),
+ 'system_list' => array('status', 'bootstrap', 'type', 'weight', 'name'),
'type_name' => array('type', 'name'),
),
);
@@ -2885,6 +2884,15 @@ function system_update_7060(&$sandbox) {
}
/**
+ * Replace 'system_list' index with 'bootstrap' index on {system}.
+ */
+function system_update_7061() {
+ db_drop_index('system', 'bootstrap');
+ db_drop_index('system', 'system_list');
+ db_add_index('system', 'system_list', array('status', 'bootstrap', 'type', 'weight', 'name'));
+}
+
+/**
* @} End of "defgroup updates-6.x-to-7.x"
* The next series of updates should start at 8000.
*/
diff --git a/modules/system/system.module b/modules/system/system.module
index be167a888..33f232f74 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -2217,25 +2217,40 @@ function system_update_files_database(&$files, $type) {
}
/**
- * Returns an array of information about active modules or themes.
+ * Returns an array of information about enabled modules or themes.
*
* This function returns the information from the {system} table corresponding
* to the cached contents of the .info file for each active module or theme.
*
* @param $type
* Either 'module' or 'theme'.
+ * @param $name
+ * (optional) The name of a module or theme whose information shall be
+ * returned. If omitted, all records for the provided $type will be returned.
+ * If $name does not exist in the provided $type or is not enabled, an empty
+ * array will be returned.
*
* @return
- * An associative array of module or theme information keyed by name.
+ * An associative array of module or theme information keyed by name, or only
+ * information for $name, if given. If no records are available, an empty
+ * array is returned.
*
* @see system_rebuild_module_data()
* @see system_rebuild_theme_data()
*/
-function system_get_info($type) {
+function system_get_info($type, $name = NULL) {
$info = array();
- $result = db_query('SELECT name, info FROM {system} WHERE type = :type AND status = 1', array(':type' => $type));
- foreach ($result as $item) {
- $info[$item->name] = unserialize($item->info);
+ if ($type == 'module') {
+ $type = 'module_enabled';
+ }
+ $list = system_list($type);
+ foreach ($list as $shortname => $item) {
+ if (!empty($item->status)) {
+ $info[$shortname] = $item->info;
+ }
+ }
+ if (isset($name)) {
+ return isset($info[$name]) ? $info[$name] : array();
}
return $info;
}