web-dev-qa-db-ja.com

テーマを実装せずにモジュールからテーマテンプレートをオーバーライドする

カスタムテーマを使用しないD8のプロジェクトがあります。ビジュアルテーマの必要がないため、すべてにデフォルトの7つのテーマを使用しています。

だから私の質問:モジュールを使用してテーマテンプレートをオーバーライドすることは可能ですか?テーマをまったく実装せずに?

ノードのテンプレートにカスタムのサードパーティ生成値を追加したい場合があります。

これは私がやったことです:

実装されたカスタムテンプレート:

function MY_MODULE_theme($existing, $type, $theme, $path) {
  return array(
    'video_teaser' => [
      'template' => 'video_teaser',
      'variables' => NULL,
    ]
  );
}

実装されたhook_theme_suggestions_alter:

function MY_MODULE_theme_suggestions_alter(array &$suggestions, array $variables, $hook) {
  if(in_array('node__teaser', $suggestions)){
    $suggestions[] = 'video_teaser';
  }
} 

そして、これは、デフォルトのテンプレートの代わりに機能し、私のvideo_teserテンプレートが使用されます。

しかし、デフォルトのノード変数をカスタムテンプレートに渡すときに問題が発生しました。それらは自動的に渡されず、現在のアプローチを使用してこれを行う方法を見つけることができませんでした。

3
otarza

これは、基本フック 'node'を使用してhook_theme()で行うことができます。

function MY_MODULE_theme($existing, $type, $theme, $path) {
  return [
    'node__video_teaser' => [
      'template' => 'node--video-teaser',
      'base hook' => 'node',
    ],
  ];
}

ベースフックを定義する必要はありません。 Drupalはこれを自動的に検出できます。重要なのは、テーマの提案とまったく同じように機能するため、二重下線を使用することです。Drupalがベースフックを見つけた後このフックの前処理関数を複製し、ノードの変数を提供します。

10
4k4