#591794 by chx, Rob Loach, sun, JohnAlbin: Give themes access to alter hooks.

merge-requests/26/head
Angie Byron 2009-10-27 19:29:12 +00:00
parent 37eb92447f
commit 1da73d26c2
4 changed files with 62 additions and 7 deletions

View File

@ -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);
}
}
}
}
/**

View File

@ -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;

View File

@ -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.'));

View File

@ -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().
*/