Index: modules/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system.module,v retrieving revision 1.227 diff -u -r1.227 system.module --- modules/system.module 25 Aug 2005 21:14:17 -0000 1.227 +++ modules/system.module 27 Aug 2005 20:20:06 -0000 @@ -373,39 +373,41 @@ /** * Get a list of available regions from a specified theme. * - * @param $theme + * @param $theme_key * The name of a theme. * @return * An array of regions in the form $region['name'] = 'description'. */ -function system_region_list($theme) { +function system_region_list($theme_key) { static $list = array(); - if(!array_key_exists($theme, $list)) { + if(!array_key_exists($theme_key, $list)) { - $themes = list_themes(); + $result = db_query("SELECT * FROM {system} WHERE type = 'theme' AND name = '%s'", $theme_key); + $theme = db_fetch_object($result); - if (strpos($themes[$theme]->filename, '.css')) { + if (strpos($theme->filename, '.css')) { // File is a style, which can't have its own regions; use its theme instead. - $theme = basename(dirname($themes[$theme]->description)); + $list[$theme_key] = system_region_list(basename(dirname($theme->description))); + return $list[$theme_key]; } - if (file_exists($file = dirname($themes[$theme]->filename) .'/' . $themes[$theme]->name . '.theme')) { + if (file_exists($file = dirname($theme->filename) .'/' . $theme_key . '.theme')) { include_once($file); } - $regions = function_exists($theme . '_regions') ? call_user_func($theme . '_regions') : array(); - if (strpos($themes[$theme]->description, '.engine')) { + $regions = function_exists($theme_key . '_regions') ? call_user_func($theme_key . '_regions') : array(); + if (strpos($theme->description, '.engine')) { // File is a template; include its engine's regions. - include_once($themes[$theme]->description); - $theme_engine = basename($themes[$theme]->description, '.engine'); + include_once($theme->description); + $theme_engine = basename($theme->description, '.engine'); $engine_regions = function_exists($theme_engine . '_regions') ? call_user_func($theme_engine . '_regions') : array(); $regions = array_merge($engine_regions, $regions); } - $list[$theme] = $regions; + $list[$theme_key] = $regions; } - return $list[$theme]; + return $list[$theme_key]; } /** @@ -560,7 +562,7 @@ $status = 1; } // If status is being set to 1 from 0, initialize block data for this theme if necessary. - if (($status == 1) && db_num_rows(db_query("SELECT status FROM {system} WHERE type = '%s' AND name = '%s' AND status = 0", $edit['type'], $name))) { + if (($edit['type'] == 'theme') && ($status == 1) && db_num_rows(db_query("SELECT status FROM {system} WHERE type = '%s' AND name = '%s' AND status = 0", $edit['type'], $name))) { system_initialize_theme_blocks($name); } @@ -578,19 +580,21 @@ } } /** - * Assign an initial, default set of blocks for a theme. This function is called the first - * time a new theme is enabled. The new theme gets a copy of the default theme's blocks, - * with the difference that if a particular region isn't available in the new theme, the block - * is assigned instead to the new theme's default region. + * Assign an initial, default set of blocks for a theme. + * + * This function is called the first time a new theme is enabled. The new theme + * gets a copy of the default theme's blocks, with the difference that if a + * particular region isn't available in the new theme, the block is assigned + * instead to the new theme's default region. * * @param $theme * The name of a theme. */ function system_initialize_theme_blocks($theme) { - $default_theme = variable_get('theme_default', 'bluemarine'); - $regions = system_region_list($theme); // Initialize theme's blocks if none already registered. if (!(db_num_rows(db_query("SELECT module FROM {blocks} WHERE theme = '%s'", $theme)))) { + $default_theme = variable_get('theme_default', 'bluemarine'); + $regions = system_region_list($theme); $result = db_query("SELECT * FROM {blocks} WHERE theme = '%s'", $default_theme); while($block = db_fetch_array($result)) { // If the region isn't supported by the theme, assign the block to the theme's default region.