web-dev-qa-db-fra.com

Dernier crochet à appeler après l'enregistrement de l'entité?

Parmi les différents hooks appelés lors du processus de sauvegarde d'entité, quel est le dernier à être appelé?

Existe-t-il un moyen de déclencher un événement après la création de l'entité, après l'enregistrement de tous les champs, la mise à jour des caches, etc.? Ainsi, lorsqu'un utilisateur enregistre le formulaire de mise à jour, cette action est la toute dernière chose à se produire avant le chargement de la page de redirection?

Si cela ne fait pas strictement partie du processus de sauvegarde, c'est bien. Ce qui compte, c'est que cela s'appelle après tout à propos de la sauvegarde d'une entité. S'il existe un moyen de connecter une fonction de formulaire et d'identifier de manière fiable à partir des données qu'un processus de sauvegarde a été terminé, ou de définir un rappel, cela me convient.

(contexte: j'ai un problème où des caches de champs sont créés qui ont causé des nœuds nouvellement créés et d'autres types d'entités pouvant être mis en champ, comme s'ils étaient vides et comme s'ils n'avaient pas de données de champ - mais toutes les tentatives jusqu'à présent en utilisant cache_get et cache_clear_all ne trouve pas le cache - il est créé tard dans le processus. Je recherche donc le dernier crochet possible qui l'obtiendra certainement)

(Informations pertinentes: hook_entity_postsave n'existe pas , et est l'un de ces problèmes majeurs qui se sont bloqués il y a des mois et des mois)

6

Les différentes fonctions d'encapsuleur ( node_save() , user_save() , etc.) sont responsables de la réinitialisation du cache d'entité après la fin de la méthode de sauvegarde. été invoqué sur un contrôleur d'entité.

Si vous prenez la fonction user_save() comme exemple, cette réinitialisation du cache se produit après la fonction appelle les différents hooks d'entité (il en va de même pour node_load())

Cela à l'esprit, je pense que la question devient alors "Quel est le dernier hook à être appelé pendant une sauvegarde d'entité"? ... et la réponse est hook_entity_update()/hook_entity_insert(). Mais, ils sont appelés avant la réinitialisation du cache (pour des raisons évidentes).

La méthode entity_save() appelle juste le gestionnaire de sauvegarde pour ce type d'entité particulier, et n'invoque aucun crochet propre, donc vraiment vos seules options sont:

  • Faites rouler votre propre contrôleur d'entité pour les différentes entités que vous devez intercepter, en changeant la méthode save() pour appeler un hook une fois le cache effacé.
  • Pirater/patcher les contrôleurs d'entité existants avec le même code.

Il n'y a pas non plus d'options particulièrement attrayantes, mais à moins qu'il n'y ait une solution disponible à un niveau supérieur que je ne vois pas, je ne pense pas que vous ayez beaucoup de choix.

3
Clive

J'ai eu un problème similaire où je voulais exécuter une vue après l'enregistrement d'un nœud. Le nœud est apparu dans la vue mais contenait d'anciennes données sur les champs bien qu'il ait juste été enregistré. Les appels suivants à la vue avaient les dernières valeurs de champ.

J'ai appelé ce qui suit au début de mon hook_node_update qui semble résoudre le problème (pour moi).

/**
 * Implements hook_node_update().
 */
function mymodule_node_update($node) {
  // Clear internal properties.                                           
  unset($node->is_new);                                                   
  unset($node->original);                                                 
  // Clear the static loading cache.                                      
  entity_get_controller('node')->resetCache(array($node->nid));  

  // Rest of my code e.g. execute a view.
}

Cette commande de réinitialisation du cache est exécutée par la fonction node_save après avoir appelé tous les hook_node_update.

2
John

Oui, il existe un module complémentaire qui fournit un hook à invoquer après la sauvegarde d'une entité. Cela s'appelle Hook Post Action . Cela a déjà été répondu sur stackoverflow.com .

2
Druvision