Drupalのモジュール(Views)のチェックボックスのようなダミーカスタムフィールド作成
やりたいこと:モジュール(Views)の検索、表示結果にボタン/チェックボックスのようなダミーフィールドを追加します
- モジュール(Views)の検索結果のデータに対して何か加工したいことがあります
- 例:モジュール(Flag)のように選択したノード/ユーザーにフラグを立てたいです
- そのデータを別のテーブルに追加したり、削除したりすることがあります
- 今回の実装例は単語検索一覧から自分の単語帳にコピーするロジックをモジュール(Views)に追加します

hook_views_data_alter()の実装でダミーフィールド(チェックボックス)を検索結果に追加
- 検索結果一覧に何かを追加するにはViewsにカスタムフィールドを追加する必要があります
- カスタムフィールド追加するには、hook_views_data_alter()を実装すれば良いです
/**
* Implements hook_views_api().
*/
function YOUR_MODULE_NAME_views_api()
{
return array(
'api' => 3,
'path' => drupal_get_path('module', 'YOUR_MODULE_NAME') . '/views',
);
}
/**
* Implements hook_views_data_alter().
*/
function YOUR_MODULE_NAME_views_data_alter(&$data)
{
$d = $data;
$data['ch_vocabulary']['add_to_my_vocabulary'] = array(
'title' => t('Add to My Vocabulary'),
'help' => t('Add this vocabulary to My Vocabulary'),
'field' => array(
'handler' => 'add_vocabulary_to_my_vocabulary_handler',
),
);
}
/**
* チェックボックス作成用のハンドル
*/
class add_vocabulary_to_my_vocabulary_handler extends views_handler_field{
function render($value){
$form['add_to_my_vocabulary'] = array(
'#type' => 'checkbox',
'#title' => 'Add',
'#ajax' => array(
'callback' => 'add_to_my_vocabulary',
'effect' => 'fade',
… // ajaxの処理
),
);
return render($form) ;
}
}
- カスタムフィールドをViewsに追加するには、3ステップでできます
- hook_views_api()の実装でViewsのカスタマイズ開始を宣言します
- hook_views_data_alter()実装でカスタムフィールド(チェックボックス)を追加します
- views_handler_fieldの実装でフィールド(チェックボックス)のレンダリングを行います
ダミーフィールド作成時にDBへのクエリを行わないことが記述する必要があります
- 上記ロジックで実装して、Viewsの設定画面でカスタムフィールド追加後に、DBエラーが発生します

- hook_views_data_alter()でカスタムフィールド追加するときに、実テーブルのフィールドに関連付け設定が必要です("real field")。
- ダミーフィールドなので、当然実フィールドがないです。定義することはできません。Viewsが実行時にそのカラムが見つからないエラーが発生します
- ここで、Viewsの実行時にこのフィールドをクエリに加えないよう設定する必要があります
class add_vocabulary_to_my_vocabulary_handler extends views_handler_field{
function query()
{
// 何もないで、このフィールドをクエリに加えない
}
function render($value){
$form['add_to_my_vocabulary'] = array(
'#type' => 'checkbox',
'#title' => 'Add',
'#ajax' => array(
'callback' => 'add_to_my_vocabulary',
'effect' => 'fade',
…
),
);
return render($form) ;
}
}
- views_handler_fieldの「function query()」をオーバーライドして、何も書かずにすればよいです