web-dev-qa-db-fra.com

Existe-t-il un hook de nœud qui s'exécute APRÈS qu'un nœud est complètement inséré dans la base de données?

Je veux exécuter du code après l'insertion d'un nœud dans la base de données. hook_node_insert() est proche, bien sûr, mais comme le dit le doc, "lorsque ce hook est invoqué, les modifications n'ont pas encore été écrites dans la base de données, car une transaction de base de données est toujours en cours". Y a-t-il un hook que je peux implémenter qui me donne accès au nœud nouvellement inséré après qu'il soit complètement dans la base de données? hook_path_insert() fait cela, et est lié à ce que je veux faire, mais ce n'est pas optimal pour toutes sortes de raisons. Pensées?

7
Jim Miller

Aucun hook n'est appelé une fois la transaction terminée, car le code node_save() s'exécute est exécuté pendant la transaction.

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

  try {

    // ...

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

Si node_save() est appelé à partir de node_form_submit() (le gestionnaire de soumission de formulaire pour le formulaire de noeud), vous pouvez ajouter un gestionnaire de soumission de formulaire qui est appelé par la suite. Il serait exécuté une fois le nœud enregistré dans la base de données.

La documentation de hook_node_insert() signifie que, puisque les données ne sont pas encore enregistrées dans la table de base de données, vous ne pouvez pas interroger une table faisant une jointure avec la table "node", car cette table contient toujours les anciennes données ; de la même manière, vous ne devez pas appeler une fonction qui interroge la table "node".

5
kiamlaluno

Il existe un autre moyen d'atteindre cet objectif en ajoutant votre fonction de rappel personnalisé dans hook_form_alter qui s'exécutera après l'insertion/la mise à jour du nœud.

Par exemple:
Vérifiez le code suivant qui correspond à l'article.


/**
 * 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';
    }
}

Maintenant, vous pouvez faire votre fonctionnalité de sauvegarde de poste dans _callback_on_postsave une fonction. Par exemple:


/**
 * 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

La solution la plus simple consiste à utiliser ce module:

Hook Post Action

Il vous permet d'utiliser de nouveaux crochets:

  • 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