Warum wird hook_update_N nicht ausgeführt?

7

Ich portiere ein Modul nach Drupal 7. Das Modul verfügt über hook_update_N()Funktionen, von denen aus aufgerufen wird hook_install(). In einer der hook_update_N()Funktionen werden einige Einfügeabfragen durchgeführt . Aber meine hook_update_NFunktion läuft nicht. Gibt es eine Möglichkeit, hook_update_NFunktionen explizit aufzurufen ?

Ich weiß, dass meine Frage fast dieselbe ist wie diese. Wie bekomme ich hook_install (), um alle hook_update_N () auszuführen? . Aber ich verstehe nicht, wie hook_update_N()es heißt. Ich habe Updates auf meiner Drupal-Site ausgeführt, von denen ich glaube, dass sie auch Updates für benutzerdefinierte Module ausführen, aber es scheint, dass sie hook_update_N()nicht ausgelöst werden. Weil ich eine error_log()Funktion hinzugefügt habe , hook_update_N()aber die Protokolldatei leer ist.

subhojit777
quelle

Antworten:

6

Drupal speichert, welche Update-Hooks ausgeführt wurden, da die Update-Hooks nur einmal ausgeführt werden. Wenn ein bestimmter Update-Hook nicht ausgeführt wird, sind die wahrscheinlichsten Gründe

  • Es wurde bereits ausgeführt
  • Ein Update-Hook, der ausgeführt werden muss, bevor er fehlschlägt.

In der Systemtabelle sehen Sie alle aktivierten Module und sehen schema_version, welches Update zuletzt ausgeführt wurde.

googletorp
quelle
Vielen Dank!! Ihr Hinweis "siehe in der Systemtabelle" hat mir sehr geholfen!
Subhojit777
Kennen Sie andere Gründe? Ist -1 ein Sonderfall? Kennen Sie die Bedeutung davon?
Htoip
10

Ein weiterer Grund, warum ein Update-Hook nicht ausgeführt wird, ist eine Nichtübereinstimmung zwischen dem Namen des Update-Hooks und der Hauptversionsnummer des Moduls (siehe Info-Datei).

Beispiel: Der Update-Hook mymodule_update_7001 wird nicht ausgeführt, wenn die Modulversion 7.x.1.0 ist. In diesem Fall müssen Sie den Hook in mymodule_update_7101 umbenennen.

Weitere Informationen finden Sie in der Dokumentation zur hook_update-API

Batigolix
quelle
1
Dies hat mir nur eine unbekannte Anzahl weiterer Debugging-Stunden erspart! Vielen Dank!
Pryo
1
Für mich war es auch dieses 1.x Missmatch mit 7100, danke
Marko Blazekovic
2

Ich hatte ein Problem, bei dem ich ein neues Modul installiert habe, aber die Installation ist fehlgeschlagen. Die schema_version blieb bei -1, was weitere Aktualisierungen für dieses Modul verhinderte. Das Setzen der Version auf 0 hat das Problem behoben.

Für Neugierige habe ich das Schema einer vorhandenen Tabelle in ein neues Modul verschoben. Der Fehler trat auf, als die vorhandene Tabelle nicht erstellt werden konnte, was ich erwartet hatte. Das Modul wurde wie erwartet aktiviert, aber ich habe nicht bemerkt, dass die schema_version nicht aktualisiert wurde.

jgreep
quelle
1
Ich hatte ein ähnliches Problem, bei dem schema_version eines aktivierten und funktionierenden benutzerdefinierten Moduls auf -1 gesetzt wurde. AFAIK wurde nur einmal installiert und konnte nicht fehlgeschlagen werden, da das Modul heute verwendet wird. Ich weiß nicht, warum schema_version auf -1 gesetzt wurde. Wie auch immer, ich habe die schema_version manuell auf 0 aktualisiert, damit sie mein custom_update_7000 erkennt und ausführt, wenn ich einer vorhandenen Tabelle, die vor langer Zeit mit dem Modul installiert wurde, eine Spalte hinzufügen muss.
Wesley Musgrove
1

Ein Grund, warum die Funktion hook_update_N () nichts bewirkt, ist, dass ein Update mit derselben oder einer höheren Nummer (als der Nummer, die Sie für Ihre Funktion hook_update_N () verwendet haben) bereits ausgeführt wurde.

Sie können die letzte Aktualisierungsnummer anzeigen, die für Ihr Modul ausgeführt wurde, indem Sie die Tabelle 'system' in Drupal 7 abfragen. 'Schema_version' ist eine Spalte in der Tabelle 'system', in der die Versionsnummer der letzten Aktualisierung gespeichert ist, die auf Ihr Modul angewendet wurde. Damit Ihre neue Funktion hook_update_N () funktioniert, muss die Nummer (N), die Sie darauf verwenden, höher sein als die Nummer, die derzeit in der Spalte 'schema_version' für dieses Modul gespeichert ist.

Ich habe die folgende Abfrage in der MySql-Befehlszeile verwendet (nachdem ich zum ersten Mal einen Befehl 'use' ausgegeben habe, um meinen Drupal 7-Datenbanknamen anzugeben).

mysql> wähle Name, Typ, Status, schema_version aus dem System aus, wobei type = 'module' und name = 'my_module_name';

Die Spalte 'schema_version' enthält eine Nummer. Die Nummer, die Sie für Ihre neue Update-Funktion verwenden, muss höher sein.

Anthony Fournier
quelle
1

Ich hatte gerade dieses Problem und dachte, ich würde es dem Stapel hinzufügen, da ich es in anderen Antworten nicht sehen kann.

Mein Problem war mit Drupal 8.7 und das Problem war, dass der Modulname Großbuchstaben hatte, was dazu führte, dass keine Überprüfung auf Updates fehlschlug. Zum Beispiel : myModule.

Der Grund dafür drupal_get_schema_versions()ist, dass ein statisches Array $updatesein assoziatives Array verfügbarer Update-Schema-Versionen ist, die durch Modulnamen verschlüsselt sind. Die Modulnamen sind jedoch alle in Kleinbuchstaben. Zum Beispiel $updates['mymodule']. Dies führt dazu, dass die Logik fehlschlägt und nichts zurückgibt, sodass Drupal denkt, dass keine Updates vorhanden sind.

Beebee
quelle