web-dev-qa-db-ja.com

すべてのhook_update_N()を実行するようにhook_install()を取得する方法?

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

私が試してみました

function mymod_install() {
  mymod_update_6001();
}

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

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

18
Lucy

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

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

Drupalは、最後に実行された更新の数を保存することにより、必要な更新を検出します。これは、データベースの変更である可能性があります。これにより、Drupal 7.で更新を再実行できます。通常、更新を再実行することはお勧めできません。ほとんどの場合、エラーが発生し、場合によってはデータが台無しになります。

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

19
googletorp

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

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

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

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

15
kiamlaluno

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

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

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

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

5
kenorb

hook_installは_mymod.module_ファイルでは機能しません。

_hook_install_と_hook_uninstall_を別のファイルに配置する必要があります_mymod.install_

hook_update_N()も_mymod.install_に配置する必要があると思います


質問が更新された後の回答:

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

私は寄付ではなく非公開で開発しているため、モジュールを更新しても、モジュールの.infoファイルの「VERSION」フィールドは空白か変更されていません。実際にSubversive for Eclipse PDTを使用しているため、情報ファイルのバージョン番号が更新されません。したがって、私のhook_update_6001はupdate.phpによって呼び出されていませんでした。

1
Shoaib Nawaz