自作モジュールを開発する場合に、はじめにデータベースアクセス以外のインターフェイス部などを実装し、あとからデータベース関連のコードを実装する場合に作成したmodule.installファイルが実行されない状態になることがあります。同様にmodule.installを変更した場合にも新しいmodule.installはそのままでは実行されません。この記事ではこの対処方法を説明します。
例として、sample.moduleというモジュールを作成し、これをテストして、後からデータベースにテーブルを追加するsample.installを作成した場合に、このsample.installがモジュールを無効にして再度有効にしても実行されないのです。
これは、Drupalのシステムがそのモジュールを一度でも実行すると、そのモジュールが現在有効か無効かにかかわらずにそのモジュールを過去に実行したことを記憶していているためです。つまりデータベースにテーブルを作成するsample.installは1度だけ実行すれば良いので、有効・無効を切り替えるだけでは再度実行をしてくれないのです。では、後からsample.installを作成したり、sample.installを修正した場合にはどうすればいいかというと以下の3つの方法があります。
- 直接データベースを操作して新規テーブルを作成(CREATE)したり、修正(ALTER)したりする
- Drupalのsystemテーブルから対象モジュールのレコードを削除する
- 開発者向けのdevelモジュールをインストールして、そこからreinstall moduleを実行する
ここでは、直接データベースを操作する方法についての説明は省略いたします。
Drupalのsystemテーブルから対象モジュールのレコードを削除する方法
この方法をおこなう場合には、まずそのモジュールを無効にして、systemテーブルから対象モジュールのレコードを削除します。仮にsampleモジュールがsample.infoにおいてSampleという名前で登録されている場合に、MySQLでは以下のようなQueryになります。
mysql> DROP FROM system WHERE name = 'Sample';
これで、sampleモジュールを再び有効にすると、sample.installが実行されることになります。sample.installを変更した場合にもこの方法は使えます。
drupal.orgの以下の記事の一番最後にこのことがちょっとだけ書かれています(英語)
http://drupal.org/node/51220
開発者向けのDevelモジュールを使用する方法
一番簡単なのはDevelモジュールをインストールしておき、Reinstall module機能を選択してそこから対象となるモジュールを選択してreinstallをおこなう方法です。この操作により選択したモジュールのhook_uninstallとhook_install(共にmodule.installに通常含まれるフック関数)が実行されますので、直接データベースをさわったりする必要もなくDrupalの中から行えるのでとても簡単です。
Develモジュールはこれ以外にも開発者向けの便利な機能が満載ですので、Drupal開発者には必須のモジュールと言えます。Develモジュールのダウンロードは以下のプロジェクトページからどうぞ
http://drupal.org/project/devel
Develモジュールの便利な利用方法は当サイトでも今後紹介していきたいと思います。
新しいコメントの投稿