Welchen Hook kann ich für Aktionen nach dem Speichern verwenden?


15

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_submitaufgerufen wird, existiert die NID noch nicht. hook_node_inserthat 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?


3
Sie können die Kombination von hook_node_insertund verwenden hook_node_update(wird jedes Mal ausgeführt, wenn ein Knoten gespeichert wird).
Ajits

Ja, das habe ich oben im Beitrag beschrieben.
Kenny Wyland

@KennyWyland hast du hook_node_submitaber nicht erwähnt hook_node_update?
David Thomas

Sie erhalten die Node-NID sowohl in hook_node_insertals auch in hook_node_update.
Sumit Madan

2
hook_node_insert()und hook_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 / entfernst
Clive

Antworten:


5

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 verwenden hook_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.


Das ist cool! Sie könnten dies sogar aus tun hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx Der Nachteil dieser Methode ist, dass sie nur aufgerufen wird, wenn ein Knoten über ein bestimmtes Formular eingefügt / aktualisiert wird. In meinem Fall musste ich alle Ergänzungen und Änderungen von Knoten erfassen.
Donut

12

Die 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.

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

UPDATE: Eine einfachere Alternative finden Sie auch hier /programming//a/24035797/1726778


1
Gute Idee. Obwohl es besser ist, zu verwenden drupal_register_shutdown_function(). Aber beachten Sie, dass beide von ihnen scheinen Probleme in php-fpm Umwelt finden drupal.stackexchange.com/q/102603/10667
Shevchuk

Ich konnte nicht überprüfen, ob ein Knoten als organische Gruppe fungierte og_is_group. Ich glaube, ich habe aus diesem Grund falsche Negative erhalten.
Eiszapfen

5

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.