Wie bekomme ich hook_install (), um alle hook_update_N () auszuführen?

18

Wie kann ich mit hook_install () alle Updates ausführen, die ich für mein Modul habe? Ich habe in ihm mymod.install Akte.

Ich habe versucht

function mymod_install() {
  mymod_update_6001();
}

aber es scheint nichts zu tun. Wenn ich ein mymod_update_6002 () habe, würde ich immer noch 6001 () anrufen, rufe einfach 6002 () an oder rufe beide in der Reihenfolge 6001 (), 6002 () an.

Ich dachte, es wäre vernünftig, alle Updates auszuführen, wenn Sie ein Modul standardmäßig installiert haben.

Lucy
quelle

Antworten:

19

Sie sollten Ihren Installations-Hook nicht dazu bringen, Updates auszuführen. Bei der erstmaligen Installation eines Moduls sollten keine Updates erforderlich sein.

Aktualisierungen werden verwendet, wenn das Modul bereits installiert ist (die Datenbank oder Variablen wurden erstellt). In diesem Fall möchten Sie das Modul nicht erneut installieren, da alle Daten gelöscht werden. Stattdessen erstellen Sie update_N-Hooks. Drupal erkennt, welche Updates benötigt werden, und diese werden ausgeführt update.php. In Drupal 6 wird automatisch ausgewählt, welche Updates durchgeführt werden sollen. Sie können diese jedoch ändern, während dies in Drupal 7 nicht möglich ist.

Drupal erkennt, welche Updates erforderlich sind, indem es die Nummer des letzten ausgeführten Updates speichert. Dies können Änderungen in der Datenbank sein, die es ermöglichen, Aktualisierungen in Drupal 7 erneut auszuführen. Das erneute Ausführen von Aktualisierungen ist normalerweise eine schlechte Idee, führt häufig zu Fehlern und kann in einigen Fällen Ihre Daten durcheinander bringen.

Denken Sie immer daran, Ihre Datenbank zu sichern, bevor Sie Updates ausführen.

googletorp
quelle
15

Der Zweck der Haken ist unterschiedlich.

  • hook_install () wird aufgerufen, wenn ein Modul installiert wird. Dies bedeutet, dass das Modul zuvor nicht installiert wurde und daher nicht aktualisiert werden muss.
  • hook_update_N () wird aufgerufen, wenn ein Modul bereits installiert ist und aktualisiert werden muss.

Wenn einige Aufgaben sowohl bei der Installation des Moduls als auch bei der Aktualisierung des Moduls ausgeführt werden müssen, sollte der Code in beiden Hooks vorhanden sein. Es gibt kein Modul, das während der Installation alle Update-Hooks aufruft. Dies ist insbesondere dann falsch, wenn die Update-Funktionen das Schema der vom Modul verwendeten Datenbanktabellen aktualisieren. hook_schema () sollte immer das aktualisierte Schema zurückgeben, und das Aktualisieren des Schemas auch mit den Aktualisierungsfunktionen wäre falsch.

Der von Ihnen geschriebene Code funktioniert nicht, da der Aufruf einer der Update-Funktionen nicht automatisch alle anderen Update-Funktionen ausführt.
Das Aufrufen der Update-Funktionen aus der Implementierung von hook_install()ist falsch, da es falsch ist, eine Update-Funktion aus einer anderen aufzurufen. Wenn Code von zwei oder mehr Aktualisierungsfunktionen ausgeführt werden muss, sollte dieser Code in eine Funktion eingefügt werden, die von den Aktualisierungsfunktionen und hook_install()bei Bedarf von aufgerufen wird .

kiamlaluno
quelle
5

Der Installations-Hook wird nur aufgerufen, wenn das Modul neu installiert wurde, sodass keine Updates erforderlich sind. Die Updates werden nur ausgeführt, wenn das Modul bereits installiert ist, sodass zusätzliche Änderungen vorgenommen werden können.

Um zu erzwingen, dass die Aktualisierungsfunktionen bei der Installation ausgeführt werden, müssen Sie Ihre Schemaversion ändern. Beispiel:

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();
}

Oder es von drush laufen: drush -y updb.

Siehe auch: Ist es möglich, die Ausführung des Update-Hooks Ihres Moduls zu erzwingen?

Kenorb
quelle
1

hook_install würde mit in mymod.modulefile nicht funktionieren .

Sie müssen hook_installund hook_uninstallin einer separaten Datei ablegenmymod.install

Ich denke, dass hook_update_N()sollte auch platziert werdenmymod.install


Antwort nach Aktualisierung der Frage:

Wenn Sie aus einem Link zitieren , überprüfen Sie bitte Ihre Versionsnummer in der Infodatei .

Da ich privat und nicht für Beiträge entwickle, ist mein Feld 'VERSION' in der .info-Datei meines Moduls entweder leer oder unverändert, wenn ich ein Modul aktualisiere. Ich verwende Subversive für Eclipse PDT und daher werden meine Versionsnummern in den Infodateien nie aktualisiert. Daher wurde mein hook_update_6001 NICHT von update.php aufgerufen.

Shoaib Nawaz
quelle