diff options
author | Dries Buytaert <dries@buytaert.net> | 2004-11-24 22:44:01 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2004-11-24 22:44:01 +0000 |
commit | 5d759ccbb9764e4c0328ce7fc4a83df8b958cf85 (patch) | |
tree | 99a4f638669ab176c5714c87cb982c19dab04528 /modules/system/system.module | |
parent | 062a8abdeae40ab03004f7c11dc21b7a13b57ca1 (diff) | |
download | brdo-5d759ccbb9764e4c0328ce7fc4a83df8b958cf85.tar.gz brdo-5d759ccbb9764e4c0328ce7fc4a83df8b958cf85.tar.bz2 |
- Patch #5942 by jhriggs and Adrian:
+ added support for multi-site configurations.
+ tidied up some old cruft and added code comments.
Diffstat (limited to 'modules/system/system.module')
-rw-r--r-- | modules/system/system.module | 263 |
1 files changed, 115 insertions, 148 deletions
diff --git a/modules/system/system.module b/modules/system/system.module index 3b07b9da3..5ecfe82dd 100644 --- a/modules/system/system.module +++ b/modules/system/system.module @@ -271,177 +271,148 @@ function system_view_general() { } /** - * Inventory theme engines and insert entries for them into the system table - */ -function system_theme_engine_inventory($directory) { - $engines = array(); - - // Remove all theme engines from the system table - db_query('DELETE FROM {system} WHERE type = \'%s\'', 'theme_engine'); - - // Find theme engines in the directory and insert into database - $files = file_scan_directory($directory. '/engines', '\.engine$'); - - foreach ($files as $filename => $file) { - module_set_filename($file->name, $filename); - module_load($file->name); - - $info = new StdClass(); - $info->name = $file->name; - $info->filename = $file->filename; - $engines[$info->name] = $info; - - db_query('INSERT INTO {system} (name, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, 'theme_engine', $filename, 1, 0, 0); - } - return $engines; -} - -/** - * Retrieves an array of a particular type of files (specified by $type) in a particular $directory - * and their current status in the system table. - */ -function system_get_files($search, $type, $directory) { - // Find files in the directory. - $files = file_scan_directory($directory, $search); - - return $files; -} - -/** * Retrieves the current status of an array of files in the system table. */ function system_get_files_database(&$files, $type) { // Extract current files from database. - $result = db_query('SELECT filename, type, status, throttle FROM {system} WHERE type = \'%s\'', $type); + $result = db_query("SELECT name, type, status, throttle FROM {system} WHERE type = '%s'", $type); while ($file = db_fetch_object($result)) { - if (is_object($files[$file->filename])) { + if (is_object($files[$file->name])) { foreach ($file as $key => $value) { - $files[$file->filename]->$key = $value; + if (!$files[$file->name]->$key) { + $files[$file->name]->$key = $value; + } } } } } /** - * Obtains information about each theme in the $files array - * Also updates the system table - */ -function system_obtain_theme_info($files, $directory) { - foreach ($files as $filename => $file) { - $info = new StdClass(); - if ($file->theme) { - // file is a style - $info->description = $file->theme; - $info->style = TRUE; - } - - if (strpos($filename, '.theme')) { - // file is a theme - module_set_filename($file->name, $filename); - module_load($file->name); - $info->description = ''; - $info->prefix = basename($filename, '.theme'); - } - elseif ($info->style && !$file->engine) { - $info->prefix = $info->description; - } - else { - // file is a template - $info->description = $info->style ? $info->description : $file->engine; - $info->template = TRUE; - $info->prefix = basename($file->engine, '.engine'); - } - - $info->filename = $filename; - $info->path = pathinfo($info->filename); - $info->name = str_replace(array($directory .'/'), '', $info->path['dirname']); - $info->shortname = basename($info->name); - $info->screenshot = dirname($info->filename) .'/screenshot.png'; - - $info->status = $file->status; - - $themes[$info->name] = $info; - - // Update the contents of the system table: - db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $info->filename, 'theme'); - db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'theme', $info->filename, $info->status, 0, 0); - } - return $themes; -} - -/** * Collect data about all currently available themes */ -function system_theme_data($directory) { +function system_theme_data() { + // Find themes + $themes = system_listing('\.theme$', 'themes'); + // Find theme engines - $engines = system_theme_engine_inventory($directory); + $engines = system_listing('\.engine$', 'themes/engines'); + + // can't iterate over array itself as it uses a copy of the array items + foreach (array_keys($themes) as $key) { + drupal_get_filename('theme', $themes[$key]->name, $themes[$key]->filename); + drupal_load('theme', $themes[$key]->name); + $themes[$key]->description = dirname($themes[$key]->filename); + $themes[$key]->owner = $themes[$key]->filename; + $themes[$key]->prefix = $key; + } - // Get current list of themes and their present status in the system table. - $files = system_get_files('\.theme$', 'theme', $directory); + // Remove all theme engines from the system table + db_query("DELETE FROM {system} WHERE type = 'theme_engine'"); // Add templates to the site listing foreach ($engines as $engine) { - foreach (call_user_func($engine->name .'_templates', $directory) as $template) { - $template_files[$template->filename] = $template; - $template_files[$template->filename]->engine = $engine->filename; - foreach ($files as $file) { - // do not double-insert templates with theme files in their directory - if (dirname($template->filename) == dirname($file->filename)) { - unset($template_files[$template->filename]); - } - } + drupal_get_filename('theme_engine', $engine->name, $engine->filename); + drupal_load('theme_engine', $engine->name); + db_query("INSERT INTO {system} (name, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', %d, %d, %d)", $engine->name, 'theme_engine', $engine->filename, 1, 0, 0); + + foreach (call_user_func($engine->name . '_templates') as $template) { + $template->template = TRUE; + $template->name = basename(dirname($template->filename)); + $template->basename = $template->name; + $template->description = dirname($template->filename); + $template->owner = $engine->filename; + $template->prefix = $engine->name; + $themes[$template->name] = $template; } } - $files = array_merge($files, $template_files); // Find styles in each theme's directory. - foreach ($files as $file) { - foreach (system_get_files("style.css$", 'theme', dirname($file->filename)) as $style) { + foreach ($themes as $theme) { + foreach (file_scan_directory(dirname($theme->filename), 'style.css$') as $style) { // do not double-insert themes with css files in their directory - if (dirname($style->filename) != dirname($file->filename)) { - $style_files[$style->filename] = $style; - $path = pathinfo($file->filename); - $style_files[$style->filename]->theme = str_replace(array($directory .'/'), '', $path['dirname']); - if ($file->engine) { - $style_files[$style->filename]->engine = $file->engine; - } + if (dirname($style->filename) != dirname($theme->filename)) { + $style->style = TRUE; + $style->name = basename(dirname($style->filename)); + $style->description = dirname($style->filename); + $style->owner = $theme->filename; + $style->prefix = $theme->name; + $themes[$style->name] = $style; } } } - $files = array_merge($files, $style_files); // Extract current files from database. - system_get_files_database($files, 'theme'); + system_get_files_database($themes, 'theme'); + + db_query("DELETE FROM {system} WHERE type = 'theme'"); - // Build an array of information about each theme for use in displaying the selection table. - return system_obtain_theme_info($files, $directory); + foreach ($themes as $theme) { + db_query("INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $theme->name, $theme->owner, 'theme', $theme->filename, $theme->status, 0, 0); + } + + return $themes; +} + +/** + * Returns an array of files objects of the given type from both the + * site-wide directory (i.e. modules/) and site-specific directory + * (i.e. sites/somesite/modules/). The returned array will be keyed + * using the key specified (name, basename, filename). Using name or + * basename will cause site-specific files to shadow files in the + * default directories. That is, if a file with the same name appears + * in both location, only the site-specific version will be included. + * + * @param $mask + * The regular expression of the files to find. + * @param $directory + * The subdirectory name in which the files are found. For example, + * 'modules' will search in both modules/ and + * sites/somesite/modules/. + * @param $key + * The key to be passed to file_scan_directory(). + * + * @return + * An array of file objects of the specified type. + */ +function system_listing($mask, $directory, $key = 'name') { + $config = conf_init(); + $searchdir = array($directory); + $files = array(); + + if (file_exists("$config/$directory")) { + $searchdir[] = "$config/$directory"; + } + + // Get current list of items + foreach ($searchdir as $dir) { + $files = array_merge($files, file_scan_directory($dir, $mask, array('.', '..', 'CVS'), 0, TRUE, $key)); + } + + return $files; } /** * Generate a list of all the available theme/style combinations. */ function system_theme_listing() { - $directory = 'themes'; - - $themes = system_theme_data($directory); + $themes = system_theme_data(); ksort($themes); - foreach ($themes as $key => $info) { + foreach ($themes as $name => $info) { + $info->screenshot = dirname($info->filename) . '/screenshot.png'; $row = array(); // Screenshot column. - $row[] = file_exists($info->screenshot) ? theme('image', $info->screenshot, t('Screenshot for %theme theme', array('%theme' => $info->shortname)), '', 'class="screenshot"', false) : t('no screenshot'); + $row[] = file_exists($info->screenshot) ? theme('image', $info->screenshot, t('Screenshot for %theme theme', array('%theme' => $info->name)), '', 'class="screenshot"', false) : t('no screenshot'); // Information field. - $field = '<strong>'. $info->shortname .'</strong>'; - $field .= '<br /><em>themes/'. $key .'</em>'; - $row[] = $field; + $row[] = "<strong>$info->name</strong><br /><em>$info->description</em>"; // enabled, default, and operations columns - $row[] = array('data' => form_checkbox('', 'status]['. $info->filename, 1, $info->status), 'align' => 'center'); - $row[] = array('data' => form_radio('', 'theme_default', $info->filename, (variable_get('theme_default', 'bluemarine') == $key) ? 1 : 0), 'align' => 'center'); - if (function_exists($info->prefix .'_settings') || function_exists($info->prefix .'_features')) { - $row[] = array('data' => l(t('configure'), 'admin/themes/settings/'. str_replace('/', '.', $key)), 'align' => 'center'); + $row[] = array('data' => form_checkbox('', 'status]['. $info->name, 1, $info->status), 'align' => 'center'); + $row[] = array('data' => form_radio('', 'theme_default', $info->name, (variable_get('theme_default', 'bluemarine') == $name) ? 1 : 0), 'align' => 'center'); + if (function_exists($info->prefix . '_settings') || function_exists($info->prefix . '_features')) { + $row[] = array('data' => l(t('configure'), 'admin/themes/settings/' . str_replace('/', '.', preg_replace('<^.*themes/(.*)$>', '$1', $info->description))), 'align' => 'center'); } else { $row[] = ''; @@ -459,18 +430,16 @@ function system_theme_listing() { * Generate a list of all the available modules, as well as update the system list. */ function system_module_listing() { - $directory = 'modules'; - // Get current list of modules - $files = system_get_files('\.module$', 'module', $directory); + $files = system_listing('\.module$', 'modules'); // Extract current files from database. system_get_files_database($files, 'module'); ksort($files); - $required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module'); - $throttle_required = array_merge($required, array('modules/throttle.module')); + $required = array('admin', 'block', 'filter', 'system', 'user', 'watchdog'); + $throttle_required = array_merge($required, array('throttle')); $header = array(t('Name'), t('Description'), t('Enabled')); if (module_exist('throttle')) { @@ -478,12 +447,11 @@ function system_module_listing() { } foreach ($files as $filename => $file) { - module_set_filename($file->name, $filename); - module_load($file->name); + drupal_get_filename('module', $file->name, $file->filename); + drupal_load('module', $file->name); + + $file->description = module_invoke($file->name, 'help', 'admin/modules#description'); - $info = new StdClass(); - $info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name; - $info->description = module_invoke($file->name, 'help', 'admin/modules#description'); // log the critical hooks implemented by this module $bootstrap = 0; foreach (bootstrap_hooks() as $hook) { @@ -494,12 +462,12 @@ function system_module_listing() { } // Update the contents of the system table: - db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $filename, 'module'); - db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'module', $filename, $file->status, $file->throttle, $bootstrap); + db_query("DELETE FROM {system} WHERE name = '%s' AND type = '%s'", $file->name, 'module'); + db_query("INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $file->name, $file->description, 'module', $file->filename, $file->status, $file->throttle, $bootstrap); - $row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden('status]['. $filename, 1) . t('required') : form_checkbox('', 'status]['. $filename, 1, $file->status)), 'align' => 'center')); + $row = array($file->name, $file->description, array('data' => (in_array($file->name, $required) ? form_hidden("status][$file->name", 1) . t('required') : form_checkbox('', "status][$file->name", 1, $file->status)), 'align' => 'center')); if (module_exist('throttle')) { - $row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden('throttle]['. $filename, 0) . t('required') : form_checkbox(NULL, 'throttle]['. $filename, 1, $file->throttle, NULL)), 'align' => 'center'); + $row[] = array('data' => (in_array($file->name, $throttle_required) ? form_hidden("throttle][$file->name", 0) . t('required') : form_checkbox(NULL, "throttle][$file->name", 1, $file->throttle, NULL)), 'align' => 'center'); } $rows[] = $row; } @@ -516,18 +484,17 @@ function system_listing_save($edit = array()) { if ($op == t('Save configuration')) { db_query("UPDATE {system} SET status = 0 WHERE type = '%s'", $edit['type']); - foreach ($edit['status'] as $filename => $status) { + foreach ($edit['status'] as $name => $status) { // Make certain that the default theme is enabled to avoid user error - if (($edit['type'] == 'theme') && ($edit['theme_default'] == $filename)) { + if (($edit['type'] == 'theme') && ($edit['theme_default'] == $name)) { $status = 1; } - db_query("UPDATE {system} SET status = %d, throttle = %d WHERE filename = '%s'", $status, $edit['throttle'][$filename], $filename); + db_query("UPDATE {system} SET status = %d, throttle = %d WHERE type = '%s' AND name = '%s'", $status, $edit['throttle'][$name], $edit['type'], $name); } + if ($edit['type'] == 'theme') { - $path = pathinfo($edit['theme_default']); - $name = str_replace(array('themes/'), '', $path['dirname']); - variable_set('theme_default', $name); + variable_set('theme_default', $edit['theme_default']); } cache_clear_all(); @@ -620,8 +587,8 @@ function system_theme_settings() { if ($key) { $settings = theme_get_settings($key); $var = str_replace('/', '_', 'theme_'. $key .'_settings'); - $themes = system_theme_data('themes'); - $features = function_exists($themes[$key]->prefix .'_features') ? call_user_func($themes[$key]->prefix .'_features') : array(); + $themes = system_theme_data(); + $features = function_exists($themes[$key]->prefix . '_features') ? call_user_func($themes[$key]->prefix . '_features') : array(); } else { $settings = theme_get_settings(''); |