it-swarm.com.de

Gibt es einen Knoten-Hook, der ausgeführt wird, nachdem ein Knoten vollständig in die Datenbank eingefügt wurde?

Ich möchte Code ausführen, nachdem ein Knoten in die Datenbank eingefügt wurde. hook_node_insert() ist natürlich nah, aber wie das Dokument sagt: "Wenn dieser Hook aufgerufen wird, wurden die Änderungen noch nicht in die Datenbank geschrieben, da noch eine Datenbanktransaktion vorliegt in Bearbeitung". Gibt es einen Hook, den ich implementieren kann, der mir Zugriff auf den neu eingefügten Knoten gibt, nachdem dieser vollständig in der Datenbank enthalten ist? hook_path_insert() macht das und hängt mit dem zusammen, was ich machen möchte, aber es ist aus allen möglichen Gründen nicht optimal. Gedanken?

7
Jim Miller

Es gibt keinen Hook, der nach Abschluss der Transaktion aufgerufen wird, da der ausgeführte Code node_save() während der Transaktion ausgeführt wird.

function node_save($node) {
  $transaction = db_transaction();

  try {

    // ...

  }
  catch (Exception $e) {
    $transaction->rollback();
    watchdog_exception('node', $e);
    throw $e;
  }
}

Wenn node_save() von node_form_submit() (dem Formularübermittlungshandler für das Knotenformular) aufgerufen wird, können Sie einen Formularübermittlungshandler hinzufügen, der danach aufgerufen wird. Es wird ausgeführt, nachdem der Knoten in der Datenbank gespeichert wurde.

Die Dokumentation für hook_node_insert() bedeutet, dass Sie, da die Daten noch nicht in der Datenbanktabelle gespeichert sind, keine Tabelle abfragen können, die einen Join mit der Tabelle "node" herstellt, da diese Tabelle noch die alten Daten enthält ;; Auf die gleiche Weise sollten Sie keine Funktion aufrufen, die die Tabelle "Knoten" abfragt.

5
kiamlaluno

Es gibt eine andere Möglichkeit, dies zu erreichen, indem Sie Ihre benutzerdefinierte Rückrufübermittlungsfunktion in hook_form_alter hinzufügen, die nach dem Einfügen/Aktualisieren des Knotens ausgeführt wird.

Z.B:
Überprüfen Sie den folgenden Code für den Artikel.


/**
 * Implement hook_form_alter
 *
 * @param type $form
 * @param type $form_state
 * @param type $form_id
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    // Checking form_id
    if ($form_id == 'article_node_form') {
        // Adding custom callback function.
        $form['actions']['submit']['#submit'][] = '_callback_on_postsave';
    }
}

Jetzt können Sie Ihre Post-Save-Funktion in ausführen _callback_on_postsave Funktion. Z.B:


/**
 * General Callback for form_alter
 * 
 * @param type $form
 * @param type $form_state
 */
function _callback_on_postsave($form, &$form_state) {
    $nid = $form_state['values']['nid'];
    $node = node_load($nid);
    // Do your stuff here 
}
5
vijay

Die einfachste Lösung ist die Verwendung dieses Moduls:

Hook Post Action

Sie können neue Haken verwenden:

  • hook_entity_postsave
  • hook_entity_postinsert
  • hook_entity_postupdate
  • hook_entity_postdelete
  • hook_node_postsave
  • hook_node_postinsert
  • hook_node_postupdate
  • hook_node_postdelete
3
laniol