Ich habe mehrere Posts mit derselben Frage gefunden, aber die Antworten weichen immer von einem anderen Thema ab, oder sie passen nicht zu meinen Anforderungen.
Nach dem Speichern eines Knotens möchte ich, dass mein benutzerdefiniertes Modul eine Zeile in eine meiner benutzerdefinierten Tabellen einfügt, die die nid des neuen Knotens enthält. Wenn hook_node_submit
aufgerufen wird, existiert die NID noch nicht. hook_node_insert
hat die NID, wird aber nur beim ersten Speichern des Knotens aufgerufen, aber ich muss möglicherweise jedes Mal Maßnahmen ergreifen, wenn der Knoten gespeichert wird.
Mein Plan ist es, meine Funktionalität in eine eigene Methode zu unterteilen und beide Hooks zu implementieren, aber ich versuche, zu lernen, wie man Dinge richtig mit Drupal macht, und ich frage mich, ob es einen Hook gibt, der tatsächlich meinen Anforderungen entspricht.
Gibt es einen Hook, der jedes Mal aufgerufen wird, wenn ein Knoten gespeichert und aufgerufen wird, nachdem das Speichern abgeschlossen ist?
hook_node_insert
und verwendenhook_node_update
(wird jedes Mal ausgeführt, wenn ein Knoten gespeichert wird).hook_node_submit
aber nicht erwähnthook_node_update
?hook_node_insert
als auch inhook_node_update
.hook_node_insert()
undhook_node_update()
sind die richtigen Haken dafür,hook_node_submit()
wird während des Formularübermittlungsprozesses aufgerufen, bevor der Knoten gespeichert wird. Vergiss nicht, dass du die Caches jedes Mal löschen musst, wenn du einen Hook hinzufügst / entfernstAntworten:
Wenn man sich die Kommentare zu der Frage ansieht, sieht es so aus, als ob die offensichtliche Lösung darin besteht, die Haken
hook_node_insert()
und zu verwendenhook_node_update()
.Ich habe gerade etwas sehr Ähnliches gemacht, wie in der Antwort beschrieben: Ich habe eine Funktion geschrieben, die jedes Mal das tut, was ich will, wenn ein Knoten erstellt / aktualisiert wird, und sie dann von jedem dieser Hooks aus aufruft. Es funktioniert gut.
quelle
hook_form_alter()
. drupal.stackexchange.com/a/221041/15055Die korrekte Vorgehensweise besteht darin, die DB-Transaktion von Drupal zu respektieren. Wenn Sie eine Datenbankaktion in hook_node_insert ausführen möchten, müssen Sie berücksichtigen, dass der Knoten noch nicht gespeichert ist. Wenn dies fehlschlägt und ein Rollback durchgeführt wird, werden verwaiste Daten in Ihrer Datenbank gespeichert. Daher sollte die Drupal-Datenbank-API verwendet werden und nicht die direkte Ausführung von Abfragen.
Wenn Sie den Knoten selbst in hook_node_insert aktualisieren möchten, können Sie dies nicht, da node_save nicht verwendet werden kann, da der Knoten noch nicht in der Datenbank gespeichert ist und der Aufruf eine Ausnahme verursacht. Eine Lösung besteht darin, die Funktion register_shutdown_function zu verwenden und nid zu übergeben. Sie können node_load verwenden, um sicherzustellen, dass es wirklich gespeichert ist, und dann eine beliebige andere Aktion für den neuen Knoten ausführen.
UPDATE: Eine einfachere Alternative finden Sie auch hier /programming//a/24035797/1726778
quelle
drupal_register_shutdown_function()
. Aber beachten Sie, dass beide von ihnen scheinen Probleme in php-fpm Umwelt finden drupal.stackexchange.com/q/102603/10667og_is_group
. Ich glaube, ich habe aus diesem Grund falsche Negative erhalten.Es gibt ein neues Drupal-Modul, Hook Post Action , das die Post-Save-Hooks hinzufügt. Lassen Sie es uns versuchen, um zu sehen, ob es funktioniert.
quelle