独自のテーブルを 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');