独自のテーブルを Views で使えるようにする

独自のテーブルを Views で使えるようにするには hook_views_data() を使います。hook_views_data() はテーブルの名前をキーに、その情報の配列を返します。例えばモジュールが 'foo'、'bar'、'baz' といった3つのテーブルを Views に伝える必要があるとすると、配列は次のように表現されます。:

$data = array(
  'foo' => array(
    // ...テーブルの情報を記述...
  ),
  'bar' => array(
    // ...テーブルの情報を記述...
  ),
  'baz' => array(
    // ...テーブルの情報を記述...
  ),
);

キーは実際のデータベーステーブルの名前です。(プレフィクスは含めないでください。) 但し以下に説明する join の情報の中でテーブル名を記述している場合に限り、エイリアスを使用することが出来ます。それぞれのテーブル配列の要素は 'table' キー以外はすべてそのテーブルに含まれるフィールドです。例:

$data['foo'] = array(
  'table' => array(
    // ... テーブルの情報を記述します。(後述) ...
  ),
  'bar' => array(
    // ... 'bar' フィールドの情報。つまり foo.bar の情報です。...
  ),
  'baz' => array(
    // ... 'baz' フィールドの情報。つまり foo.baz の情報です。...
  ),
);

Once you get down to an array that contains actual data, that piece of the array will often be referred to as the definition.

'table' セクション

テーブル配列はそれぞれ 'table' セクションを持ちます。これはそのテーブルのデフォルトの情報(他のテーブルとの結合が必要か、その際にベーステーブルとなるか否か、といったグループに関する情報)等をセットするのに使われます。いくつかの項目は実際には個々のフィールドに対しての設定ですが、ここに記述すると、テーブル内のすべてのフィールドに継承されます。

group
フィールドが属するグループの名前です。Views のユーザインターフェイスでは、これは「グループ: タイトル」のように表示されます。例えば、「Node: Node ID」、「Taxonomy: Term description」、といった具合です。これによって UI (ユーザインタフェース)ではグループごとにソートされ、関連するフィールドを見付けやすいようにフィルタリングされます。
title
フィールドの名前です。簡潔で説明的なものにします。
help
フィールドの補足的な説明です。インターフェースが乱雑にならないように、1行か2行程度にしてください。

'table' 配列レベルに 'title' や 'help' を記述することは、通常はあまり意味がありません。ただテーブル内のフィールドはすべて同じグループに属することが多いので、 'group' はここで定義するのが一般的です。:

$data['foo']['table']['group'] = t('Foo');

'table' セクションの他の項目については、以下に説明します。

'base': ベーステーブル

他のテーブルと結合する際に、プライマリテーブルとなり得るもの、そのテーブル用のビューを作成することを想定するものは、ベーステーブルを宣言します。これは主にビューを作成する際の UI 情報を提供します。例:

// ベーステーブルとして宣言します。
  $data['node']['table']['base'] = array(
    'field' => 'nid',
    'title' => t('Node'),
    'help' => t("Nodes are a Drupal site's primary content."),
    'weight' => -10,
  );

以下の項目はベーステーブルで有効です。

field
テーブルのプライマリキーです。Views では、ベーステーブルとして扱うには、プライマリフィールドの設定が必要です。ノードテーブルでは 'nid' 、ユーザーテーブルでは 'uid' がプライマリフィールドです。単一のプライマリフィールド(複合キーではない)が設定されていない場合は、Views はベーステーブルとしては扱いません。テーブルにプライマリキーフィールドがない場合は、新たに追加してください。
title
ユーザインターフェースでのテーブルのタイトルです。ユーザーの視点から見て直感的にわかるものが望ましいです。
help
テーブルの持つ機能についての補足的な説明です。
database

テーブルが Drupal が使用するデータベースとは別のデータベースを使用している場合は、settings.php ファイルと同じフォーマットで、文字列で正確に指定してください。これはおそらくサイト固有のコードの中でのみ使用される、特殊な項目です。データベースのタイプはDrupal のデータベースと同じでなければなりません。また他のテーブルとの結合もできません。そんなことをしたらエラーが多発するだけです。例:

  // あなたのサイトの settings.php
  // Drupal で使用するデータベースは 'default' です。
  $db_url['default'] = 'mysqli://user:pass@host/drupal_db';
  $db_url['budget'] = 'mysqli://user:pass@host/other_db';

