12/23/2010
前回(Drupal 7のField APIを使ってみる)からの続きです。
今回は、オリジナルフィールドをmyfieldモジュールに追加します。追加するフィールド名はmyfield_fieldとし、0-5までの整数値をとるものとします。また、このフィールドに値を入力させるためのフォーム(Widget)もあわせて作成します。このWidgetはドロップダウンリストとして実装します。
前回のとあわせると、以下ようになります。
| フィールド | myfield_field |
|---|---|
| ウィジェット | myfield_widget |
| フォーマッター | myfield_formatter |
オリジナルフィールドを定義する
まず、独自フィールドを定義・作成するために実装が必要な関数は以下のようになります。hook_field_schema()
hook_field_info()
hook_field_is_empty()
hook_field_schema()はこのフィールドをデータベースに格納するためのスキーマを定義します。これは通常インストールファイル(.install)に作成しますので、myfield.installというファイルを作成して以下のようにします。
ここで、フィールドの名称は先程決めたmyfield_fieldとします。あとは符号なし整数型のデータとして定義しています。また、columns配列のキーとして使っている「value」がこのフィールドの値を取得する場合のキーとなります。(別に「value」としないで好きな名称を使ってかまいません)
つぎに、hook_field_info()関数を使ってフィールドの定義をおこないます。
ここでも戻り配列のキーはフィールド名になっています。このフィールドがユーザに表示される場合の名前(フィールドタイプを選択するときのリストに表示される名称)はMy star ratingとしました。また、このフィールドがデフォルトで使用するウィジェットとフォーマッタの名前をここで指定します。
最後はhook_field_is_empty()です。これはこのフィールドに値が入っているかどうかを判断するためにシステムがコールする関数です。
- /**
- * Implements hook_field_is_empty().
- */
- function myfield_field_is_empty($item, $field) {
- }
ウィジェットを定義する
では、次にこのmyfield_fieldに値を入力するためのフォーム項目(ウィジェット)を作成します。これには以下のhook関数を使用します。hook_field_widget_info()
hook_field_widget_form()
まずウィジェットの定義をhook_field_widget_info()でおこないます。
ここではこのウィジェットがサポートするフィールドタイプとしてmyfield_fieldを指定しています。複数のフィールドタイプをサポートする場合には、このfield typesのところに列記します。
次はhook_field_widget_form()を使ってこのウィジェットのフォームを定義します。ここではNot selectedと1~5までの項目のドロップダウンリストを定義しています。
- /**
- * Implements hook_field_widget_form().
- */
- function myfield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
- '#type' => 'select',
- '#default_value' => $default_value,
- );
- return $element;
- }
前回のコードの修正
また、前回紹介したコードに関して以下の部分が今回紹介したコードを追加する上で変更されています。- Hook_field_formatter_info()で、field typesの配列に今回作成したmyfield_fieldを追加。
- myfield.infoファイルにfiles[] = myfield.install を追加
これですべて完了です。意外と簡単にできてしまうもんですね。
今回紹介したソースコードはこのページ下のリンクからダウンロードできます。また、これをベースにして作成したStar RatingモジュールをDrupal.orgにて公開していますのでこちらもよかったら参考にしてください。
| Attachment | Size |
|---|---|
| myfield-2.tar.gz | 4.73 KB |

