From b3abbc4b544cd8b3369924261dae948c1f860246 Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Fri, 8 Nov 2002 13:19:12 +0000 Subject: Patch by Natrak: - Modules and themes now use the same functions to find and administer files. - Modules can now be placed in sub-directories. - Theme descriptions can no longer be edited. This will be handled by Dries' theme_conf patch. - Update required to keep old modules enabled. --- modules/system/system.module | 175 ++++++++++++++++++------------------------- 1 file changed, 71 insertions(+), 104 deletions(-) (limited to 'modules/system/system.module') diff --git a/modules/system/system.module b/modules/system/system.module index 708b5164e..5977d308e 100644 --- a/modules/system/system.module +++ b/modules/system/system.module @@ -137,128 +137,93 @@ function system_view($type) { return $output . form($form); } -/** -* Module configuration -* -* @author Kjartan Mannes -* @group system.module -* @return string module list -*/ -function system_modules() { - $result = db_query("SELECT name, status FROM system WHERE type = 'module'"); - $status = array(); - while ($module = db_fetch_object($result)) { - $status[$module->name] = $module->status; - } - - if ($handle = @opendir("modules")) { - $modules = array(); +function system_dirscan($dir, $mask, $nomask = array(".", "..", "CVS")) { + $files = array(); + if (is_dir($dir) && $handle = opendir($dir)) { while ($file = readdir($handle)) { - if (".module" == substr($file, -7)) { - $name = substr($file, 0, -7); - $modules[$name] = array("filename" => "$file", "status" => $status[$name]); - include_once("modules/$file"); + if (!in_array($file, $nomask)) { + if (is_dir("$dir/$file")) { + $files = array_merge($files, system_dirscan("$dir/$file", $mask, $nomask)); + } + elseif (ereg($mask, $file)) { + $name = basename($file); + $files["$dir/$file"]->filename = "$dir/$file"; + $files["$dir/$file"]->name = substr($name, 0, strrpos($name, '.')); + } } } closedir($handle); - asort($modules); } + return $files; +} - db_query("DELETE FROM system WHERE type = 'module'"); +function system_listing($type, $directory, $required = array()) { + // Make sure we set $type correctly + $type = $type != 'theme' ? "module" : "theme"; - $required = array("user", "system", "watchdog"); + // Find files in the directory. + $files = system_dirscan($directory, "\.$type$"); - $output .= "\n"; - $output .= "\n"; - foreach ($modules as $name => $module) { - $output .= ""; - $output .= ""; - $output .= ""; - $output .= ""; - $output .= ""; - $output .= ""; -// $output .= ""; - $output .= "\n"; - if (!in_array($name, $required)) { - db_query("INSERT INTO system (name, type, filename, status) VALUES ('%s', 'module', '%s', '%s')", $name, $module["filename"], $module["status"]); + // Extract current files from database. + $result = db_query("SELECT filename, type, status FROM system WHERE type = '%s'", $type); + while ($file = db_fetch_object($result)) { + if (is_object($files[$file->filename])) { + foreach ($file as $key => $value) { + $files[$file->filename]->$key = $value; + } } } - $output .= "
moduledescriptionstatusoperations
$name". check_output(module_invoke($name, "system", "description")) ."". (in_array($name, $required) ? "required" : form_checkbox("", "status][$name", 1, $module["status"])) ."". (module_hook($name, "page") ? $module["status"] || in_array($name, $required) ? lm(t("view"), array("mod" => $name)) : t("view") : " ") ."". (module_hook($name, "admin") ? $module["status"] || in_array($name, $required) ? la(t("admin"), array("mod" => $name)) : t("admin") : " ") ."". (module_hook($name, "help") ? $module["status"] || in_array($name, $required) ? la(t("help"), array("mod" => $name, "op" => "help")) : t("help") : " ") ."

\n"; - $output .= form_submit("Save module settings"); - return form($output); -} + ksort($files); -/** -* Theme configuration -* -* This function handles the Drupal themes and lets the site administrator enable or disable them as they wish. -* -* @author Kjartan Mannes -* @package system.module -* @return string theme list -*/ -function system_themes() { - $result = db_query("SELECT * FROM system WHERE type = 'theme' ORDER BY filename"); - $status = array(); - while ($theme = db_fetch_object($result)) { - $_themes[$theme->name] = $theme; - } + // Clean up database. + db_query("DELETE FROM system WHERE type = '%s'", $type); - if ($handle = @opendir("themes")) { - $themes = array(); - while ($dir = readdir($handle)) { - if (!substr_count($dir, ".") && is_dir("themes/$dir")) { - if ($handle2 = @opendir("themes/$dir")) { - while ($file = readdir($handle2)) { - if (".theme" == substr($file, -6)) { - include_once("themes/$dir/$file"); - $name = substr($file, 0, -6); - $_theme = "theme_$name"; - if (class_exists($_theme)) { - $_theme =& new $_theme; - $_themes[$name]->filename = "themes/$dir/$file"; - if (method_exists($_theme, "system")) { - $_themes[$name]->displayname = $_theme->system("name"); - $_themes[$name]->author = $_theme->system("author"); - if (empty($_themes[$name]->description)) { - $_themes[$name]->description = $_theme->system("description"); - } - } - - $themes[$name] = $_themes[$name]; - unset($_theme); - } - } - } - closedir($handle2); - } + $output = "\n"; + $output .= "\n"; + + foreach ($files as $filename => $file) { + include_once($filename); + if ($type == "module") { + $info->name = module_invoke($file->name, "system", "name") ? module_invoke($file->name, "system", "name") : $file->name; + $info->description = module_invoke($file->name, "system", "description"); + } + elseif ($type == "theme") { + $class = "Theme_$file->name"; + if (class_exists($class)) { + $theme =& new $class; + $info->name = $theme->system("name") ? $theme->system("name") : $file->name; + $info->description = $theme->system("description"); + } + else { + unset($files[$filename]); } } - closedir($handle); - asort($themes); - } - db_query("DELETE FROM system WHERE type = 'theme'"); + db_query("INSERT INTO system (name, description, type, filename, status) VALUES ('%s', '%s', '%s', '%s', %d)", $info->name, $info->description, $type, $filename, $file->status); - $output .= "
namedescriptionenabled
\n"; - $output .= "\n"; - foreach ($themes as $name => $theme) { $output .= ""; - $output .= ""; - $output .= ""; - $output .= ""; - $output .= ""; - $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; $output .= "\n"; - db_query("INSERT INTO system (name, type, filename, status, description) VALUES ('%s', 'theme', '%s', '%s', '%s')", $name, $theme->filename, $theme->status, $theme->description); } $output .= "
themenamedescriptionauthorenabled
$name$theme->displayname". form_textfield("", "$name][description", $theme->description, 40, 255)."$theme->author". form_checkbox("", "$name][status", 1, $theme->status) ."$info->name$info->description". (in_array($filename, $required) ? form_hidden("status][$filename", 1) ."required" : form_checkbox("", "status][$filename", 1, $file->status)) ."

\n"; - $output .= form_submit("Save theme settings"); + $output .= form_submit("Save $type settings"); return form($output); } +/** +* Module configuration +* +* @group system.module +* @return string module list +*/ +function system_modules() { + // Config variables. +} + function system_admin() { global $edit, $op, $type; if (user_access("administer site configuration")) { @@ -271,19 +236,21 @@ function system_admin() { break; case "Save module settings": db_query("UPDATE system SET status = '0' WHERE type = 'module'"); - foreach ($edit["status"] as $name => $status) { - db_query("UPDATE system SET status = '$status' WHERE name = '$name'"); + foreach ($edit["status"] as $filename => $status) { + db_query("UPDATE system SET status = %d WHERE filename = '$filename'", $status); } case "modules": - print system_modules(); + // Note: changing this also requires changing module_init() @ includes/module.inc. + $required = array("modules/user.module", "modules/system.module", "modules/watchdog.module"); + print system_listing("module", "modules", $required); break; case "Save theme settings": db_query("UPDATE system SET status = '0' WHERE type = 'theme'"); - foreach ($edit as $name => $settings) { - db_query("UPDATE system SET status = '%s', description = '%s' WHERE name = '$name'", $settings["status"], $settings["description"]); + foreach ($edit["status"] as $filename => $status) { + db_query("UPDATE system SET status = %d WHERE filename = '$filename'", $status); } case "themes": - print system_themes(); + print system_listing("theme", "themes"); break; case "Reset to defaults": print status(system_default($edit)); @@ -302,4 +269,4 @@ function system_admin() { } } -?> +?> \ No newline at end of file -- cgit v1.2.3