summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/module.inc96
-rw-r--r--modules/system.module4
-rw-r--r--modules/system/system.module4
3 files changed, 92 insertions, 12 deletions
diff --git a/includes/module.inc b/includes/module.inc
index 567dedd8e..18c7dfb4c 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -13,12 +13,7 @@
* system_listing() and module_list().
*/
function module_init() {
- require_once 'modules/admin.module';
- require_once 'modules/filter.module';
- require_once 'modules/system.module';
- require_once 'modules/user.module';
- require_once 'modules/watchdog.module';
- module_list();
+ module_load_all();
module_invoke_all('init');
}
@@ -34,9 +29,6 @@ function module_iterate($function, $argument = '') {
/**
* Collect a list of all installed and enabled modules.
*
- * If any modules are enabled but have not yet been loaded, this function performs
- * the include_once() to load them.
- *
* @param $refresh
* Whether to force the module list to be regenerated (such as after the
* administrator has changed the system settings).
@@ -70,7 +62,7 @@ function module_list($refresh = FALSE, $bootstrap = FALSE) {
$throttle = ($module->throttle && variable_get('throttle_level', 0) > 4);
if (!$throttle) {
$list[$module->name] = $module->name;
- include_once $module->filename;
+ module_set_filename($module->name, $module->filename);
}
}
}
@@ -80,6 +72,90 @@ function module_list($refresh = FALSE, $bootstrap = FALSE) {
}
/**
+ * Set the filename of a module, for future loading through module_load()
+ *
+ * @param $module
+ * Name of the module which to specify the filename of.
+ * @param $pa
+ * Filename of the module named $module.
+ * @return
+ * Filename of module, if no $path has been specified.
+ */
+function module_set_filename($module, $path = null) {
+ static $list;
+
+ if ($path) {
+ $list[$module] = $path;
+ }
+ else {
+ return $list[$module] ? $list[$module] : "modules/$module.module";
+ }
+}
+
+/**
+ * Retrieve the filename of a module
+ *
+ * @param $module
+ * Name of the module which to retrieve the filename of.
+ * @return
+ * Filename of module.
+ */
+function module_get_filename($module) {
+ return module_set_filename($module);
+}
+
+/**
+ * Retrieve the path of a module
+ *
+ * @param $module
+ * Name of the module which to retrieve the path of.
+ * @return
+ * Path of module.
+ */
+function module_get_path($module) {
+ return dirname(module_get_filename($module));
+}
+
+/**
+ * Load a module into Drupal, but check first wether a module by the same name
+ * has been loaded, and that the filename being included exists.
+ * @param $module
+ * The name of the module to be loaded.
+ * @return
+ * TRUE if the load was successfull.
+ */
+function module_load($module) {
+ static $loaded = array();
+
+ if (!$loaded[$module]) {
+ $filename = module_get_filename($module);
+ if (file_exists($filename)) {
+ include_once($filename);
+ $loaded[$module] = $filename;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+/**
+ * Load all the modules that have been enabled in the system table.
+ *
+ * @return
+ * TRUE if all modules were loaded successfully
+ */
+function module_load_all() {
+ $list = module_list();
+ $status = true;
+ foreach ($list as $module) {
+ $status = $status && module_load($module);
+ }
+ return $status;
+}
+
+
+/**
* Determine whether a given module exists.
*
* @param $module
diff --git a/modules/system.module b/modules/system.module
index 265ae2b85..9ea7daac2 100644
--- a/modules/system.module
+++ b/modules/system.module
@@ -245,7 +245,9 @@ function system_listing($type) {
}
foreach ($files as $filename => $file) {
- include_once($filename);
+ module_set_filename($file->name, $filename);
+ module_load($file->name);
+
if ($type == 'module') {
$info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : module_invoke($file->name, 'system', 'name') ? module_invoke($file->name, 'system', 'name') : $file->name;
$info->description = module_invoke($file->name, 'help', 'admin/modules#description') ? module_invoke($file->name, 'help', 'admin/modules#description') : module_invoke($file->name, 'system', 'description');
diff --git a/modules/system/system.module b/modules/system/system.module
index 265ae2b85..9ea7daac2 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -245,7 +245,9 @@ function system_listing($type) {
}
foreach ($files as $filename => $file) {
- include_once($filename);
+ module_set_filename($file->name, $filename);
+ module_load($file->name);
+
if ($type == 'module') {
$info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : module_invoke($file->name, 'system', 'name') ? module_invoke($file->name, 'system', 'name') : $file->name;
$info->description = module_invoke($file->name, 'help', 'admin/modules#description') ? module_invoke($file->name, 'help', 'admin/modules#description') : module_invoke($file->name, 'system', 'description');