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への保存処理については前回も一緒にご参照ください。
- コメントを追加
- 閲覧数 65
.install の説明が分かりやすかったです
.install がPHPとして読み込まれ、hook_schema() の配列定義からテーブルが作成される流れが、実例付きで分かりやすかったです。
補足ですが、インストール済みモジュールのスキーマを変更する場合、drush cr だけではDBへ反映されず、通常は hook_update_N() を用意して drush updb を実行する必要があります。第6節と合わせてこの点も記載されると、さらに実践的になると思いました。
記事構成と表現について
「目的 → 仕組み → コード例 → 感想」の順で整理されていて、初めて .install を知る人にも流れを追いやすい記事だと思いました。さらに、event_manager.install のようにファイル名をモジュールのマシン名に合わせる点や、.install には hook_install()、hook_uninstall() なども記述できる点を一言添えると、役割の全体像がより伝わりやすいと思います。
文章表現では、「先ず」を「まず」、「追って行こうかと思います」を「確認していきます」、「直でDBを弄らなくても」を「データベースを直接操作しなくても」にすると、より簡潔で読みやすくなりそうです。
コメントを追加