web-dev-qa-db-ja.com

hook_update_Nが実行されないのはなぜですか?

モジュールをDrupal 7.に移植しています。モジュールにはhook_update_N()から呼び出されるhook_install()関数があります。hook_update_N()関数ですが、hook_update_N関数が実行されていません。hook_update_N関数を明示的に呼び出す方法はありますか?

私の質問はこれとほとんど同じであることを知っています すべてのhook_update_N()を実行するためにhook_install()を取得する方法? 。しかし、hook_update_N()の呼び出し方がわかりません。 Drupalサイトでカスタムモジュールの更新も実行していると思いますが、hook_update_N()がトリガーされていないようです。error_log()hook_update_N()内の関数ですが、ログファイルが空です。

7
subhojit777

Drupalは、更新フックを1回だけ実行するため、実行された更新フックを格納します。特定の更新フックが実行されない場合、最も考えられる理由は

  • すでに実行されています
  • 失敗する前に実行する必要がある更新フック。

システムテーブルで有効なすべてのモジュールを確認でき、schema_versionは最後に実行された更新を示します。

6
googletorp

更新フックが実行されないもう1つの理由は、更新フック名とモジュールのメジャーリリース番号の不一致です(.infoファイルを参照)。

たとえば、モジュールのバージョンが7.x.1.0の場合、更新フックmymodule_update_7001は実行されません。このような場合、フックの名前をmymodule_update_7101に変更する必要があります。

hook_update APIドキュメントを参照してください

10
batigolix

新しいモジュールをインストールするときに問題が発生しましたが、インストールが失敗しました。 schema_versionは-1のままであり、そのモジュールのそれ以上の更新はできませんでした。バージョンを0に設定すると修正されました。

気になる方のために、既存のテーブルのスキーマを新しいモジュールに移動しました。この失敗は、既存のテーブルを作成できなかったときに発生しました。モジュールは期待どおりに有効化されましたが、schema_versionが更新されないことに気付きませんでした。

2
jgreep

Hook_update_N()関数が何もしない理由の1つは、(hook_update_N()関数で使用した数と同じ)またはそれ以上の数の更新がすでに実行されていることです。

Drupal 7.の 'system'テーブルにクエリを実行すると、モジュールで実行された最後の更新番号を確認できます。'schema_version 'は、バージョン番号を格納する' system 'テーブルの列ですモジュールに適用された最後の更新。新しいhook_update_N()関数が機能するためには、その関数で使用する数(N)が、そのモジュールの 'schema_version'列に現在格納されている数よりも大きい必要があります。

MySqlコマンドラインで次のクエリを使用しました(最初に 'use'コマンドを発行してmy Drupal 7データベース名を指定した後)。

mysql> select name、type、status、schema_version from system where type = 'module' and name = 'my_module_name';

「schema_version」列には番号が付けられます。新しい更新関数で使用する数は、それよりも大きい必要があります。

1

私はこの問題を抱えていて、他の回答でそれが言及されているのを見ることができないので、山に追加すると思いました。

私の問題はDrupal 8.7でしたが、モジュール名に大文字が含まれているため、更新のチェックに失敗しました。例:myModule

その理由は、drupal_get_schema_versions()$updatesの静的配列を持っているためです。これは、モジュール名をキーとする利用可能な更新スキーマバージョンの連想配列です。ただし、モジュール名はすべて小文字です。たとえば、$updates['mymodule']です。これにより、ロジックが失敗して何も返されなくなり、Drupalは更新がないと見なします。

1
Beebee