web-dev-qa-db-ja.com

プリプロセスフックのノードのコンテンツタイプを確認してください

twig特定のコンテンツテンプレートのテンプレートで利用できるようにする一連の変数があります。

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.twigおよびnode--contenttype2.html.twigを使用できます。ただし、1つのコンテンツタイプに対してそれぞれ1つだけ必要な場合は、すべての単一ノードタイプに対して'headertext'および'mycustomblock'変数を作成しない方がよいでしょう。ブロックで変数を生成する前に、どのコンテンツタイプかをチェックするスイッチまたはifステートメントがあると便利です。

ノードのコンテンツタイプを確認する方法はありますか?

私はもう試した

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

しかし、それはうまくいきませんでした。

12
Matt

ノードのコンテンツタイプを取得するには、 $variables['node']->getType() または$variables['node']->bundle()を使用します。最初のメソッドは2番目のメソッドを呼び出すだけなので、どちらを呼び出しても大きな違いはありません。

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

唯一の違いは、バンドルの概念はすべてのエンティティに共通であるため、bundle()はすべてのエンティティに対して定義され、コンテンツタイプはプロパティDrupalエンティティのいずれかでそれらを変更するDrupalコアモジュールが実装します。bundle()を使用すると、コードを他のエンティティタイプに簡単に適合させることができますが、そうではないと思いますあなたが使用しているコードのために。

15
kiamlaluno

$variables['node']->getType()を使用する必要があります。また、一部の表示モードでのみ必要な場合は、$variables['view_mode']を使用して、これについても確認することを検討してください。

5
yvan

ノード(およびビュータイプ)をフック関数名に追加できます。

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

たとえば、pageモードのfullノードタイプの場合:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
2
Tim