ベーステーブルで外部のデータベースを使用した場合は、次のように記述します。

  $data[$table]['table']['base'] = array(
    'field' => 'Primary key',
    'title' => t('Field name'),
    'help' => t('Field description'),
    'database' => 'budget',
    'weight' => -10,
  );

'join': 既存のベーステーブルにリンクする

独自のテーブルを Views で使えるようにするには、テーブルをベーステーブルとして指定するか、既存のベーステーブルにリンクさせることで可能となります。(両方指定することもできます。)Views はこれらの情報からベーステーブルを特定します。テーブルがクエリに追加されると、Views は自動的にパスをたどり、クエリの構築に必要なテーブルをすべて追加します。

taxonomy_term_data はこのように node に結合されます

図の例においては、'taxonomy_term_data' を 'node' をベーステーブルとしてそれにリンクさせるには、 'taxonomy_term_data' と 'term_node' の両方を定義することが必要です。また、それぞれノードテーブルとの結合ハンドラを必要とします。:

$data['taxonomy_term_data']['table']['join']['node'] = array(
  'left_table' => 'term_node',
  'left_field' => 'tid',
  'field' => 'tid',
);

上の記述は次のように読み取れます。「'taxonomy_term_data' テーブルを 'node' テーブルに結合してください。そのためには最初に 'term_node' テーブルにリンク(結合)してください。結合には 'tid' フィールドを使用してください。」ノードビューにおいてこのテーブルがクエリに追加されると、Views は上記のコードを解析し、'term_node' テーブルを探します。

$data['term_node']['table']['join']['node'] = array(
  'left_field' => 'nid',
  'field' => 'nid',
);

'term_node' テーブルの記述では 'left_table' の項目がありません。これはノードテーブルに直接結合することを示しています。結合には 'nid' が使われます。ほとんどのフィールドでこのような設定が可能です。

handler
使用するハンドラオブジェクトの名前です。デフォルトは 'views_join' です。以下に示すデータを使用したカスタムジョインハンドラを使用することもできます。
table
結合するテーブル。これはオプションです。このテーブルがエイリアスの場合に使用されます。
field
結合させるフィールドです。必須。
left_table
最終的に目的のテーブルに結合するために、次に結合すべきテーブルです。これが目的のテーブルの場合は省略可能です。
left_field
結合する相手のテーブルの、結合するフィールドです。必須。
type
結合のタイプです。LEFT (デフォルト) もしくは、 INNER。
extra
クエリに直接追加する文字列、もしくは次に示す項目の配列です。
field
フィールド、関数を使ったフィールド等。
operator
フィルタと同様、これは「>, <, = 」等です。デフォルトは = もしくは IN です。
value
値の指定は必要です。ここが配列の場合は、operator のデフォルトは IN になります。
numeric
TRUE の場合、値にはシングルクオートは付与されません。プレースホルダには %d が使用されます。
extra type
複数の 'extra' を「 AND / OR 」のどちらを使って結合するかを指定します。デフォルトは「 AND 」です。

テーブルのフィールドの記述

特別な項目 'table' のほかには、各テーブルはそれぞれが持つフィールドを無制限に記述することができます。これはテーブル上のフィールドとおおよそ一致します。though it is very common to use non-fields to display data that isn't directly in a field, such as data arrived from formulae, or special links related to the object the table is part of. ビューのデータには、フィールドはそれぞれ、データベースのフィールド名をキーとした配列で表されます。この配列にはフィールドに関するいくつかの情報に加えて、「 argument 」、「field 」、「 filter 」、「 relationship 」、「 sort 」の5つの項目を必要に応じて記述します。例:

$data['node']['nid'] = array(
  'title' => t('Nid'),
  'help' => t('The node ID of the node.'), // ユーザインタフェースに表示される簡単な説明です。
  // nid の表示に関する設定
  'field' => array(
    'handler' => 'views_handler_field_node',
    'click sortable' => TRUE,
  ),
  // 引数としてnid を受け取る際の設定
  'argument' => array(
    'handler' => 'views_handler_argument_node_nid',
    'name field' => 'title', // the field to display in the summary.
    'numeric' => TRUE,
    'validate type' => 'nid',
  ),
  // フィルタとして nid を使用する際の設定
  'filter' => array(
    'handler' => 'views_handler_filter_numeric',
  ),
  // ソートに nid を使用する際の設定
  'sort' => array(
    'handler' => 'views_handler_sort',
  ),
);

