检查预处理挂钩中节点的内容类型


12

我要在树枝模板上为特定的内容模板提供一系列变量。

MYTHEME.theme我有:

function MYTHEME_preprocess_node(&$variables) {

  if (isset($variables['node'])) {

    $mycustomblock = \Drupal::service('plugin.manager.block')
      ->createInstance('myblock', []);

    $variables['mycustomblock'] = $mycustomblock->build();

    $headertext = \Drupal::service('plugin.manager.block')
      ->createInstance('headertext',
        [
          'text-align-submit'  => 'right',
          'uppercase-submit'   => TRUE,
          'header_size'        => 'h4',
          'header-size-submit' => 'h4',
          'grid-size-submit'   => 6,
          'header-title'       => 'This is a test',
        ]
      );

    $variables['headertext'] = $headertext->build();
  }
}

这使我可以在{{ headertext }}{{ mycustomblock }}类型的模板中使用node--contenttype1.html.twignode--contenttype2.html.twig。但是,当我只需要一种内容类型的每个节点类型时,我宁愿不为每种节点类型构建'headertext'and 'mycustomblock'变量。最好有一个switch或if语句在生成带有块的变量之前检查它是哪种内容类型。

有没有一种方法可以检查节点的内容类型?

我试过了

$type = $variables['node']->type;

但这没有用。

Answers:


15

要获取节点的内容类型,只需使用$variables['node']->getType()$variables['node']->bundle()。第一个方法只是调用第二个方法,因此调用一个或另一个方法没有多大区别。

public function getType() {
  return $this->bundle();
}

唯一的区别是bundle()为每个实体定义了,因为捆绑包的概念对于所有实体都是通用的,而内容类型是Drupal用于节点的属性,然后在Drupal核心模块实现的实体之一中更改它们。using bundle()使代码更容易适应其他实体类型,但是我认为您使用的代码并非如此。


5

您必须使用$variables['node']->getType()。另外,如果仅在某些视图模式下需要使用它,也可以考虑对此进行检查,方法是:$variables['view_mode']


2

您可以将节点(和视图类型)添加到挂钩函数名称中:

function MYTHEME/MYMODULE_preprocess_node__nodetype__display(&$variables) {
  // ...
}

例如,对于pagefull模式下的节点类型:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.