【第5回】Drupalカスタムモジュールの固有ファイル『.install』について

  •  
 
MAXIMUM に投稿

タグ

1. 目的

前回では、フォームから入力された内容をDBに保存するところまで追いました。

その際に保存先のテーブルは作成済みとしていましたが、今回はそのテーブルをDrupalでどのように作成しているかを確認していきます。

今回作成するのは.installファイルになります。

2. .installとは

まず.installってなんなのかですが、Drupalのカスタムモジュールでインストールや更新時の処理を書くためのDrupal固有のファイルです。

拡張子は.installですが、中身はPHPで書きます。

PHP自体に.installという仕組みがあるわけではなく、Drupal側がこのファイルをPHPとして読み込んでいます。

.installファイルのファイル名は、モジュールのマシン名に合わせます。

今回の場合は下記になります。

event_manager.install

また、.installにはhook_install()やhook_uninstall()なども記述できます。

3. テーブルを定義する

続いて、テーブルの作成方法ですが、Drupalではhook_schema()という仕組みを使ってPHPの配列でテーブルを定義します。

今回の場合はevent_manager_schema()になります。

一部抜粋すると下記のようになります。

function event_manager_schema() {
  $schema['event_manager_attendance'] = [
    'fields' => [
      'id' => [
        'type' => 'serial',
        'not null' => TRUE,
      ],
      'uid' => [
        'type' => 'int',
        'not null' => TRUE,
      ],
      'attendance' => [
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
      ],
    ],
    'primary key' => ['id'],
  ];

  return $schema;
}

これで前回INSERT先として使用していたevent_manager_attendanceテーブルを定義しています。

最後にreturn $schema;でDrupal側に定義を返すことで、その内容を基にテーブルが作成されます。

つまりデータベースを直接操作しなくてもテーブル作成可能です。

4. キャッシュクリア

変更を適用する際は毎回恒例のキャッシュクリアが必要です。 Macターミナルかつddev環境を前提に例で挙げます。

ddev drush cr

ただし、インストール済みのモジュールでスキーマを変更する場合は、キャッシュクリアだけではDBへ反映されません。その場合はhook_update_N()を用意し、下記のようにdrush updbを実行する必要があります。

ddev drush updb

5. 感想

.installという拡張子なので最初はPHPとは別のものかと思いましたが、中身はPHPでした。しかし、PHP自体の何かしらの機能ではなくDrupal固有の仕掛けでした。

また、SQLを直接書かなくてもPHPの配列でテーブルを定義出来るのは楽で良かったです。(イメージで言うとXMLみたいな)

6. おまけ

.installには今回取り扱ったテーブル作成以外にも、該当する条件に応じて既存のテーブルを更新する処理などを書くことができます。

既存のテーブルを更新する場合には、hook_update_N()を使用して更新処理を記述し、drush updbで反映します。

DBへの保存処理については前回も一緒にご参照ください。

.install がPHPとして読み込まれ、hook_schema() の配列定義からテーブルが作成される流れが、実例付きで分かりやすかったです。

補足ですが、インストール済みモジュールのスキーマを変更する場合、drush cr だけではDBへ反映されず、通常は hook_update_N() を用意して drush updb を実行する必要があります。第6節と合わせてこの点も記載されると、さらに実践的になると思いました。

「目的 → 仕組み → コード例 → 感想」の順で整理されていて、初めて .install を知る人にも流れを追いやすい記事だと思いました。さらに、event_manager.install のようにファイル名をモジュールのマシン名に合わせる点や、.install には hook_install()、hook_uninstall() なども記述できる点を一言添えると、役割の全体像がより伝わりやすいと思います。

文章表現では、「先ず」を「まず」、「追って行こうかと思います」を「確認していきます」、「直でDBを弄らなくても」を「データベースを直接操作しなくても」にすると、より簡潔で読みやすくなりそうです。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。