上の例は、ノードテーブルの 'nid' についての記述です。5つのハンドラ(項目)のうち4つを使用しています。フィールドは通常、データベースのフィールド名と一致することが想定されますが、必ずしもその必要はありません。エイリアス(フィールドに複数のハンドラを割り当てる場合に使用できます)やその他、全く違う文字列で登録することもできます。例:

$data['node']['edit_node'] = array(
  'field' => array(
    'title' => t('Edit link'),
    'help' => t('Provide a simple link to edit the node.'),
    'handler' => 'views_handler_field_node_link_edit',
  ),
);

これはノードの「編集」リンクの記述です。これ自身はデータベースフィールドではありません。エイリアスについて、もうひとつ例を挙げてみましょう。

$data['users']['uid_current'] = array(
  'real field' => 'uid',
  'title' => t('Current'),
  'help' => t('Filter the view to the currently logged in user.'),
  'filter' => array(
    'handler' => 'views_handler_filter_user_current',
  ),
);

カレントユーザに対して、'uid' の代替のフィルタハンドラを提供しています。フィールドの定義には以下の項目が使用できます。

group, title, help
上記のように、これらはユーザインタフェースで使用されます。ここで指定したものはベーステーブルの設定をオーバーライドします。
real field
フィールドがエイリアスの場合は、ここで実際のフィールドを指定すると良いでしょう。and the handler will never know the difference.
field
「フィールド」セクションのハンドラの設定です。これはビューの表示の設定で使われます。設定は配列で記述し、これはハンドラで定義するデフォルトの設定を上書きします。 'handler' を省略した場合、'views_handler_field' がデフォルトのハンドラ として使用されます。
filter
「フィルタ」セクションのハンドラの設定です。これはクエリの WHERE 句の生成に使用されます。設定は配列で記述し、これはハンドラで定義するデフォルトの設定を上書きします。 'handler' を省略した場合、'views_handler_filter' がデフォルトのハンドラ として使用されます。
sort
「ソート」セクションのハンドラの設定です。これはクエリの ORDER BY 句の生成に使用されます。設定は配列で記述し、これはハンドラで定義するデフォルトの設定を上書きします。 'handler' を省略した場合、'views_handler_sort' がデフォルトのハンドラ として使用されます。
relationship
「RELATIONSHIP」セクションのハンドラの設定です。設定は配列で記述し、これはハンドラで定義するデフォルトの設定を上書きします。'handler' を省略した場合、'views_handler_relationship' がデフォルトのハンドラとして使用されます。基本的にリレーションシップハンドラは 'base' と 'base field' の指定が必要です。'base' と 'base field' は、このフィールド(relationship を定義するフィールド)に対してジョインするフィールド、つまりこのフィールドから見て右側のフィールドです。
argument
「ARGUMENT」(Views 3 では「CONTEXT FILTER」)セクションのハンドラの設定です。これは URL 等から受け取るユーザーの入力に応えるためのメソッドです。設定は配列で記述し、これはハンドラで定義するデフォルトの設定を上書きします。 'handler' を省略した場合、'views_handler_argument' がデフォルトのハンドラ として使用されます。

ハンドラについてのより詳しい情報は、the Views API site にアクセスして、利用可能なハンドラをチェックしてみてください。

古いテーブルデータのサポート

独自のデータベーステーブルでテーブル/フィールドの名前を変更した場合は、Views のデータに参照を作成することで、古いデータとの互換性を保つことができます。新しい Views データの完全なテーブル構造を記述してください。テーブルの名前を変更した場合は次のように記述します。

$data['oldtable']['moved to'] = 'newtable';

フィールドの名前を変更、また他のテーブルに移動した場合はこのようにします。

$data['oldtable']['oldfield']['field']['moved to'] = array('newtable', 'newfield');

または

$data['oldtable']['oldfield']['moved to'] = array('newtable', 'newfield');
原文url: 
/help/views/api-tables
コア: 
Drupal7