我们遇到一个需求,需要根据节点分类的不同,单独的定义一个节点模板文件,但是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),修改以后的模板建议。
注意下划线,连字符之间的互换。代码里面用下划线,模板文件名,用连字符。

