web-dev-qa-db-ja.com

特定の表示モードのテンプレートを提供するにはどうすればよいですか?

テンプレートを使用して検索結果表示モードのテーマを設定します。

テンプレートファイルにnode-article--search-result.tpl.phpという名前を付けるとうまくいくというのが頭の中にありましたが、それは明らかに間違っています。

Node--article.tpl.phpとこのチェック$ view_modeの範囲内で実行できることはわかっていますが、これはテンプレートにしたくない他のすべてのビューモードでは扱いにくいものです。

アイデア?

47
artfulrobot

ノードの前処理関数にテーマフックの提案を追加すると、次のようなトリックが行われます。

_function MYMODULE_preprocess_node(&$vars) {
  if ($vars['node']->type == 'article' && $vars['view_mode'] == 'search_result') {
    $vars['theme_hook_suggestions'][] = 'node__article__search_result';
  }
}
_

キャッシュをクリアすると、テンプレートファイル名にnode--article--search-result.tpl.phpを使用できるようになります。

NB。代わりに関数MYTHEME_preprocess_node()を呼び出すことで、テーマのtemplate.phpファイルでこれを行うこともできます。

46
Clive

エンティティビューモード モジュールは、これらのテンプレートの提案を自動的に追加します

Drupal 7後継 ビルドモード を使用すると、管理者はエンティティのカスタムビューモードを定義できます。カスタムエンティティは、hook_entity_info_alter()を介してエンティティレジストリに追加され、 entity_get_info()を使用してエンティティのビューモードのリストを提供するすべてのコードで使用できます。これには、ノードとユーザーの参照フィールド、ビューなどが含まれます。

3
Bas

これは動的に新しいものを追加することを可能にする機能です。宣言されている場合は、対応する前処理関数も呼び出します。

次に、_drush cache-clear theme-registry_を呼び出して機能させます。

これを使用するには、THEMEをテーマの名前に置き換え、テーマのtemplate.phpファイルに配置します。

例えばDroidという名前のテーマの場合、droid_preprocess_node(&$variables, $hook) {...と呼びます。

_function THEME_preprocess_node(&$variables, $hook) {
  $view_mode = $variables['view_mode'];
  $content_type = $variables['type'];
  $variables['theme_hook_suggestions'][] = 'node__' . $view_mode;
  $variables['theme_hook_suggestions'][] = 'node__' . $view_mode . '_' . $content_type;

  $view_mode_preprocess = 'THEME_preprocess_node_' . $view_mode . '_' . $content_type;
  if (function_exists($view_mode_preprocess)) {
    $view_mode_preprocess($variables, $hook);
  }

  $view_mode_preprocess = 'THEME_preprocess_node_' . $view_mode;
  if (function_exists($view_mode_preprocess)) {
    $view_mode_preprocess($variables, $hook);
  }
}
_
2
Elijah Lynn