Drupal Viewsモジュールとは
コンテンツ一覧の作成
Drupal Viewsモジュールは、コンテンツ(Entity)を管理GUIで作成する機能を提供します。
対象Entity
対象Entityには、Drupal標準の「ノード」、「ユーザー」、「タクソノミー」はもちろん、Webformなどの拡張モジュール、独自モジュールで作成したEntityも含まれます。
標準で対象となるコンテンツは、以下のとおりです。
- ノード
- ノードリビジョン
- コメント
- タクソノミー
- ファイル
- ユーザー
Drupal Viewsモジュールを使う理由
Drupal ViewsモジュールがなければDrupalを選んでいない
Drupal Viewsモジュールは当社がDrupal専業とはる理由となったモジュールです。
当社がWebシステムの開発を始めた頃は、CMSというと、ほとんどスクラッチ(オリジナル)で開発しており、開発効率の向上は、機能のコンポーネント化、標準化が命でした。
そのため、優秀な技術者の獲得、綿密なプロジェクト・マネージメント、将来性の見極めなど、どこまでも独自で踏ん張り続ける必要がありました。
そんな折、多くのOpen SourceのCMSがリリースされ、当社も、グローバルな要求に答えるため、独自路線を見切り、Open Source採用を検討することとなりました。
当時、リリースされていた全てのOpen Sourceのうち、最後にDrupal、Joomla、Wordpressが残り、一旦はWordpressに行きかけましたが、最終的にDrupalに落ち着きました。
JoomlaでもWordpressでもなく、Drupalを選択した理由が「Drupal Viewsモジュール」だったのです。
当時、オリジナルCMS路線だった当社が開発していたシステムは、Field系モジュール(Drupal6ではCCKモジュール)に似た管理画面からのスキーマ生成と、Drupal Viewsモジュールに似た一覧作成(データベースクエリ生成)モジュールが核でした。
偶然にも、Open Source CMSであるDrupalに共通項を見いだしたと思ったのです。
Fieldモジュール+Viewsモジュール
FieldモジュールとViewsモジュールがなければ、DrupalはWordpressの足元にも及ばないほど使いようがありません。
Drupal7でFieldモジュールが標準に組み入れられ、Drupal8ではViewsモジュールが標準になります。
Drupal Viewsモジュールの機能
ディスプレイ
ディスプレイとは、Drupal Viewsモジュールが出力するリージョンのようなものです。ディスプレイには、標準では下記のものが用意されています。
- リファレンス
入力フォームでプルダウン、チェックボックス、ラジオボタン等を設置する際に利用する選択肢のリストを生成します。この自由度には驚きです。 - フィード
RSSを作成します。RSSはDrupal標準で用意されていますが、より細かい出力が可能になります。 - ブロック
ページ各所に配置するブロック用の一覧を出力します。パーツとして用意し、各ページへの配置は別途行えるので重宝します。 - ページ
ページとして一覧を出力します。最もオーソドックスな利用用途です。
※ その他、Viewsディスプレイに対応した拡張モジュールをインストールすることで拡張されます。
タイトルの設定
タイトルを定義できるのは当然ですが、フィルター機能により、パラメータや状況によってタイトルを動的に変えることも可能です。
フォーマットの設定
下記から一覧の出力フォーマットを選択可能です。
- HTMLリスト
リスト(<li>〜</li>)形式で出力します。 - グリッド
グリッドで出力。Tableタグになります。 - ジャンプメニュー
- テーブル
Tableタグを出力します。 - ノンフォーマット
Divで囲んで出力します。
※ スライダー系モジュール、カレンダーモジュールなどを追加インストールすると、フォーマットもそれに応じて追加されます。
表示形式の設定
上記フォーマット(骨組み)内の各レコードの表示形式を選択できます。
- Rendered entity
ティザー、RSS、検索インデックス、トークンなど選択できます。あまりパッとしないので使ったことがありません。 - コンテンツ
コンテンツタイプ以下の「表示設定」で定義された形式で出力します。「表示設定」は拡張可能なので、一つのコンテンツに対して複数の「表示設定」を登録することで、Drupal Viewsモジュールのユーザーインタフェース中で自由に利用できます。 - フィールド
Drupal Viewsモジュール独自でフィールドを選択し、表示形式も指定します。コンテンツの「表示設定」とどちらを使うか迷うこともありますが、コンテンツの「表示設定」は汎用的。フィールドによるDrupal Viewsモジュール独自の設定は、どちらかというと、その場しのぎ的なイメージです。
※ Display Suite、カレンダー等の拡張モジュールを追加インストールすることで選択肢が追加されます。
※ 出力をグループ化したり、出力クラス名を変更したりできます。
フィールドの設定
フォーマットでグリッド、テーブル、ノンフォーマットの何れかを選択した場合、フィールド出力になります。表示する内容を全てここで設定できます。
フィールド出力とは、Drupal Viewsモジュールの管理画面で、出力するフィールドを自由に選択し、表示形式も設定できるViewsモジュール独自の出力形式です。Drupal Viewsモジュールを使う場合、最も自由度が高い表示形式になります。
設定できるフィールドには以下のようなものがあります。
- グローバル
- コンテンツフィールド
- コンテンツ翻訳
- コンテンツリビジョンフィールド
- 検索
- ドラッカブル(Draggable viewsモジュールをインストールしている場合)
- 一括処理(Views bulk operationモジュールをインストールしている場合)
これらの中からフィールドを選択・設定し、表示順を定義します。
※ その他、Drupal Viewsモジュールのフィールドに対応している拡張モジュールをインストールしていれば、選択肢が追加されます。つまり、Drupal Viewsモジュールに対応するフィールドを持った小さなモジュールを作成する事で、Viewsで作成する一覧に独自の情報を追加できます。
※ ここでは表示要素の選択までにしておき、見た目の設定は後述のViewsテンプレート(Views専用テーマ)で行うのが一般的です。
フィルターの設定
データベースクエリの条件を設定します。選択したフィールド各々の値、範囲を設定。GROUP単位のAND、ORなどを定義できます。
管理画面の設定で検索条件(クエリ)が生成できます。プログラマなら、直接クエリを書いたほうが早い。と思う場合もありますが、常に進化しているDrupalのDBクエリを直接書くより、Drupal Viewsモジュールの管理画面で設定したほうが、メンテナンスが楽です。
また、Drupal Viewsモジュールで生成したDBクエリを表示することもできるので、一旦ViewsモジュールでDBクエリを作成し、できたクエリを参考にカスタマイズするという手もあります。
さらに、どうしても管理画面上で思うようなクエリが生成できなかった場合でもDrupal ViewsモジュールのAPIにより、裏で動的に補足することもできます。
決め込みの一覧ではなく、絞り込みのコントロール(プルダウン、チェックボックス、ラジオボタンなど)をフロントに表示することもできます。
並び順の設定
フィールドを選択し、昇順/降順の他、相対関係を考慮した動的なソートを設定することができます。
フィールターと同様、フロントに表示して閲覧者にコントロールできるようにする事も可能です。
パスの設定
ディスプレイ=「ページ」の場合、URLを定義できます。
アクセス権限の設定
このディスプレイにアクセスできるユーザーを限定できます。
役割(ユーザーグループ)や、権限(詳細に定義された権限設定)、独自(PHPで定義)など、アクセス権限を設定できます。
ヘッダーの設定
タイトルと一覧の間に表示する情報を定義できます。内容は以下のフォーマットで指定可能です。
- PHP
- 概要
- フィルタ処理されていないテキスト
- Viewエリア
- テキストエリア
- メッセージ
- エンティティ
フッターの設定
一覧の後に表示する情報を定義できます。
ページャーの設定
一覧ページ/ブロックのページコントロールを設定できます。
- Infinite scroll(Infinite scrollモジュールをインストールしている場合)
- Page by date(Dateモジュールをインストールしている場合)
- Paged output,lite pager(Lite pagerをインストールしている場合)
- 全ての件数を表示
- ページ分けして出力、フルページャー
- ページ分けして出力、ミニページャー
- 表示件数を指定
ページャーオプションの設定
ページャーを表示する場合、詳細を指定できます。
- 表示件数(1ページあたりの表示件数)
- オフセット(表示開始レコードオフセット)
- ページャーID(1ページに複数のページャーを表示する場合必要)
- ページ数(表示するページ数の上限〜無限)
- ページリンク数(前ページ 次ページの間に表示する個別ページの表示数)
- 先頭ページ用ラベル
- 前ページ用ラベル
- 次ページ用ラベル
- 最終ページ用ラベル
- 外部設置の設定(上記項目を閲覧者に見せるための設定)
コンテキスチャルフィルターの設定
ページ描画時のパラメーター設定。パス(URL)に乗せるパラメータを設定します。上記の「フィルター」は$_GETとして扱われますが、コンテキスチャルフィルターはパス内「/」で区切られたパラメータになります。
以下の中から選択します。
- Content revision
- Global
- Tracker - User
- コンテンツ
- コンテンツ翻訳
- コメント
- タクソノミーターム
- 検索
各々、下記詳細設定が可能です。
- 未指定の場合の対処
・すべて表示
・デフォルト値を指定
・何も表示しない
・要約を表示
・「結果がありません」を表示
・「アクセスは許可されていません」を表示 - タイトルのオーバーライド
- パンくずのオーバーライド
- 検証条件を指定(バリデーター&条件)
- 複数指定の許可/禁止
- NOT指定
リレーションシップの設定
Drupal Viewsモジュールの壁の一つです。クエリ的には「JOIN」を設定します。メインのテーブルに加えて必要とするフィールドを含むテーブルを「JOIN」します。
この機能をマスターすると、フィールドの設定〜一覧の作成までが、シームレスに繋がるようになり、作成する前に「完成」をイメージすることができるようになります。
外部設置フォームの設定
「フィルター」で定義した「外部設置」用のフォームの定義を行います。
- 「送信」ボタンのラベル
- リセットボタン設置有無
- 並び替えボックスのラベル
- ソート切替フォームの表示
- 昇順ソートのラベル
- 降順ソートのラベル
- オートサブミットの可否
AJAXの利用有無の設定
一覧ページ/ブロックをAJAX化するか否かを定義します。見た目上、AJAX=有効の方が少し速いようです。ディスプレイ=ブロックの場合、ページャーを表示する場合は「AJAX=有効」必須です。
Drupal ViewsモジュールAPIをサポートした外部拡張モジュールのうち、AJAXに対応していない拡張モジュールもあるため、注意が必要です。
コンテンツページブロックの設定
フィールドのグループ化と集計(計算)を許可します。DBクエリ的には「Group by」を追加します。
有効にした途端に、各フィールドの定義が難しくなりますが、ここまで出来るとは驚きです。
クエリの設定の設定
DBクエリ生成の詳細を設定します。
- SQL書き換えを無効化
SQLの書き換えを無効にするとhook_query_alterを行っている全ての機能を無効にします。 - DISTINCT
このオプションを有効にすると、別々の項目しか表示されなくなります。完全に同一の項目が複数ある場合は、同じ項目は一度ずつしか表示されません。ビューから重複を取り除くのに使用できますが、いつもうまく動作するとは限りません。このオプションはクエリーの処理を遅くするので、使用に注意が必要です。 - スレーブサーバーを仕様
スレーブサーバーが利用可能であれば、それに接続するクエリーを発行します。スレーバウサーバーが定義されていなかったり利用可能でなければ、デフォルトのサーバーを使用します。 - クエリコメント
設定した場合、このコメントは、クエリに組み込まれ、SQLサーバーに渡されます。ロギングやデバッグに役立ちます。 - クエリのタグ
設定された場合、これらのタグは、クエリに追加され、モジュール内のクエリーを識別するために使用することができる。これは、クエリを変更するために役立ちます。
フィールドの言語の設定
翻訳に対応しているフィールドは、全てその選択されている言語で表示されますが、必要なときに、クエリにフィールド言語条件を追加します。
キャッシュの設定
下記のいずれかを選択します。
- なし
- PHP
- 時間基準
時間基準、またはPHPによるキャシュクリアタイミングを制御可能です。うまく使うことで、独自DBクエリを組むより高速な表示が可能となります。
CSSクラスのせってい
ディスプレイ全体を囲むDivのクラス名を設定します。
テーマの設定
Drupal Viewsモジュール独自のテーマ(テンプレート)を設定・作成します。
Drupalのテンプレートはファイル名により詳細に階層化されますが、Drupal Viewsモジュール独自のテンプレートも同様に階層化されています。
- ディスプレイ全体
- レコード単位
- フィールド単位
- フィールド単位(各フィールド固有)
実践的なDrupal Viewsモジュールの応用
Drupal FAQより
- カルーセルのように回転するコンテンツを作りたい
- 空き室予約のような仕組みは実現できますか?
- ひとつのViewsをページやブックページ内で再利用する方法は?
- 標準のコンテンツ編集/ユーザー一覧ページが物足りません
- Viewsで表示した内容をCSVダウンロード
- ノードに付いたコメントに関する情報を得る
- Viewsの設定ページが変に?
- フィールドセットの伸縮をノンプログラミングでやりたい
- Viewsモジュールの設定ページのような排他機能
- Pagerが表示されなくなった
- ブロックViewsの絞り込みが表示されない
- Viewsでティザーを一覧するとページのレイアウトが崩れることがある
- ページ内に2つ目のViewsブロックを配置すると、Pagerが連動してしまう
- フォーム選択肢(プルダウンやチェックボックス、ラジオボタン)のカスタマイズ方法
- Facebookページのようにスクロールするとコンテンツが追加されるようにコントロールしたい
- Druaol7:Viewsで表示した内容をCSVダウンロード