#591794 by chx, Rob Loach, sun, JohnAlbin: Give themes access to alter hooks.
parent
37eb92447f
commit
1da73d26c2
|
@ -4520,6 +4520,22 @@ function drupal_alter($type, &$data, &$context1 = NULL, &$context2 = NULL) {
|
|||
$function = $module . '_' . $hook;
|
||||
$function($data, $context1, $context2);
|
||||
}
|
||||
// Allow the theme to alter variables after the theme system has been
|
||||
// initialized.
|
||||
global $theme, $base_theme_info;
|
||||
if (isset($theme)) {
|
||||
$theme_keys = array();
|
||||
foreach ($base_theme_info as $base) {
|
||||
$theme_keys[] = $base->name;
|
||||
}
|
||||
$theme_keys[] = $theme;
|
||||
foreach ($theme_keys as $theme_key) {
|
||||
$function = $theme_key . '_' . $hook;
|
||||
if (function_exists($function)) {
|
||||
$function($data, $context1, $context2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -33,7 +33,7 @@ function _drupal_maintenance_theme() {
|
|||
|
||||
// Install and update pages are treated differently to prevent theming overrides.
|
||||
if (defined('MAINTENANCE_MODE') && (MAINTENANCE_MODE == 'install' || MAINTENANCE_MODE == 'update')) {
|
||||
$theme = 'minnelli';
|
||||
$custom_theme = 'minnelli';
|
||||
}
|
||||
else {
|
||||
if (!db_is_active()) {
|
||||
|
@ -46,11 +46,16 @@ function _drupal_maintenance_theme() {
|
|||
drupal_load('module', 'filter');
|
||||
}
|
||||
|
||||
$theme = variable_get('maintenance_theme', 'minnelli');
|
||||
$custom_theme = variable_get('maintenance_theme', 'minnelli');
|
||||
}
|
||||
|
||||
$themes = list_themes();
|
||||
|
||||
// list_themes() triggers a drupal_alter() in maintenance mode, but we can't
|
||||
// let themes alter the .info data until we know a theme's base themes. So
|
||||
// don't set global $theme until after list_themes() builds its cache.
|
||||
$theme = $custom_theme;
|
||||
|
||||
// Store the identifier for retrieving theme settings with.
|
||||
$theme_key = $theme;
|
||||
|
||||
|
|
|
@ -29,24 +29,24 @@ class DrupalAlterTestCase extends DrupalWebTestCase {
|
|||
|
||||
// Verify alteration of a single argument.
|
||||
$array_copy = $array;
|
||||
$array_expected = array('foo' => 'Drupal');
|
||||
$array_expected = array('foo' => 'Drupal theme');
|
||||
drupal_alter('drupal_alter', $array_copy);
|
||||
$this->assertEqual($array_copy, $array_expected, t('Single array was altered.'));
|
||||
|
||||
$object_copy = clone $object;
|
||||
$object_expected = clone $object;
|
||||
$object_expected->foo = 'Drupal';
|
||||
$object_expected->foo = 'Drupal theme';
|
||||
drupal_alter('drupal_alter', $object_copy);
|
||||
$this->assertEqual($object_copy, $object_expected, t('Single object was altered.'));
|
||||
|
||||
// Verify alteration of multiple arguments.
|
||||
$array_copy = $array;
|
||||
$array_expected = array('foo' => 'Drupal');
|
||||
$array_expected = array('foo' => 'Drupal theme');
|
||||
$object_copy = clone $object;
|
||||
$object_expected = clone $object;
|
||||
$object_expected->foo = 'Drupal';
|
||||
$object_expected->foo = 'Drupal theme';
|
||||
$array2_copy = $array;
|
||||
$array2_expected = array('foo' => 'Drupal');
|
||||
$array2_expected = array('foo' => 'Drupal theme');
|
||||
drupal_alter('drupal_alter', $array_copy, $object_copy, $array2_copy);
|
||||
$this->assertEqual($array_copy, $array_expected, t('First argument to drupal_alter() was altered.'));
|
||||
$this->assertEqual($object_copy, $object_expected, t('Second argument to drupal_alter() was altered.'));
|
||||
|
|
|
@ -100,6 +100,40 @@ function common_test_drupal_alter_alter(&$data, &$arg2 = NULL, &$arg3 = NULL) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement hook_TYPE_alter() on behalf of Garland theme.
|
||||
*
|
||||
* Same as common_test_drupal_alter_alter(), but here, we verify that themes
|
||||
* can also alter and come last.
|
||||
*/
|
||||
function garland_drupal_alter_alter(&$data, &$arg2 = NULL, &$arg3 = NULL) {
|
||||
// Alter first argument.
|
||||
if (is_array($data)) {
|
||||
$data['foo'] .= ' theme';
|
||||
}
|
||||
elseif (is_object($data)) {
|
||||
$data->foo .= ' theme';
|
||||
}
|
||||
// Alter second argument, if present.
|
||||
if (isset($arg2)) {
|
||||
if (is_array($arg2)) {
|
||||
$arg2['foo'] .= ' theme';
|
||||
}
|
||||
elseif (is_object($arg2)) {
|
||||
$arg2->foo .= ' theme';
|
||||
}
|
||||
}
|
||||
// Try to alter third argument, if present.
|
||||
if (isset($arg3)) {
|
||||
if (is_array($arg3)) {
|
||||
$arg3['foo'] .= ' theme';
|
||||
}
|
||||
elseif (is_object($arg3)) {
|
||||
$arg3->foo .= ' theme';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement hook_theme().
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue