すべてのhook_update_N()を実行するためにhook_install()を取得する方法は?


18

モジュール用に持っているすべての更新を実行するためにhook_install()を取得するにはどうすればよいですか?mymod.installファイルがあります。

私が試してみました

function mymod_install() {
  mymod_update_6001();
}

しかし、何もしないようです。mymod_update_6002()がある場合、6001()を呼び出すか、6002()を呼び出すか、6001()、6002()の順序で両方を呼び出します。

デフォルトでモジュールをインストールしたときにすべてのアップデートを実行するのが常識だと思いました。

回答:


19

更新を実行するためのインストールフックを取得しないでください。モジュールを初めてインストールするとき、更新は必要ありません。

更新は、モジュールが既にインストールされている(データベースまたは変数が作成されている)ときに使用されます。その場合、すべてのデータを消去するため、モジュールを再インストールするのではなく、代わりにupdate_Nフックを作成します。Drupalは、どの更新が必要であるかを検出し、それらの更新を実行しupdate.phpます。Drupal 6では、実行する更新を自動的に選択しますが、変更できますが、これはDrupal 7では不可能です。

Drupalは、最後に実行された更新の番号を保存することにより、必要な更新を検出します。これはデータベースの変更であり、Drupal 7で更新を再実行できます。通常、更新の再実行は悪い考えであり、ほとんどの場合エラーを引き起こし、場合によってはデータを台無しにします。

更新を実行する前に、必ずデータベースをバックアップしてください。


15

フックの目的は異なります。

  • hook_install()は、モジュールがインストールされるときに呼び出されます。モジュールが以前にインストールされていなかったため、更新する必要がないことを意味します。
  • hook_update_N()は、モジュールが既にインストールされているときに呼び出され、更新する必要があります。

モジュールのインストール時とモジュールの更新時の両方で実行する必要があるタスクがある場合、コードは両方のフックに存在する必要があります。インストール中にすべての更新フックを呼び出すモジュールはありません。また、更新機能がモジュールから使用されるデータベーステーブルのスキーマを更新する場合は特に間違っています。hook_schema()は常に更新されたスキーマを返す必要があり、更新関数を使用してスキーマを更新することは間違っています。

更新関数の1つを呼び出しても、他のすべての更新関数は自動的に実行されないため、作成したコードは機能しません。
の実装から更新関数hook_install()を呼び出すのは間違っています。更新関数を別の関数から呼び出すのは間違っているためです。2つ以上の更新関数から実行する必要があるコードがある場合、そのコードは更新関数から呼び出される関数に配置hook_install()する必要があります。


5

インストールフックは、モジュールが新しくインストールされたときにのみ呼び出されるため、更新の必要はありません。更新はモジュールが既にインストールされている場合にのみ実行されるため、追加の変更を適用できます。

更新機能をインストール時に強制的に実行するには、たとえば、スキーマバージョンを変更する必要があります。

function mymod_install() {
  // Reset the schema version, so our update hooks can be processed during the installation.
  drupal_set_installed_schema_version('mymod', '7000');
  // Then run the updates as usual.
  mymod_update_7001();
}

または、drush:から実行しますdrush -y updb

参照:モジュールの更新フックを強制的に実行することは可能ですか?


1

hook_installはmymod.moduleファイル内では機能しません。

別のファイルに配置する必要がhook_installありhook_uninstallますmymod.install

hook_update_N()もそれを配置する必要があると思いますmymod.install


質問が更新された後に回答します。

リンクから引用して、情報ファイルのバージョン番号を確認してください。

私は個人で開発しており、貢献するためではないので、モジュールの.infoファイルの「VERSION」フィールドは、モジュールを更新するときに空白または変更されていません。私は実際にEclipse PDTにSubversiveを使用しているため、情報ファイルのバージョン番号は更新されません。したがって、私のhook_update_6001はupdate.phpによって呼び出されていませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.