diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeSuggestionsAlterTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeSuggestionsAlterTest.php new file mode 100644 index 0000000..39c2cec --- /dev/null +++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeSuggestionsAlterTest.php @@ -0,0 +1,79 @@ + 'Theme suggestions alter', + 'description' => 'Test theme suggestion alter hooks.', + 'group' => 'Theme', + ); + } + + function setUp() { + parent::setUp(); + theme_enable(array('test_theme')); + } + + /** + * Tests that theme suggestion alter hooks work for templates. + */ + function testTemplateSuggestionsAlter() { + $this->drupalGet('theme-test/suggestion-alter'); + $this->assertText('Original template.', 'Original template rendered.'); + + // Enable test_theme and test that themes can alter template suggestions. + config('system.theme') + ->set('default', 'test_theme') + ->save(); + $this->drupalGet('theme-test/suggestion-alter'); + $this->assertText('Template overridden based on new theme suggestion provided by the test_theme theme.', 'Template suggestion provided by theme rendered.'); + + // Enable the theme_suggestions_test module to test modules implementing + // suggestions alter hooks. + module_enable(array('theme_suggestions_test')); + $this->drupalGet('theme-test/suggestion-alter'); + $this->assertText('Template overridden based on new theme suggestion provided by a module.', 'Template suggestion provided by module rendered.'); + } + + /** + * Tests that theme suggestion alter hooks work for theme functions. + */ + function testThemeFunctionSuggestionsAlter() { + $this->drupalGet('theme-test/function-suggestion-alter'); + $this->assertText('Original theme function.', 'Original theme function rendered.'); + + // Enable test_theme and test that themes can alter theme suggestions. + config('system.theme') + ->set('default', 'test_theme') + ->save(); + $this->drupalGet('theme-test/function-suggestion-alter'); + $this->assertText('Theme function overridden based on new theme suggestion provided by the test_theme theme.', 'Theme function suggestion provided by theme rendered.'); + + // Enable the theme_suggestions_test module to test modules implementing + // suggestions alter hooks. + module_enable(array('theme_suggestions_test')); + $this->drupalGet('theme-test/function-suggestion-alter'); + $this->assertText('Theme function overridden based on new theme suggestion provided by a module.', 'Theme function suggestion provided by module rendered.'); + } + +} diff --git a/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.info.yml b/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.info.yml new file mode 100644 index 0000000..95f429f --- /dev/null +++ b/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.info.yml @@ -0,0 +1,7 @@ +name: 'Theme suggestions test' +type: module +description: 'Support module for testing theme suggestions.' +package: Testing +version: VERSION +core: 8.x +hidden: true diff --git a/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.module b/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.module new file mode 100644 index 0000000..4b50763 --- /dev/null +++ b/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.module @@ -0,0 +1,20 @@ + 'theme_test.template_test', ); + $items['theme_test_suggestions'] = array( + 'template' => 'theme-test-suggestions', + 'variables' => array(), + ); + $items['theme_test_function_suggestions'] = array( + 'variables' => array(), + ); $items['theme_test_foo'] = array( 'variables' => array('foo' => NULL), ); @@ -49,6 +56,16 @@ function theme_test_menu() { 'theme callback' => '_theme_custom_theme', 'type' => MENU_CALLBACK, ); + $items['theme-test/suggestion-alter'] = array( + 'page callback' => 'theme_test_suggestion_alter', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + $items['theme-test/function-suggestion-alter'] = array( + 'page callback' => 'theme_test_function_suggestion_alter', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); $items['theme-test/alter'] = array( 'title' => 'Suggestion', 'page callback' => '_theme_test_alter', @@ -178,3 +195,38 @@ function template_preprocess_theme_test_render_element(&$variables) { function theme_theme_test_render_element_children($variables) { return drupal_render($variables['element']); } + +/** + * Page callback: Displays theme suggestions test data. + * + * Used for testing theme hooks defined as template files. + * + * @return array + * A render array to generate theme suggestions test output. + * + * @see theme_test_menu() + */ +function theme_test_suggestion_alter() { + return array('#theme' => 'theme_test_suggestions'); +} + +/** + * Page callback: Displays theme suggestions test data. + * + * Used for testing theme hooks defined as theme functions. + * + * @return array + * A render array to generate theme suggestions test output. + * + * @see theme_test_menu() + */ +function theme_test_function_suggestion_alter() { + return array('#theme' => 'theme_test_function_suggestions'); +} + +/** + * Returns HTML for a theme function suggestion test. + */ +function theme_theme_test_function_suggestions($variables) { + return 'Original theme function.'; +} diff --git a/core/modules/system/tests/themes/test_theme/templates/theme-test-suggestions--module-override.html.twig b/core/modules/system/tests/themes/test_theme/templates/theme-test-suggestions--module-override.html.twig new file mode 100644 index 0000000..26ce57b --- /dev/null +++ b/core/modules/system/tests/themes/test_theme/templates/theme-test-suggestions--module-override.html.twig @@ -0,0 +1,2 @@ +{# Output for Theme API test #} +Template overridden based on new theme suggestion provided by a module. diff --git a/core/modules/system/tests/themes/test_theme/templates/theme-test-suggestions--theme-override.html.twig b/core/modules/system/tests/themes/test_theme/templates/theme-test-suggestions--theme-override.html.twig new file mode 100644 index 0000000..dee829f --- /dev/null +++ b/core/modules/system/tests/themes/test_theme/templates/theme-test-suggestions--theme-override.html.twig @@ -0,0 +1,2 @@ +{# Output for Theme API test #} +Template overridden based on new theme suggestion provided by the test_theme theme. 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 62b5abf..9b10b2b 100644 --- a/core/modules/system/tests/themes/test_theme/test_theme.theme +++ b/core/modules/system/tests/themes/test_theme/test_theme.theme @@ -29,3 +29,43 @@ function test_theme_theme_test__suggestion($variables) { function test_theme_theme_test_alter_alter(&$data) { $data = 'test_theme_theme_test_alter_alter was invoked'; } + +/** + * Implements hook_theme_suggestions_HOOK_alter(). + */ +function test_theme_theme_suggestions_theme_test_suggestions_alter(array &$suggestions, array $variables) { + // Theme alter hooks run after module alter hooks, so add this theme + // suggestion to the beginning of the array so that the suggestion added by + // the theme_suggestions_test module can be picked up when that module is + // enabled. + array_unshift($suggestions, 'theme_test_suggestions__' . 'theme_override'); +} + +/** + * Implements hook_theme_suggestions_HOOK_alter(). + */ +function test_theme_theme_suggestions_theme_test_function_suggestions_alter(array &$suggestions, array $variables) { + // Theme alter hooks run after module alter hooks, so add this theme + // suggestion to the beginning of the array so that the suggestion added by + // the theme_suggestions_test module can be picked up when that module is + // enabled. + array_unshift($suggestions, 'theme_test_function_suggestions__' . 'theme_override'); +} + +/** + * Returns HTML for a theme function suggestion test. + * + * Implements the theme_test_function_suggestions__theme_override suggestion. + */ +function test_theme_theme_test_function_suggestions__theme_override($variables) { + return 'Theme function overridden based on new theme suggestion provided by the test_theme theme.'; +} + +/** + * Returns HTML for a theme function suggestion test. + * + * Implements the theme_test_function_suggestions__module_override suggestion. + */ +function test_theme_theme_test_function_suggestions__module_override($variables) { + return 'Theme function overridden based on new theme suggestion provided by a module.'; +}