web-dev-qa-db-fra.com

Quel crochet puis-je utiliser pour les actions post-sauvegarde?

J'ai trouvé plusieurs messages avec cette même question, mais les réponses divergent toujours vers un autre sujet ou elles ne fonctionnent pas pour mes besoins.

Une fois un nœud enregistré, je souhaite que mon module personnalisé insère une ligne dans l'une de mes tables personnalisées qui contient le nid du nouveau nœud. Quand hook_node_submit est appelé, le nid n'existe pas encore. hook_node_insert a le nid, mais n'est appelé que la première fois que le nœud est enregistré, mais j'ai potentiellement besoin de prendre des mesures à chaque fois que le nœud est enregistré.

Mon plan est de séparer ma fonctionnalité dans sa propre méthode et d'implémenter les deux crochets, mais j'essaie d'apprendre à faire les choses correctement avec Drupal et donc je me demande s'il y a un crochet qui correspond en fait à mes exigences.

Existe-t-il un hook qui est appelé chaque fois qu'un nœud est enregistré et appelé APRÈS la sauvegarde est terminée?

17
Kenny Wyland

En regardant les commentaires sur la question, il semble que la solution évidente consiste à utiliser les crochets hook_node_insert() et hook_node_update() .

En fait, je viens de faire quelque chose de très similaire, comme décrit dans la réponse: j'ai écrit une fonction qui fait ce que je veux faire à chaque fois qu'un nœud est créé/mis à jour, puis je l'appelle à partir de chacun de ces crochets. Cela fonctionne très bien.

6
donut

La bonne façon de procéder est de respecter la transaction db de Drupal. Si vous souhaitez effectuer une action de base de données dans hook_node_insert, vous devez considérer que le nœud n'est pas encore réellement enregistré. ce qui signifie qu'en cas d'échec et de restauration, vous vous retrouvez avec des données orphelines dans votre base de données. Donc Drupal doit être utilisée et non l'exécution directe des requêtes.

Si vous souhaitez mettre à jour le nœud lui-même dans hook_node_insert, vous ne pouvez pas, car il n'est pas possible d'utiliser node_save car le nœud n'est pas encore enregistré dans la base de données et son appel provoque une exception. Une solution consiste à utiliser la fonction register_shutdown_function et à passer nid, vous pouvez utiliser node_load pour vous assurer qu'il est vraiment enregistré, puis effectuer toute autre action que vous souhaitez sur le nouveau nœud.

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

MISE À JOUR: Vous pouvez également trouver une alternative plus simple ici https://stackoverflow.com/a/24035797/1726778

12
Sina Salek

Il y a un nouveau module drupal, Hook Post Action , qui ajoute les hooks de sauvegarde du post. Essayons pour voir si cela fonctionne.

5
Druvision