diff --git a/core/includes/theme.inc b/core/includes/theme.inc index fcf5fde..562457e 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -1032,18 +1032,17 @@ function theme($hook, $variables = array()) { 'theme_hook_original' => $original_hook, ); - // Invoke template suggestion alter hooks. + // Invoke theme hook suggestion alter hooks. $suggestions = array(); $suggestion_hooks = array( 'theme_suggestions', 'theme_suggestions_' . $hook, ); - // @todo Consider passing $hook as last argument like hook_form_alter() does. - Drupal::moduleHandler()->alter($suggestion_hooks, $suggestions, $variables); + Drupal::moduleHandler()->alter($suggestion_hooks, $suggestions, $variables, $hook); // Check if each suggestion exists in the theme registry, and if so, // use it instead of the hook that theme() was called with. For example, a - // function may call theme('node', ...), but a a module can add + // function may call theme('node', ...), but a module can add // 'node__article' as a suggestion via hook_theme_suggestions_HOOK, // enabling a theme to have an alternate template file for article nodes. foreach (array_reverse($suggestions) as $suggestion) { diff --git a/core/modules/block/block.module b/core/modules/block/block.module index e4811d4..c61f7df 100644 --- a/core/modules/block/block.module +++ b/core/modules/block/block.module @@ -507,7 +507,7 @@ function block_rebuild() { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function block_theme_suggestions_block_alter(&$suggestions, $variables) { +function block_theme_suggestions_block_alter(array &$suggestions, array $variables) { $suggestions[] = 'block__' . $variables['elements']['#configuration']['module']; // Hyphens (-) and underscores (_) play a special role in theme suggestions. // Theme suggestions should only contain underscores, because within diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockTemplateSuggestionsUnitTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockTemplateSuggestionsUnitTest.php index bc4ab59..67ce2ed 100644 --- a/core/modules/block/lib/Drupal/block/Tests/BlockTemplateSuggestionsUnitTest.php +++ b/core/modules/block/lib/Drupal/block/Tests/BlockTemplateSuggestionsUnitTest.php @@ -43,7 +43,6 @@ function testBlockThemeHookSuggestions() { 'id' => config('system.theme')->get('default') . '.machinename', )); - // @todo Cast to array in suggestions alter hook signature? $suggestions = array(); $variables = array(); $variables['elements']['#block'] = $block; diff --git a/core/modules/field/field.module b/core/modules/field/field.module index 1a17c72..7fcfd8c 100644 --- a/core/modules/field/field.module +++ b/core/modules/field/field.module @@ -901,7 +901,7 @@ function field_page_build(&$page) { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function field_theme_suggestions_field_alter(&$suggestions, $variables) { +function field_theme_suggestions_field_alter(array &$suggestions, array $variables) { $element = $variables['element']; $suggestions = array_merge($suggestions, array( diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module index f08eac7..f248cbb 100644 --- a/core/modules/forum/forum.module +++ b/core/modules/forum/forum.module @@ -964,7 +964,7 @@ function forum_preprocess_block(&$variables) { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function forum_theme_suggestions_forums_alter(&$suggestions, $variables) { +function forum_theme_suggestions_forums_alter(array &$suggestions, array $variables) { // Provide separate template suggestions based on what's being output. Topic // ID is also accounted for. Check both variables to be safe then the inverse. // Forums with topic IDs take precedence. diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 71a1435..89ed108 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -1022,7 +1022,7 @@ function node_preprocess_block(&$variables) { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function node_theme_suggestions_node_alter(&$suggestions, $variables) { +function node_theme_suggestions_node_alter(array &$suggestions, array $variables) { $node = $variables['elements']['#node']; $suggestions = array_merge($suggestions, array( diff --git a/core/modules/search/search.pages.inc b/core/modules/search/search.pages.inc index fc3705d..e978107 100644 --- a/core/modules/search/search.pages.inc +++ b/core/modules/search/search.pages.inc @@ -77,7 +77,7 @@ function search_view($module = NULL, $keys = '') { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function search_theme_suggestions_search_results_alter(&$suggestions, $variables) { +function search_theme_suggestions_search_results_alter(array &$suggestions, array $variables) { $suggestions[] = 'search_results__' . $variables['module']; } @@ -116,7 +116,7 @@ function template_preprocess_search_results(&$variables) { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function search_theme_suggestions_search_result_alter(&$suggestions, $variables) { +function search_theme_suggestions_search_result_alter(array &$suggestions, array $variables) { $suggestions[] = 'search_result__' . $variables['module']; } diff --git a/core/modules/system/system.module b/core/modules/system/system.module index 6117d29..974d52c 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -1045,21 +1045,21 @@ function system_menu() { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function system_theme_suggestions_html_alter(&$suggestions, $variables) { +function system_theme_suggestions_html_alter(array &$suggestions, array $variables) { $suggestions = array_merge($suggestions, theme_get_suggestions(arg(), 'html')); } /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function system_theme_suggestions_page_alter(&$suggestions, $variables) { +function system_theme_suggestions_page_alter(array &$suggestions, array $variables) { $suggestions = array_merge($suggestions, theme_get_suggestions(arg(), 'page')); } /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function system_theme_suggestions_maintenance_page_alter(&$suggestions, $variables) { +function system_theme_suggestions_maintenance_page_alter(array &$suggestions, array $variables) { // Dead databases will show error messages so supplying this template will // allow themers to override the page and the content completely. if (defined('MAINTENANCE_MODE')) { @@ -1070,7 +1070,7 @@ function system_theme_suggestions_maintenance_page_alter(&$suggestions, $variabl /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function system_theme_suggestions_region_alter(&$suggestions, $variables) { +function system_theme_suggestions_region_alter(array &$suggestions, array $variables) { if (!empty($variables['elements']['#region'])) { $suggestions[] = 'region__' . $variables['elements']['#region']; } diff --git a/core/modules/system/theme.api.php b/core/modules/system/theme.api.php index 85f21d1..5f705a0 100644 --- a/core/modules/system/theme.api.php +++ b/core/modules/system/theme.api.php @@ -158,6 +158,44 @@ function hook_preprocess_HOOK(&$variables) { } /** + * Alters theme suggestions. + * + * Provide alternative theme function or template suggestions for theme hooks. + * + * @param array $suggestions + * An array of theme suggestions. + * @param array $variables + * An array of variables passed to the theme hook. Note that this hook is + * invoked before any preprocessing. + * @param string $hook + * The theme hook being called. + * + * @see hook_theme_suggestions_HOOK_alter() + */ +function hook_theme_suggestions_alter(array &$suggestions, array $variables, $hook) { + if ($hook == 'node') { + $suggestions[] = 'node__' . $variables['elements']['#langcode']; + } +} + +/** + * Alters theme suggestions for a specific theme hook. + * + * @param array $suggestions + * An array of theme suggestions. + * @param array $variables + * An array of variables passed to the theme hook. Note that this hook is + * invoked before any preprocessing. + * + * @see hook_theme_suggestions_alter() + */ +function hook_theme_suggestions_HOOK_alter(array &$suggestions, array $variables) { + if (empty($variables['header'])) { + $suggestions[] = 'hookname__' . 'no_header'; + } +} + +/** * Process theme variables for templates. * * This hook allows modules to process theme variables for theme templates. It diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module index 169c8a2..8fe680a 100644 --- a/core/modules/taxonomy/taxonomy.module +++ b/core/modules/taxonomy/taxonomy.module @@ -452,7 +452,7 @@ function taxonomy_term_view_multiple(array $terms, $view_mode = 'full', $langcod /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function taxonomy_theme_suggestions_taxonomy_term_alter(&$suggestions, $variables) { +function taxonomy_theme_suggestions_taxonomy_term_alter(array &$suggestions, array $variables) { $term = $variables['elements']['#term']; $suggestions[] = 'taxonomy_term__' . $term->bundle(); diff --git a/core/modules/views/views.module b/core/modules/views/views.module index a5aa10a..ef46616 100644 --- a/core/modules/views/views.module +++ b/core/modules/views/views.module @@ -258,7 +258,7 @@ function views_preprocess_node(&$vars) { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function views_theme_suggestions_node_alter(&$suggestions, $variables) { +function views_theme_suggestions_node_alter(array &$suggestions, array $variables) { $node = $variables['elements']['#node']; if (!empty($node->view) && $node->view->storage->id()) { $suggestions[] = 'node__view__' . $node->view->storage->id(); @@ -283,7 +283,7 @@ function views_preprocess_comment(&$vars) { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function views_theme_suggestions_comment_alter(&$suggestions, $variables) { +function views_theme_suggestions_comment_alter(array &$suggestions, array $variables) { $comment = $variables['elements']['#comment']; if (!empty($comment->view) && $comment->view->storage->id()) { $suggestions[] = 'comment__view__' . $comment->view->storage->id(); diff --git a/core/modules/views_ui/views_ui.theme.inc b/core/modules/views_ui/views_ui.theme.inc index 48eb6d1..3235699 100644 --- a/core/modules/views_ui/views_ui.theme.inc +++ b/core/modules/views_ui/views_ui.theme.inc @@ -455,7 +455,7 @@ function template_preprocess_views_ui_view_preview_section(&$vars) { /** * Implements hook_theme_suggestions_HOOK_alter(). */ -function views_ui_theme_suggestions_views_ui_view_preview_section_alter(&$suggestions, $variables) { +function views_ui_theme_suggestions_views_ui_view_preview_section_alter(array &$suggestions, array $variables) { $suggestions[] = 'views_ui_view_preview_section__' . $variables['section']; }