Issue #761608 by JohnAlbin, effulgentsia: Fixed Missing theme settings values because list_themes() has inconsistent theme object data.
parent
e1f366679c
commit
46cf23289a
|
@ -21,6 +21,8 @@ Drupal 7.15, xxxx-xx-xx (development version)
|
|||
- Fixed bug which prevented image styles from being deleted on PHP 5.4.
|
||||
- Made Ajax alert dialogs respect error reporting settings.
|
||||
- Fixed bug which prevented the jQuery UI Datepicker from being localized.
|
||||
- Fixed bug which prevented sub-themes from inheriting the default values of
|
||||
theme settings defined by the base theme.
|
||||
|
||||
Drupal 7.14 2012-05-02
|
||||
----------------------
|
||||
|
|
|
@ -178,6 +178,33 @@ function system_list($type) {
|
|||
$lists['filepaths'][] = array('type' => $record->type, 'name' => $record->name, 'filepath' => $record->filename);
|
||||
}
|
||||
}
|
||||
foreach ($lists['theme'] as $key => $theme) {
|
||||
if (!empty($theme->info['base theme'])) {
|
||||
// Make a list of the theme's base themes.
|
||||
$lists['theme'][$key]->base_themes = drupal_find_base_themes($lists['theme'], $key);
|
||||
// Don't proceed if there was a problem with the root base theme.
|
||||
if (!current($lists['theme'][$key]->base_themes)) {
|
||||
continue;
|
||||
}
|
||||
// Determine the root base theme.
|
||||
$base_key = key($lists['theme'][$key]->base_themes);
|
||||
// Add to the list of sub-themes for each of the theme's base themes.
|
||||
foreach (array_keys($lists['theme'][$key]->base_themes) as $base_theme) {
|
||||
$lists['theme'][$base_theme]->sub_themes[$key] = $lists['theme'][$key]->info['name'];
|
||||
}
|
||||
// Add the base theme's theme engine info.
|
||||
$lists['theme'][$key]->info['engine'] = isset($lists['theme'][$base_key]->info['engine']) ? $lists['theme'][$base_key]->info['engine'] : 'theme';
|
||||
}
|
||||
else {
|
||||
// A plain theme is its own engine.
|
||||
$base_key = $key;
|
||||
if (!isset($lists['theme'][$key]->info['engine'])) {
|
||||
$lists['theme'][$key]->info['engine'] = 'theme';
|
||||
}
|
||||
}
|
||||
// Set the theme engine prefix.
|
||||
$lists['theme'][$key]->prefix = ($lists['theme'][$key]->info['engine'] == 'theme') ? $base_key : $lists['theme'][$key]->info['engine'];
|
||||
}
|
||||
cache_set('system_list', $lists, 'cache_bootstrap');
|
||||
}
|
||||
// To avoid a separate database lookup for the filepath, prime the
|
||||
|
|
|
@ -737,7 +737,7 @@ function _theme_build_registry($theme, $base_theme, $theme_engine) {
|
|||
* names of the themes and the values are objects having the following
|
||||
* properties:
|
||||
* - 'filename': The name of the .info file.
|
||||
* - 'name': The name of the theme.
|
||||
* - 'name': The machine name of the theme.
|
||||
* - 'status': 1 for enabled, 0 for disabled themes.
|
||||
* - 'info': The contents of the .info file.
|
||||
* - 'stylesheets': A two dimensional array, using the first key for the
|
||||
|
@ -747,7 +747,10 @@ function _theme_build_registry($theme, $base_theme, $theme_engine) {
|
|||
* - 'scripts': An associative array of JavaScripts, using the filename as key
|
||||
* and the complete filepath as value.
|
||||
* - 'engine': The name of the theme engine.
|
||||
* - 'base theme': The name of the base theme.
|
||||
* - 'base_theme': The name of the base theme.
|
||||
* - 'base_themes': An ordered array of all the base themes. If the first item
|
||||
* is NULL, a base theme is missing for this theme.
|
||||
* - 'sub_themes': An unordered array of sub-themes of this theme.
|
||||
*/
|
||||
function list_themes($refresh = FALSE) {
|
||||
$list = &drupal_static(__FUNCTION__, array());
|
||||
|
@ -803,6 +806,47 @@ function list_themes($refresh = FALSE) {
|
|||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all the base themes for the specified theme.
|
||||
*
|
||||
* Themes can inherit templates and function implementations from earlier themes.
|
||||
*
|
||||
* @param $themes
|
||||
* An array of available themes.
|
||||
* @param $key
|
||||
* The name of the theme whose base we are looking for.
|
||||
* @param $used_keys
|
||||
* A recursion parameter preventing endless loops.
|
||||
* @return
|
||||
* Returns an array of all of the theme's ancestors; the first element's value
|
||||
* will be NULL if an error occurred.
|
||||
*/
|
||||
function drupal_find_base_themes($themes, $key, $used_keys = array()) {
|
||||
$base_key = $themes[$key]->info['base theme'];
|
||||
// Does the base theme exist?
|
||||
if (!isset($themes[$base_key])) {
|
||||
return array($base_key => NULL);
|
||||
}
|
||||
|
||||
$current_base_theme = array($base_key => $themes[$base_key]->info['name']);
|
||||
|
||||
// Is the base theme itself a child of another theme?
|
||||
if (isset($themes[$base_key]->info['base theme'])) {
|
||||
// Do we already know the base themes of this theme?
|
||||
if (isset($themes[$base_key]->base_themes)) {
|
||||
return $themes[$base_key]->base_themes + $current_base_theme;
|
||||
}
|
||||
// Prevent loops.
|
||||
if (!empty($used_keys[$base_key])) {
|
||||
return array($base_key => NULL);
|
||||
}
|
||||
$used_keys[$base_key] = TRUE;
|
||||
return drupal_find_base_themes($themes, $base_key, $used_keys) + $current_base_theme;
|
||||
}
|
||||
// If we get here, then this is our parent theme.
|
||||
return $current_base_theme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates themed output.
|
||||
*
|
||||
|
|
|
@ -124,6 +124,37 @@ class ThemeTestCase extends DrupalWebTestCase {
|
|||
module_enable(array('theme_test'), FALSE);
|
||||
$this->assertIdentical(theme('theme_test_foo', array('foo' => 'c')), 'c', 'The theme registry contains theme_test_foo again after re-enabling the module.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the list_themes() function.
|
||||
*/
|
||||
function testListThemes() {
|
||||
$themes = list_themes();
|
||||
// Check if drupal_theme_access() retrieves enabled themes properly from list_themes().
|
||||
$this->assertTrue(drupal_theme_access('test_theme'), t('Enabled theme detected'));
|
||||
// Check if list_themes() returns disabled themes.
|
||||
$this->assertTrue(array_key_exists('test_basetheme', $themes), t('Disabled theme detected'));
|
||||
// Check for base theme and subtheme lists.
|
||||
$base_theme_list = array('test_basetheme' => 'Theme test base theme');
|
||||
$sub_theme_list = array('test_subtheme' => 'Theme test subtheme');
|
||||
$this->assertIdentical($themes['test_basetheme']->sub_themes, $sub_theme_list, t('Base theme\'s object includes list of subthemes.'));
|
||||
$this->assertIdentical($themes['test_subtheme']->base_themes, $base_theme_list, t('Subtheme\'s object includes list of base themes.'));
|
||||
// Check for theme engine in subtheme.
|
||||
$this->assertIdentical($themes['test_subtheme']->engine, 'phptemplate', t('Subtheme\'s object includes the theme engine.'));
|
||||
// Check for theme engine prefix.
|
||||
$this->assertIdentical($themes['test_basetheme']->prefix, 'phptemplate', t('Base theme\'s object includes the theme engine prefix.'));
|
||||
$this->assertIdentical($themes['test_subtheme']->prefix, 'phptemplate', t('Subtheme\'s object includes the theme engine prefix.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the theme_get_setting() function.
|
||||
*/
|
||||
function testThemeGetSetting() {
|
||||
$GLOBALS['theme_key'] = 'test_theme';
|
||||
$this->assertIdentical(theme_get_setting('theme_test_setting'), 'default value', t('theme_get_setting() uses the default theme automatically.'));
|
||||
$this->assertNotEqual(theme_get_setting('subtheme_override', 'test_basetheme'), theme_get_setting('subtheme_override', 'test_subtheme'), t('Base theme\'s default settings values can be overridden by subtheme.'));
|
||||
$this->assertIdentical(theme_get_setting('basetheme_only', 'test_subtheme'), 'base theme value', t('Base theme\'s default settings values are inherited by subtheme.'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -25,6 +25,8 @@ function theme_test_theme($existing, $type, $theme, $path) {
|
|||
*/
|
||||
function theme_test_system_theme_info() {
|
||||
$themes['test_theme'] = drupal_get_path('module', 'theme_test') . '/themes/test_theme/test_theme.info';
|
||||
$themes['test_basetheme'] = drupal_get_path('module', 'theme_test') . '/themes/test_basetheme/test_basetheme.info';
|
||||
$themes['test_subtheme'] = drupal_get_path('module', 'theme_test') . '/themes/test_subtheme/test_subtheme.info';
|
||||
return $themes;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
name = Theme test base theme
|
||||
description = Test theme which acts as a base theme for other test subthemes.
|
||||
core = 7.x
|
||||
hidden = TRUE
|
||||
|
||||
settings[basetheme_only] = base theme value
|
||||
settings[subtheme_override] = base theme value
|
|
@ -0,0 +1,7 @@
|
|||
name = Theme test subtheme
|
||||
description = Test theme which uses test_basetheme as the base theme.
|
||||
core = 7.x
|
||||
base theme = test_basetheme
|
||||
hidden = TRUE
|
||||
|
||||
settings[subtheme_override] = subtheme value
|
|
@ -14,3 +14,5 @@ hidden = TRUE
|
|||
; version from being loaded, and that errors aren't caused by the lack of this
|
||||
; file within the theme folder.
|
||||
stylesheets[all][] = system.base.css
|
||||
|
||||
settings[theme_test_setting] = default value
|
||||
|
|
|
@ -400,7 +400,7 @@ function system_theme_settings($form, &$form_state, $key = '') {
|
|||
// Default settings are defined in theme_get_setting() in includes/theme.inc
|
||||
if ($key) {
|
||||
$var = 'theme_' . $key . '_settings';
|
||||
$themes = system_rebuild_theme_data();
|
||||
$themes = list_themes();
|
||||
$features = $themes[$key]->info['features'];
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -2553,7 +2553,7 @@ function _system_rebuild_theme_data() {
|
|||
// Now that we've established all our master themes, go back and fill in data
|
||||
// for subthemes.
|
||||
foreach ($sub_themes as $key) {
|
||||
$themes[$key]->base_themes = system_find_base_themes($themes, $key);
|
||||
$themes[$key]->base_themes = drupal_find_base_themes($themes, $key);
|
||||
// Don't proceed if there was a problem with the root base theme.
|
||||
if (!current($themes[$key]->base_themes)) {
|
||||
continue;
|
||||
|
@ -2648,42 +2648,10 @@ function _system_default_theme_features() {
|
|||
/**
|
||||
* Find all the base themes for the specified theme.
|
||||
*
|
||||
* Themes can inherit templates and function implementations from earlier themes.
|
||||
*
|
||||
* @param $themes
|
||||
* An array of available themes.
|
||||
* @param $key
|
||||
* The name of the theme whose base we are looking for.
|
||||
* @param $used_keys
|
||||
* A recursion parameter preventing endless loops.
|
||||
* @return
|
||||
* Returns an array of all of the theme's ancestors; the first element's value
|
||||
* will be NULL if an error occurred.
|
||||
* This function has been deprecated in favor of drupal_find_base_themes().
|
||||
*/
|
||||
function system_find_base_themes($themes, $key, $used_keys = array()) {
|
||||
$base_key = $themes[$key]->info['base theme'];
|
||||
// Does the base theme exist?
|
||||
if (!isset($themes[$base_key])) {
|
||||
return array($base_key => NULL);
|
||||
}
|
||||
|
||||
$current_base_theme = array($base_key => $themes[$base_key]->info['name']);
|
||||
|
||||
// Is the base theme itself a child of another theme?
|
||||
if (isset($themes[$base_key]->info['base theme'])) {
|
||||
// Do we already know the base themes of this theme?
|
||||
if (isset($themes[$base_key]->base_themes)) {
|
||||
return $themes[$base_key]->base_themes + $current_base_theme;
|
||||
}
|
||||
// Prevent loops.
|
||||
if (!empty($used_keys[$base_key])) {
|
||||
return array($base_key => NULL);
|
||||
}
|
||||
$used_keys[$base_key] = TRUE;
|
||||
return system_find_base_themes($themes, $base_key, $used_keys) + $current_base_theme;
|
||||
}
|
||||
// If we get here, then this is our parent theme.
|
||||
return $current_base_theme;
|
||||
return drupal_find_base_themes($themes, $key, $used_keys);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue