You are here

Drupal 8 根据分类不同定义自己的节点模板建议

我们遇到一个需求,需要根据节点分类的不同,单独的定义一个节点模板文件,但是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),修改以后的模板建议。


注意下划线,连字符之间的互换。代码里面用下划线,模板文件名,用连字符。

论坛:

Drupal版本: