hook_install()を取得してすべてのhook_update_n()を実行するにはどうすればよいですか?

drupal.stackexchange https://drupal.stackexchange.com/questions/5194

  •  16-10-2019
  •  | 
  •  

質問

module用にfool_install()を取得してすべての更新を実行するにはどうすればよいですか?私はその中にmymod.installファイルを持っています。

私が試してみました

function mymod_install() {
  mymod_update_6001();
}

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

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

役に立ちましたか?

解決

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

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

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

更新を実行する前に、常にデータベースをバックアップすることを忘れないでください。

他のヒント

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

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

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

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

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

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

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.

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

hook_installはinで動作しません mymod.module ファイル。

あなたは置かなければなりません hook_installhook_uninstall 別のファイルで mymod.install

私はそうだと思います hook_update_N() また、配置する必要があります mymod.install


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

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

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

ライセンス: CC-BY-SA帰属
所属していません drupal.stackexchange
scroll top