diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTemplateSuggestionsTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTemplateSuggestionsTest.php new file mode 100644 index 0000000..11b1268 --- /dev/null +++ b/core/modules/node/lib/Drupal/node/Tests/NodeTemplateSuggestionsTest.php @@ -0,0 +1,47 @@ + 'Node template suggestions', + 'description' => 'Tests the node template suggestions.', + 'group' => 'Node', + ); + } + + /** + * Test if template_preprocess_node() handles the suggestions right. + */ + function testNodeThemeHookSuggestions() { + // Create node to be rendered. + $node = $this->drupalCreateNode(); + $view_mode = 'full'; + + // Simulate theming of the node. + $build = \Drupal::entityManager()->getViewBuilder('node')->view($node, $view_mode); + + $variables['elements'] = $build; + $suggestions = \Drupal::moduleHandler()->invokeAll('theme_suggestions_node', array($variables)); + + $this->assertEqual($suggestions, array('node__full', 'node__page', 'node__page__full', 'node__' . $node->id(), 'node__' . $node->id() . '__full'), t('Found expected node suggestions.')); + + //Change the view_mode. + $view_mode = 'node.myCustomNodeView...123'; + $build = \Drupal::entityManager()->getViewBuilder('node')->view($node, $view_mode); + + $variables['elements'] = $build; + $suggestions = \Drupal::moduleHandler()->invokeAll('theme_suggestions_node', array($variables)); + + $this->assertEqual($suggestions, array('node__node_mycustomnodeview_123', 'node__page', 'node__page__node_mycustomnodeview_123', 'node__' . $node->id(), 'node__' . $node->id() . '__node_mycustomnodeview_123'), t('Found expected node suggestions.')); + } +} \ No newline at end of file diff --git a/core/modules/node/node.module b/core/modules/node/node.module index a850c8a..cc19013 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -639,9 +639,13 @@ function node_preprocess_block(&$variables) { function node_theme_suggestions_node(array $variables) { $suggestions = array(); $node = $variables['elements']['#node']; + $sanitized_view_mode = strtolower(preg_replace('/[^a-zA-Z0-9]+/', '_', $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; }