diff --git a/core/includes/theme.inc b/core/includes/theme.inc index 4f1fb61..daf5cac 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -996,8 +996,8 @@ function theme($hook, $variables = array()) { // Supply original caller info. $variables += array( - 'theme_hook' => $base_theme_hook, - 'theme_hook_original' => $original_hook, + '#theme_hook' => $base_theme_hook, + '#theme_hook_original' => $original_hook, ); // Invoke hook_theme_suggestions_HOOK(). @@ -1054,10 +1054,18 @@ function theme($hook, $variables = array()) { $prepare_hooks[] = 'theme_prepare_' . $original_hook; } + // Send prepare arguments to invoke hooks with $variables passed by reference. + $prepare_args = array(&$variables, $base_theme_hook); + // Invokes hook_theme_prepare(), hook_theme_prepare_THEME_HOOK() for enabled // modules. foreach ($prepare_hooks as $prepare_hook) { - $variables = NestedArray::mergeDeep($variables, (array) Drupal::moduleHandler()->invokeAll($prepare_hook, array($variables, $base_theme_hook))); + foreach (\Drupal::moduleHandler()->getImplementations($prepare_hook) as $module) { + $prepare_function = $module . '_' . $prepare_hook; + if (function_exists($prepare_function)) { + call_user_func_array($prepare_function, $prepare_args); + } + } } // Invokes hook_theme_prepare(), hook_theme_prepare_THEME_HOOK() for the active @@ -1065,7 +1073,7 @@ function theme($hook, $variables = array()) { // @todo Replace with Drupal::themeHandler()->invoke() once implemented. // @see https://drupal.org/node/2029819 foreach ($prepare_hooks as $prepare_hook) { - $variables = NestedArray::mergeDeep($variables, (array) theme_invoke($prepare_hook, array($variables, $base_theme_hook))); + theme_invoke($prepare_hook, $prepare_args); } // Invokes hook_preprocess() and hook_preprocess_HOOK() implementations. This @@ -1577,7 +1585,7 @@ function theme_disable($theme_list) { * @param string $hook * The hook name to invoke. * @param array $args - * The array of arguments to pass to hook invocation. + * The array of arguments to pass to hook invocation (by reference). * * @return mixed * The value returned varies on which hook is invoked. @@ -1585,7 +1593,7 @@ function theme_disable($theme_list) { * @todo Remove once a proper Drupal::themeHandler() is created. * @see https://drupal.org/node/2029819 */ -function theme_invoke($hook, $args = array()) { +function theme_invoke($hook, &$args = array()) { // Allow the active theme to invoke hooks after the theme system has been // initialized. global $theme, $base_theme_info; diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemePrepareTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemePrepareTest.php index 8b1ed5d..089ab48 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemePrepareTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemePrepareTest.php @@ -36,18 +36,31 @@ function setUp() { function testThemePrepare() { $this->drupalGet('theme-test/prepare'); - $this->assertText('Inserted variable1 via hook_theme_prepare().'); - $this->assertText('Inserted variable2 via hook_theme_prepare_BASE_THEME_ID().'); - $this->assertText('Inserted themeVariable1 via theme hook_theme_prepare().'); - $this->assertText('Inserted themeVariable2 via theme hook_theme_prepare_BASE_THEME_ID().'); - } - - function testThemePrepareAlter() { - $this->drupalGet('theme-test/prepare-alter'); - $this->assertText('Inserted variable1 via hook_theme_prepare() was altered by hook_theme_prepare_alter().'); - $this->assertText('Inserted variable2 via hook_theme_prepare_BASE_THEME_ID() was altered by hook_theme_prepare_BASE_THEME_ID_alter().'); - $this->assertText('Inserted themeVariable1 via theme hook_theme_prepare() was altered by theme hook_theme_prepare_alter().'); - $this->assertText('Inserted themeVariable2 via theme hook_theme_prepare_BASE_THEME_ID() was altered by theme hook_theme_prepare_BASE_THEME_ID_alter().'); + $this->assertRaw('
moduleVariable1: Drupal\theme_test\ThemeTestController::prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleVariable2: Drupal\theme_test\ThemeTestController::prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleVariableSuggestion1: Drupal\theme_test\ThemeTestController::prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleVariableSuggestion2: Drupal\theme_test\ThemeTestController::prepare|theme_test_theme_prepare_theme_test_prepare__implemented|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|test_theme_theme_prepare_theme_test_prepare__implemented|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter|theme_test_theme_prepare_theme_test_prepare__implemented_alter
'); + $this->assertRaw('moduleVariableSuggestion3: Drupal\theme_test\ThemeTestController::prepare|theme_test_theme_prepare_theme_test_prepare__implemented__extended|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|test_theme_theme_prepare_theme_test_prepare__implemented__extended|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter|theme_test_theme_prepare_theme_test_prepare__implemented__extended_alter
'); + $this->assertRaw('moduleElement1: Drupal\theme_test\ThemeTestController::prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable1: theme_test_theme_prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable2: theme_test_theme_prepare_theme_test_prepare_element|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('themeInjectedVariable1: test_theme_theme_prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable3: theme_test_theme_prepare_theme_test_prepare_element_alter|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleElementSuggestion1: Drupal\theme_test\ThemeTestController::prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable1: theme_test_theme_prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable2: theme_test_theme_prepare_theme_test_prepare_element|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('themeInjectedVariable1: test_theme_theme_prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable3: theme_test_theme_prepare_theme_test_prepare_element_alter|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleElementSuggestion2: Drupal\theme_test\ThemeTestController::prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable1: theme_test_theme_prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable2: theme_test_theme_prepare_theme_test_prepare_element|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('themeInjectedVariable1: test_theme_theme_prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable3: theme_test_theme_prepare_theme_test_prepare_element_alter|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleElementSuggestion3: Drupal\theme_test\ThemeTestController::prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable1: theme_test_theme_prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable2: theme_test_theme_prepare_theme_test_prepare_element|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('themeInjectedVariable1: test_theme_theme_prepare|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); + $this->assertRaw('moduleInjectedVariable3: theme_test_theme_prepare_theme_test_prepare_element_alter|test_theme_theme_prepare|test_theme_theme_prepare_theme_test_prepare|theme_test_theme_prepare_alter|test_theme_theme_prepare_alter
'); } } diff --git a/core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/ThemeTestController.php b/core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/ThemeTestController.php index 1389cea..9becb7d 100644 --- a/core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/ThemeTestController.php +++ b/core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/ThemeTestController.php @@ -121,20 +121,67 @@ function functionSuggestionAlter() { } /** - * Menu callback for testing hook_theme_prepare(). + * Menu callback for testing hook_theme[_THEME_HOOK]_prepare[_alter](). */ function prepare() { return array( - '#theme' => 'theme_test_prepare_variable', - ); - } - - /** - * Menu callback for testing hook_theme_prepare_alter(). - */ - function prepareAlter() { - return array( - '#theme' => 'theme_test_prepare_alter_variable', + 'moduleVariable1' => array( + '#theme' => 'theme_test_prepare', + '#title' => 'moduleVariable1', + '#value' => __METHOD__, + ), + 'moduleVariable2' => array( + '#theme' => 'theme_test_prepare', + '#title' => 'moduleVariable2', + '#value' => __METHOD__, + ), + 'moduleVariableSuggestion1' => array( + '#theme' => 'theme_test_prepare__fallback', + '#title' => 'moduleVariableSuggestion1', + '#value' => __METHOD__, + ), + 'moduleVariableSuggestion2' => array( + '#theme' => 'theme_test_prepare__implemented', + '#title' => 'moduleVariableSuggestion2', + '#value' => __METHOD__, + ), + 'moduleVariableSuggestion3' => array( + '#theme' => 'theme_test_prepare__implemented__extended', + '#title' => 'moduleVariableSuggestion3', + '#value' => __METHOD__, + ), + 'moduleElement1' => array( + '#theme' => 'theme_test_prepare_element', + 'moduleElement1' => array( + '#theme' => 'theme_test_prepare', + '#title' => 'moduleElement1', + '#value' => __METHOD__, + ), + ), + 'moduleElementSuggestion1' => array( + '#theme' => 'theme_test_prepare_element__fallback', + 'moduleElementSuggestion1' => array( + '#theme' => 'theme_test_prepare', + '#title' => 'moduleElementSuggestion1', + '#value' => __METHOD__, + ), + ), + 'moduleElementSuggestion2' => array( + '#theme' => 'theme_test_prepare_element__implemented', + 'moduleElementSuggestion2' => array( + '#theme' => 'theme_test_prepare', + '#title' => 'moduleElementSuggestion2', + '#value' => __METHOD__, + ), + ), + 'moduleElementSuggestion3' => array( + '#theme' => 'theme_test_prepare_element__implemented__extended', + 'moduleElementSuggestion3' => array( + '#theme' => 'theme_test_prepare', + '#title' => 'moduleElementSuggestion3', + '#value' => __METHOD__, + ), + ), ); } diff --git a/core/modules/system/tests/modules/theme_test/theme_test.module b/core/modules/system/tests/modules/theme_test/theme_test.module index bab08b3..b088e7d 100644 --- a/core/modules/system/tests/modules/theme_test/theme_test.module +++ b/core/modules/system/tests/modules/theme_test/theme_test.module @@ -42,11 +42,12 @@ function theme_test_theme($existing, $type, $theme, $path) { $items['theme_test_function_template_override'] = array( 'variables' => array(), ); - $items['theme_test_prepare_variable'] = array( - 'variables' => array('element' => array()), + // hook_theme_prepare() theme hooks. + $items['theme_test_prepare'] = array( + 'variables' => array('hook' => NULL, 'title' => NULL, 'value' => NULL), ); - $items['theme_test_prepare_alter_variable'] = array( - 'variables' => array('element' => array()), + $items['theme_test_prepare_element'] = array( + 'render element' => 'element', ); return $items; } @@ -84,10 +85,6 @@ function theme_test_menu() { 'theme callback' => '_theme_custom_theme', 'route_name' => 'theme_test.prepare', ); - $items['theme-test/prepare-alter'] = array( - 'theme callback' => '_theme_custom_theme', - 'route_name' => 'theme_test.prepare_alter', - ); return $items; } /** @@ -175,73 +172,100 @@ function theme_theme_test_function_suggestions($variables) { } /** - * Implements hook_theme_suggestions_HOOK(). + * Returns HTML for theme_test_prepare theme hook. */ -function theme_test_theme_suggestions_theme_test_suggestion_provided(array $variables) { - return array('theme_test_suggestion_provided__' . 'foo'); +function theme_theme_test_prepare($variables) { + $title = $variables['title']; + $value = $variables['value']; + return "$title: $value
"; } -function theme_theme_test_prepare_variable($variables) { +/** + * Theme function for testing rendering of theme_test_prepare_element(). + */ +function theme_theme_test_prepare_element($variables) { return drupal_render($variables['element']); } -function theme_theme_test_prepare_alter_variable($variables) { - return drupal_render($variables['element']); +/** + * Implements hook_theme_suggestions_HOOK(). + */ +function theme_test_theme_suggestions_theme_test_suggestion_provided(array $variables) { + return array('theme_test_suggestion_provided__' . 'foo'); } /** * Implements hook_theme_prepare(). */ -function theme_test_theme_prepare($context) { - $variables = array(); - if ($context['theme_hook'] == 'theme_test_prepare_variable' || $context['theme_hook'] == 'theme_test_prepare_alter_variable') { - $variables['element'] = array( - 'variable1' => array( - '#markup' => 'Inserted variable1 via hook_theme_prepare().
', - ), +function theme_test_theme_prepare(&$variables, $hook) { + // Only prepare for the base hook. + if ($hook === 'theme_test_prepare') { + $variables['hook'] = $variables['#theme_hook_original']; + } + elseif ($hook === 'theme_test_prepare_element') { + $variables['element']['moduleInjectedVariable1'] = array( + '#theme' => 'theme_test_prepare__element', + '#title' => 'moduleInjectedVariable1', + '#value' => __FUNCTION__, ); } - return $variables; } /** - * Implements hook_theme_prepare_BASE_THEME_ID(). + * Implements hook_theme_prepare_alter(). */ -function theme_test_theme_prepare_theme_test_prepare_variable() { - $variables = array(); - $variables['element'] = array( - 'variable2' => array( - '#markup' => 'Inserted variable2 via hook_theme_prepare_BASE_THEME_ID().
', - ), - ); - return $variables; +function theme_test_theme_prepare_alter(&$variables, $hook) { + if ($hook === 'theme_test_prepare') { + $variables['value'] .= '|' . __FUNCTION__; + } } /** - * Implements hook_theme_prepare_BASE_THEME_ID(). + * Implements hook_theme_prepare_THEME_HOOK__SUGGESTION(). */ -function theme_test_theme_prepare_theme_test_prepare_alter_variable() { - $variables = array(); - $variables['element'] = array( - 'variable2' => array( - '#markup' => 'Inserted variable2 via hook_theme_prepare_BASE_THEME_ID().
', - ), - ); - return $variables; +function theme_test_theme_prepare_theme_test_prepare__implemented(&$variables) { + $variables['value'] .= '|' . __FUNCTION__; } /** - * Implements hook_theme_prepare_alter(). + * Implements hook_theme_prepare_THEME_HOOK__SUGGESTION_alter(). */ -function theme_test_theme_prepare_alter(&$variables, $context) { - if ($context['theme_hook'] == 'theme_test_prepare_alter_variable') { - $variables['element']['variable1']['#markup'] = 'Inserted variable1 via hook_theme_prepare() was altered by hook_theme_prepare_alter().
'; - } +function theme_test_theme_prepare_theme_test_prepare__implemented_alter(&$variables) { + $variables['value'] .= '|' . __FUNCTION__; } /** - * Implements hook_theme_prepare_BASE_THEME_ID_alter(). + * Implements hook_theme_prepare_THEME_HOOK__SUGGESTION__SUGGESTION(). */ -function theme_test_theme_prepare_theme_test_prepare_alter_variable_alter(&$variables) { - $variables['element']['variable2']['#markup'] = 'Inserted variable2 via hook_theme_prepare_BASE_THEME_ID() was altered by hook_theme_prepare_BASE_THEME_ID_alter().
'; +function theme_test_theme_prepare_theme_test_prepare__implemented__extended(&$variables) { + $variables['value'] .= '|' . __FUNCTION__; +} + +/** + * Implements hook_theme_prepare_THEME_HOOK__SUGGESTION__SUGGESTION_alter(). + */ +function theme_test_theme_prepare_theme_test_prepare__implemented__extended_alter(&$variables) { + $variables['value'] .= '|' . __FUNCTION__; +} + +/** + * Implements hook_theme_prepare_THEME_HOOK(). + */ +function theme_test_theme_prepare_theme_test_prepare_element(&$variables) { + $variables['element']['moduleInjectedVariable2'] = array( + '#theme' => 'theme_test_prepare__element', + '#title' => 'moduleInjectedVariable2', + '#value' => __FUNCTION__, + ); +} + +/** + * Implements hook_theme_prepare_THEME_HOOK(). + */ +function theme_test_theme_prepare_theme_test_prepare_element_alter(&$variables) { + $variables['element']['moduleInjectedVariable3'] = array( + '#theme' => 'theme_test_prepare__element', + '#title' => 'moduleInjectedVariable3', + '#value' => __FUNCTION__, + ); } diff --git a/core/modules/system/tests/modules/theme_test/theme_test.routing.yml b/core/modules/system/tests/modules/theme_test/theme_test.routing.yml index 53842d4..3c2f46e 100644 --- a/core/modules/system/tests/modules/theme_test/theme_test.routing.yml +++ b/core/modules/system/tests/modules/theme_test/theme_test.routing.yml @@ -83,3 +83,10 @@ theme_test.prepare_alter: _content: '\Drupal\theme_test\ThemeTestController::prepareAlter' requirements: _permission: 'access content' + +theme_test.prepare_suggestion: + path: '/theme-test/prepare-suggestion' + defaults: + _content: '\Drupal\theme_test\ThemeTestController::prepareSuggestion' + requirements: + _permission: 'access content' diff --git a/core/modules/system/tests/themes/test_theme/test_theme.theme b/core/modules/system/tests/themes/test_theme/test_theme.theme index 2fec7d3..3ed2b73 100644 --- a/core/modules/system/tests/themes/test_theme/test_theme.theme +++ b/core/modules/system/tests/themes/test_theme/test_theme.theme @@ -73,56 +73,66 @@ function test_theme_theme_test_function_suggestions__module_override($variables) /** * Implements hook_theme_prepare(). */ -function test_theme_theme_prepare($context) { - $variables = array(); - if ($context['theme_hook'] == 'theme_test_prepare_variable' || $context['theme_hook'] == 'theme_test_prepare_alter_variable') { - $variables['element'] = array( - 'themeVariable1' => array( - '#markup' => 'Inserted themeVariable1 via theme hook_theme_prepare().
', - ), +function test_theme_theme_prepare(&$variables, $hook) { + if ($hook === 'theme_test_prepare') { + $variables['value'] .= '|' . __FUNCTION__; + } + elseif ($hook === 'theme_test_prepare_element') { + $variables['element']['themeInjectedVariable1'] = array( + '#theme' => 'theme_test_prepare__element', + '#title' => 'themeInjectedVariable1', + '#value' => __FUNCTION__, ); } - return $variables; } /** - * Implements hook_theme_prepare_THEME_HOOK(). + * Implements hook_theme_prepare_alter(). */ -function test_theme_theme_prepare_theme_test_prepare_variable() { - $variables = array(); - $variables['element'] = array( - 'themeVariable2' => array( - '#markup' => 'Inserted themeVariable2 via theme hook_theme_prepare_BASE_THEME_ID().
', - ), - ); - return $variables; +function test_theme_theme_prepare_alter(&$variables, $hook) { + if ($hook === 'theme_test_prepare') { + $variables['value'] .= '|' . __FUNCTION__; + } } /** * Implements hook_theme_prepare_THEME_HOOK(). */ -function test_theme_theme_prepare_theme_test_prepare_alter_variable() { - $variables = array(); - $variables['element'] = array( - 'themeVariable2' => array( - '#markup' => 'Inserted themeVariable2 via theme hook_theme_prepare_BASE_THEME_ID().
', - ), - ); - return $variables; +function test_theme_theme_prepare_theme_test_prepare(&$variables) { + $variables['value'] .= '|' . __FUNCTION__; } /** - * Implements hook_theme_prepare_alter(). + * Implements hook_theme_prepare_THEME_HOOK_alter(). */ -function test_theme_theme_prepare_alter(&$variables, $context) { - if ($context['theme_hook'] == 'theme_test_prepare_alter_variable') { - $variables['element']['themeVariable1']['#markup'] = 'Inserted themeVariable1 via theme hook_theme_prepare() was altered by theme hook_theme_prepare_alter().
'; - } +function test_theme_theme_prepare_theme_test_prepare_alter($variables) { + $variables['value'] .= '|' . __FUNCTION__; +} + +/** + * Implements hook_theme_prepare_THEME_HOOK__SUGGESTION(). + */ +function test_theme_theme_prepare_theme_test_prepare__implemented($variables) { + $variables['value'] .= '|' . __FUNCTION__; +} + +/** + * Implements hook_theme_prepare_THEME_HOOK__SUGGESTION_alter(). + */ +function test_theme_theme_prepare_theme_test_prepare__implemented_alter($variables) { + $variables['value'] .= '|' . __FUNCTION__; +} + +/** + * Implements hook_theme_prepare_THEME_HOOK__SUGGESTION__SUGGESTION(). + */ +function test_theme_theme_prepare_theme_test_prepare__implemented__extended($variables) { + $variables['value'] .= '|' . __FUNCTION__; } /** - * Implements hook_theme_prepare_BASE_THEME_ID_alter(). + * Implements hook_theme_prepare_THEME_HOOK__SUGGESTION__SUGGESTION_alter(). */ -function test_theme_theme_prepare_theme_test_prepare_alter_variable_alter(&$variables) { - $variables['element']['themeVariable2']['#markup'] = 'Inserted themeVariable2 via theme hook_theme_prepare_BASE_THEME_ID() was altered by theme hook_theme_prepare_BASE_THEME_ID_alter().
'; +function test_theme_theme_prepare_theme_test_prepare__implemented__extended_alter($variables) { + $variables['value'] .= '|' . __FUNCTION__; }