Drupal 7 カスタムビューモードの追加

~ Drupal 7 custom node view modes 和訳 ~

Drupal 7 では、新しいクールな機能のひとつとして、ノードの「ビューモード」を簡単に追加出来るようになりました。ビューモードは、コメントなど他のエンティティでも有効なものですが、今回はノードについて取り上げてみたいと思います。

これまでは、Drupal のノードには「フルノードビュー」、「ティーザービュー」という2つの「固定の」ビューモードしかありませんでした。たいていの場合、単純なコンテンツリストを作るにはこれで十分でしたが、Views の Fields モードで使用できるような、さらなる柔軟性が必要な場合も少なくありませんでした。この場合の柔軟性というのは、状況によって同じコンテンツを異なる方法でディスプレイ(表示)するという意味です。

Drupal 7 では、ビューモードを追加するには、単純に hook_entity_info_alter() をカスタムモジュールに実装するだけです。

/**
 * hook_entity_info_alter() の実装。
 */
function MYMODULE_entity_info_alter(&$entity_info) {
  $entity_info['node']['view modes']['another_teaser'] = array(
    'label' => t('Another teaser'),
    'custom settings' => TRUE,
  );
} 

新しいビューモードを定義したら、コンテンツタイプの「表示管理(Manage Display)」ページにアクセスし、表示させるフィールド、そしてそれらの追加設定(例えばイメージフィールドのスタイル設定など)等を設定します。

次にこのビューモードをどこかで使用してみます。とりあえず Views でビューを作成し、ビューのスタイル(フォーマット)を Unformatted 、表示を Node (コンテンツ)そして row style オプションのビューモードで「Another teaser」を選択します。テスト用にページを作成することもできます。

ここまでは、フィールドモードでビューを作成し、そして表示したいフィールドを一つ一つ加えていく方法と、特に違いはありません。違うのはテーマの適用方法、コンテンツのレイアウトのカスタマイズ方法です。

このビューモードのためのカスタム node.tpl.php テンプレートを追加したいと思うでしょう。カスタムノードテンプレートを使えば、簡単に大胆なレイアウト編集もできますし、hook_preprocess_node() 関数を使って、例えば利用可能な変数を自在に操作することも出来ます。このビューモードための .tpl.php ファイルを適用するには、 hook_preprocess_node() で、テンプレート候補を追加してやる必要があります。

/**
 * hook_preprocess_node() の実装。
 */
function MYMODULE_preprocess_node(&$vars) {
  if($vars['view_mode'] == 'another_teaser') {
    $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__another_teaser';
  }
} 

編集したいコンテンツタイプの node.tpl.php をコピーし、node--article--another-teaser.tpl.php のようにリネームします(テンプレート候補にはアンダースコアで記述しますが、ファイル名にはハイフンを使うことに注意)。

同様の結果を得るのに別のアプローチも沢山あると思います。Display Suite モジュールを使っても同じことができますが、今回の例ではそこまでしなくても、という感じです。Views のフィールドモードを使う場合がやはり多いでしょう。その中で「ビューモードを追加する」というこの方法は、テンプレートを他のビューでも使いまわししたい場合や、例えばすべてのコンテンツタイプを同じリストに表示したい場合で、コンテンツタイプごとに表示を編集したい場合など、非常に沢山のテンプレートを作らなくてはならない場合の代替として、全く新しいアプローチになるでしょう。

コア: 
Drupal7