独自のテーブルを 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' 配列レベルに 'title' や 'help' を記述することは、通常はあまり意味がありません。ただテーブル内のフィールドはすべて同じグループに属することが多いので、 'group' はここで定義するのが一般的です。:
$data['foo']['table']['group'] = t('Foo');'table' セクションの他の項目については、以下に説明します。
他のテーブルと結合する際に、プライマリテーブルとなり得るもの、そのテーブル用のビューを作成することを想定するものは、ベーステーブルを宣言します。これは主にビューを作成する際の UI 情報を提供します。例:
// ベーステーブルとして宣言します。
$data['node']['table']['base'] = array(
'field' => 'nid',
'title' => t('Node'),
'help' => t("Nodes are a Drupal site's primary content."),
'weight' => -10,
);以下の項目はベーステーブルで有効です。
テーブルが 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,
);独自のテーブルを 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' が使われます。ほとんどのフィールドでこのような設定が可能です。
特別な項目 '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' の代替のフィルタハンドラを提供しています。フィールドの定義には以下の項目が使用できます。
ハンドラについてのより詳しい情報は、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');