我们遇到一个需求,需要根据节点分类的不同,单独的定义一个节点模板文件,但是Drupal8默认的模板建议,没有支持分类的分支。幸好,Drupal8提供了响应的钩子函数,供我们alter。两种写法:
写法一:
function nexus_theme_suggestions_alter(array &$suggestions, array $variables, $hook){ if($hook == 'node'){ $node = $variables['elements']['#node']; $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); $type = $node->getType(); if($type == 'article'){ $term = $node->field_category->entity; $tid = $term->id(); if($tid == '4'){ $suggestions[] = 'node__' . $sanitized_view_mode; $suggestions[] = 'node__' . $node->bundle(); $suggestions[] = 'node__article__taxonomy_term_4'; $suggestions[] = 'node__' . $node->bundle() . '__' . $sanitized_view_mode; $suggestions[] = 'node__' . $node->id(); $suggestions[] = 'node__' . $node->id() . '__' . $sanitized_view_mode; } } } }
写法二:
function nexus_theme_suggestions_node_alter(array &$suggestions, array $variables){ $node = $variables['elements']['#node']; $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); $type = $node->getType(); if($type == 'article'){ $term = $node->field_category->entity; $tid = $term->id(); if($tid == '4'){ $suggestions[] = 'node__' . $sanitized_view_mode; $suggestions[] = 'node__' . $node->bundle(); $suggestions[] = 'node__article__taxonomy_term_4'; $suggestions[] = 'node__' . $node->bundle() . '__' . $sanitized_view_mode; $suggestions[] = 'node__' . $node->id(); $suggestions[] = 'node__' . $node->id() . '__' . $sanitized_view_mode; } } }
不建议调用:
function nexus_theme_suggestions_node(array $variables) { $suggestions = array(); $suggestions = array(); $node = $variables['elements']['#node']; $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); $type = $node->getType(); if($type == 'article'){ $term = $node->field_category->entity; $tid = $term->id(); if($tid == '4'){ $suggestions[] = 'node__' . $sanitized_view_mode; $suggestions[] = 'node__' . $node->bundle(); $suggestions[] = 'node__article__taxonomy_term_4'; $suggestions[] = 'node__' . $node->bundle() . '__' . $sanitized_view_mode; $suggestions[] = 'node__' . $node->id(); $suggestions[] = 'node__' . $node->id() . '__' . $sanitized_view_mode; } } return $suggestions; }
Drupal7下面,模板建议的定义,放在了hook_preprocess_node里面,但是Drupal8,放在了hook_theme_suggestions_HOOK里面,需要调用:hook_theme_suggestions_alter(array &$suggestions, array $variables, $hook),修改以后的模板建议。
注意下划线,连字符之间的互换。代码里面用下划线,模板文件名,用连字符。