diff --git a/core/includes/theme.inc b/core/includes/theme.inc index e44f13d..d9f9673 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -511,8 +511,11 @@ function _theme($hook, $variables = array()) { $base_theme_hook = $hook; } + // Entity based theme suggestions. + $suggestions = theme_get_entity_suggestions($variables, $base_theme_hook); + // Invoke hook_theme_suggestions_HOOK(). - $suggestions = $module_handler->invokeAll('theme_suggestions_' . $base_theme_hook, array($variables)); + $suggestions += $module_handler->invokeAll('theme_suggestions_' . $base_theme_hook, array($variables)); // If _theme() was invoked with a direct theme suggestion like // '#theme' => 'node__article', add it to the suggestions array before // invoking suggestion alter hooks. @@ -2248,6 +2251,33 @@ function theme_get_suggestions($args, $base, $delimiter = '__') { } /** + * Returns the entity based theme suggestions. + * + * @param $variables + * The theming variables. + * @param $entity_type_id + * The entity type id is being rendered. + * + * @return array + * An array of theme suggestions based on the entity type id. + */ +function theme_get_entity_suggestions($variables, $entity_type_id) { + $suggestions = array(); + $entity_definition = Drupal::entityManager()->getDefinition($entity_type_id); + if ($entity_definition && $entity_definition->hasViewBuilderClass() && isset($variables['elements']['#view_mode'])) { + $entity = $variables['elements']["#$entity_type_id"]; + $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); + + $suggestions[] = "{$entity->getEntityTypeId()}__$sanitized_view_mode";; + $suggestions[] = "{$entity->getEntityTypeId()}__{$entity->bundle()}"; + $suggestions[] = "{$entity->getEntityTypeId()}__{$entity->bundle()}__$sanitized_view_mode"; + $suggestions[] = "{$entity->getEntityTypeId()}__{$entity->id()}"; + $suggestions[] = "{$entity->getEntityTypeId()}__{$entity->id()}__$sanitized_view_mode"; + } + return $suggestions; +} + +/** * Prepare variables for maintenance page templates. * * Default template: maintenance-page.html.twig. diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTemplateSuggestionsTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTemplateSuggestionsTest.php index fbf03e9..bab3f3d 100644 --- a/core/modules/node/lib/Drupal/node/Tests/NodeTemplateSuggestionsTest.php +++ b/core/modules/node/lib/Drupal/node/Tests/NodeTemplateSuggestionsTest.php @@ -35,7 +35,7 @@ function testNodeThemeHookSuggestions() { $build = \Drupal::entityManager()->getViewBuilder('node')->view($node, $view_mode); $variables['elements'] = $build; - $suggestions = \Drupal::moduleHandler()->invokeAll('theme_suggestions_node', array($variables)); + $suggestions = theme_get_entity_suggestions($variables, 'node'); $this->assertEqual($suggestions, array('node__full', 'node__page', 'node__page__full', 'node__' . $node->id(), 'node__' . $node->id() . '__full'), 'Found expected node suggestions.'); @@ -44,7 +44,7 @@ function testNodeThemeHookSuggestions() { $build = \Drupal::entityManager()->getViewBuilder('node')->view($node, $view_mode); $variables['elements'] = $build; - $suggestions = \Drupal::moduleHandler()->invokeAll('theme_suggestions_node', array($variables)); + $suggestions = theme_get_entity_suggestions($variables, 'node'); $this->assertEqual($suggestions, array('node__node_my_custom_view_mode', 'node__page', 'node__page__node_my_custom_view_mode', 'node__' . $node->id(), 'node__' . $node->id() . '__node_my_custom_view_mode'), 'Found expected node suggestions.'); } diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 2253f71..71d0d49 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -597,23 +597,6 @@ function node_preprocess_block(&$variables) { } /** - * Implements hook_theme_suggestions_HOOK(). - */ -function node_theme_suggestions_node(array $variables) { - $suggestions = array(); - $node = $variables['elements']['#node']; - $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); - - $suggestions[] = 'node__' . $sanitized_view_mode; - $suggestions[] = 'node__' . $node->bundle(); - $suggestions[] = 'node__' . $node->bundle() . '__' . $sanitized_view_mode; - $suggestions[] = 'node__' . $node->id(); - $suggestions[] = 'node__' . $node->id() . '__' . $sanitized_view_mode; - - return $suggestions; -} - -/** * Prepares variables for node templates. * * Default template: node.html.twig.