pict-drupal-7.png前回(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というファイルを作成して以下のようにします。
  1. /**
  2.  * Implements hook_field_schema().
  3.  */
  4. function myfield_field_schema($field) {
  5.   if ($field['type'] == 'myfield_field') {
  6.     return array(
  7.       'columns' => array(
  8.         'value' => array(
  9.           'type' => 'int',
  10.           'not null' => FALSE,
  11.           'unsigned' => TRUE,
  12.         ),
  13.       ),
  14.       'indexes' => array(
  15.         'value' => array('value'),
  16.       ),
  17.     );
  18.   }
  19. }
ここで、フィールドの名称は先程決めたmyfield_fieldとします。あとは符号なし整数型のデータとして定義しています。また、columns配列のキーとして使っている「value」がこのフィールドの値を取得する場合のキーとなります。(別に「value」としないで好きな名称を使ってかまいません)

つぎに、hook_field_info()関数を使ってフィールドの定義をおこないます。
  1. /**
  2.  * Implements hook_field_info().
  3.  */
  4. function myfield_field_info() {
  5.   return array(
  6.     'myfield_field' => array(
  7.       'label' => t('My star rating'),
  8.       'default_widget' => 'myfield_widget',
  9.       'default_formatter' => 'myfield_formatter',
  10.     ),
  11.   );
  12. }
ここでも戻り配列のキーはフィールド名になっています。このフィールドがユーザに表示される場合の名前(フィールドタイプを選択するときのリストに表示される名称)はMy star ratingとしました。また、このフィールドがデフォルトで使用するウィジェットとフォーマッタの名前をここで指定します。

最後はhook_field_is_empty()です。これはこのフィールドに値が入っているかどうかを判断するためにシステムがコールする関数です。
  1. /**
  2.  * Implements hook_field_is_empty().
  3.  */
  4. function myfield_field_is_empty($item, $field) {
  5.   return empty($item['value']);
  6. }
以上でフィールドタイプに関連するhook関数は実装されました。フィールド自体にオプション設定を設ける場合には、hook_field_settings_form()関数を使ってフォーム項目の設定などをおこなえばよいです。Myfieldモジュールはフィールド自体のオプション設定はないのでここでは省略します。興味がある方は、Star Ratingモジュールのソースコードを参照ください。

ウィジェットを定義する

では、次にこのmyfield_fieldに値を入力するためのフォーム項目(ウィジェット)を作成します。これには以下のhook関数を使用します。

hook_field_widget_info()
hook_field_widget_form()

まずウィジェットの定義をhook_field_widget_info()でおこないます。
  1. /**
  2.  * Implements hook_field_widget_info().
  3.  */
  4. function myfield_field_widget_info() {
  5.   return array(
  6.     'myfield_widget' => array(
  7.       'label' => t('My star rating'),
  8.       'field types' => array('myfield_field'),
  9.     ),
  10.   );
  11. }
ここではこのウィジェットがサポートするフィールドタイプとしてmyfield_fieldを指定しています。複数のフィールドタイプをサポートする場合には、このfield typesのところに列記します。

次はhook_field_widget_form()を使ってこのウィジェットのフォームを定義します。ここではNot selectedと1~5までの項目のドロップダウンリストを定義しています。
  1. /**
  2.  * Implements hook_field_widget_form().
  3.  */
  4. function myfield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
  5.   $default_value = (!empty($items[$delta]['value'])) ? $items[$delta]['value'] : 0;
  6.  
  7.   $element += array(
  8.     '#type' => 'select',
  9.     '#default_value' => $default_value,
  10.     '#options' => array(0=>'Not selected', 1=>'1', 2=>'2', 3=>'3', 4=>'4', 5=>'5'),
  11.   );
  12.   return $element;
  13. }
ウィジェットのデフォルト値として$items[$delta]['value']を取得していますが、この「value」はフィールドのスキーマ定義で使った名称になりますので注意してください。

前回のコードの修正

また、前回紹介したコードに関して以下の部分が今回紹介したコードを追加する上で変更されています。
  • Hook_field_formatter_info()で、field typesの配列に今回作成したmyfield_fieldを追加。
  • myfield.infoファイルにfiles[] = myfield.install を追加

これですべて完了です。意外と簡単にできてしまうもんですね。

今回紹介したソースコードはこのページ下のリンクからダウンロードできます。また、これをベースにして作成したStar RatingモジュールをDrupal.orgにて公開していますのでこちらもよかったら参考にしてください。

 

AttachmentSize
myfield-2.tar.gz4.73 KB
Your rating: None Average: 4.4 (5 votes)