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..7faa77c --- /dev/null +++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeSuggestionsAlterTest.php @@ -0,0 +1,97 @@ + '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.'); + + // 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.'); + + // 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.'); + } + + /** + * Tests that theme suggestion alter hooks work for specific theme calls. + */ + function testSpecificSuggestionsAlter() { + config('system.theme') + ->set('default', 'test_theme') + ->save(); + + // Test a specific theme call similar to '#theme' => 'node__article'. + $this->drupalGet('theme-test/specific-suggestion-alter'); + $this->assertText('Template for testing specific theme calls.'); + + // Ensure that the base hook is used to determine the suggestion alter hook. + module_enable(array('theme_suggestions_test')); + $this->drupalGet('theme-test/specific-suggestion-alter'); + $this->assertText('Template overridden based on suggestion alter hook determined by the base hook.'); + } + + /** + * Tests that theme suggestion alter hooks work for theme functions. + */ + function testThemeFunctionSuggestionsAlter() { + $this->drupalGet('theme-test/function-suggestion-alter'); + $this->assertText('Original theme function.'); + + // 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.'); + + // 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.'); + } + +} 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..58f9cdb --- /dev/null +++ b/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.module @@ -0,0 +1,27 @@ + 'theme_test_suggestions'); + } + + /** + * Menu callback for testing suggestion alter hooks with specific suggestions. + */ + function specificSuggestionAlter() { + return array('#theme' => 'theme_test_specific_suggestions__variant'); + } + + /** + * Menu callback for testing suggestion alter hooks with theme functions. + */ + function functionSuggestionAlter() { + return array('#theme' => 'theme_test_function_suggestions'); + } + } diff --git a/core/modules/system/tests/modules/theme_test/templates/theme-test-suggestions--specific.html.twig b/core/modules/system/tests/modules/theme_test/templates/theme-test-suggestions--specific.html.twig new file mode 100644 index 0000000..6e112fd --- /dev/null +++ b/core/modules/system/tests/modules/theme_test/templates/theme-test-suggestions--specific.html.twig @@ -0,0 +1,2 @@ +{# Output for Theme API test #} +Template for testing specific theme calls. diff --git a/core/modules/system/tests/modules/theme_test/templates/theme-test-suggestions.html.twig b/core/modules/system/tests/modules/theme_test/templates/theme-test-suggestions.html.twig new file mode 100644 index 0000000..dfc848c --- /dev/null +++ b/core/modules/system/tests/modules/theme_test/templates/theme-test-suggestions.html.twig @@ -0,0 +1,2 @@ +{# Output for Theme API test #} +Original template. 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 51cb6d3..19f1ff5 100644 --- a/core/modules/system/tests/modules/theme_test/theme_test.module +++ b/core/modules/system/tests/modules/theme_test/theme_test.module @@ -14,6 +14,17 @@ function theme_test_theme($existing, $type, $theme, $path) { $items['theme_test_template_test_2'] = array( 'template' => 'theme_test.template_test', ); + $items['theme_test_specific_suggestions'] = array( + 'template' => 'theme-test-specific-suggestions', + 'variables' => array(), + ); + $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), ); @@ -52,6 +63,18 @@ function theme_test_menu() { 'theme callback' => '_theme_custom_theme', 'type' => MENU_CALLBACK, ); + $items['theme-test/suggestion-alter'] = array( + 'title' => 'Test suggestion alter hook for template files', + 'route_name' => 'suggestion_alter', + ); + $items['theme-test/specific-suggestion-alter'] = array( + 'title' => 'Test suggestion alter hook for specific theme suggestions', + 'route_name' => 'specific_suggestion_alter', + ); + $items['theme-test/function-suggestion-alter'] = array( + 'title' => 'Test suggestion alter hook for theme functions', + 'route_name' => 'function_suggestion_alter', + ); $items['theme-test/alter'] = array( 'title' => 'Suggestion', 'page callback' => '_theme_test_alter', @@ -197,3 +220,10 @@ function template_preprocess_theme_test_render_element(&$variables) { function theme_theme_test_render_element_children($variables) { return drupal_render($variables['element']); } + +/** + * 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/modules/theme_test/theme_test.routing.yml b/core/modules/system/tests/modules/theme_test/theme_test.routing.yml index 866171e..1f3d8af 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 @@ -4,3 +4,21 @@ function_template_override: _content: '\Drupal\theme_test\ThemeTestController::functionTemplateOverridden' requirements: _permission: 'access content' +suggestion_alter: + pattern: '/theme-test/suggestion-alter' + defaults: + _content: '\Drupal\theme_test\ThemeTestController::suggestionAlter' + requirements: + _permission: 'access content' +specific_suggestion_alter: + pattern: '/theme-test/specific-suggestion-alter' + defaults: + _content: '\Drupal\theme_test\ThemeTestController::specificSuggestionAlter' + requirements: + _permission: 'access content' +function_suggestion_alter: + pattern: '/theme-test/function-suggestion-alter' + defaults: + _content: '\Drupal\theme_test\ThemeTestController::functionSuggestionAlter' + requirements: + _permission: 'access content' diff --git a/core/modules/system/tests/themes/test_theme/templates/theme-test-specific-suggestions--variant--foo.html.twig b/core/modules/system/tests/themes/test_theme/templates/theme-test-specific-suggestions--variant--foo.html.twig new file mode 100644 index 0000000..f0de75d --- /dev/null +++ b/core/modules/system/tests/themes/test_theme/templates/theme-test-specific-suggestions--variant--foo.html.twig @@ -0,0 +1,2 @@ +{# Output for Theme API test #} +Template overridden based on suggestion alter hook determined by the base hook. diff --git a/core/modules/system/tests/themes/test_theme/templates/theme-test-specific-suggestions--variant.html.twig b/core/modules/system/tests/themes/test_theme/templates/theme-test-specific-suggestions--variant.html.twig new file mode 100644 index 0000000..6e112fd --- /dev/null +++ b/core/modules/system/tests/themes/test_theme/templates/theme-test-specific-suggestions--variant.html.twig @@ -0,0 +1,2 @@ +{# Output for Theme API test #} +Template for testing specific theme calls. 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.'; +}