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


16

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_submitest appelé, le nid n'existe pas encore. hook_node_inserta 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 je me demande donc s'il y a un crochet qui correspond réellement à mes besoins.

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?


3
vous pouvez utiliser la combinaison de hook_node_insertet hook_node_update(agit à chaque fois qu'un nœud est enregistré).
AjitS

Oui, je l'ai décrit dans le post ci-dessus.
Kenny Wyland du

@KennyWyland que vous avez mentionné hook_node_submitmais pas hook_node_update?
David Thomas

Vous obtiendrez le nid de nœud hook_node_insertaussi bien que dans hook_node_update.
Sumit Madan

2
hook_node_insert()et hook_node_update()sont les crochets corrects pour cela, hook_node_submit()est appelé pendant le processus de soumission du formulaire avant que le nœud ne soit enregistré. N'oubliez pas que vous devez vider les caches chaque fois que vous ajoutez / retirez un crochet
Clive

Réponses:


5

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.


C'est super! Vous pourriez même le faire à partir de hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx L'inconvénient de cette méthode est qu'elle ne serait appelée que lorsqu'un nœud est inséré / mis à jour via un formulaire spécifique. Dans mon cas, j'avais besoin d'attraper tous les ajouts et modifications de nœuds.
donut

12

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. L'API de base de données Drupal doit donc ê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 /programming//a/24035797/1726778


1
Bonne idée. Bien qu'il soit préférable de l'utiliser drupal_register_shutdown_function(). Mais sachez que les deux semblent avoir des problèmes dans l'environnement php-fpm, voir drupal.stackexchange.com/q/102603/10667
Shevchuk

J'avais du mal à vérifier si un nœud agissait en tant que groupe organique og_is_group. Je pense que je recevais de faux négatifs pour cette raison.
icicleking

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.