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


12

特定のコンテンツテンプレートの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.twignode--contenttype2.html.twig。ただし、1つのコンテンツタイプに1つだけ必要な場合は、すべてのノードタイプの'headertext''mycustomblock'変数を作成するのではなく、ブロックで変数を生成する前に、どのコンテンツタイプかをチェックするスイッチまたはifステートメントがあると便利です。

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

私はもう試した

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

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

回答:


15

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

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

唯一の違いはbundle()、バンドルの概念がすべてのエンティティに共通であるため、すべてのエンティティに対して定義されることです。コンテンツタイプは、Drupalコアモジュールが実装するエンティティの1つでノードを変更する前にノードに使用されるプロパティDrupalです。を使用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) {
  // ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.