2010-05-06 4 views
6

Je développe une action dans Drupal qui est censée s'activer après avoir sauvegardé un noeud, exporter le contenu vers XML (qui inclut les données du noeud qui vient d'être sauvegardé), en utilisant le déclencheur "Trigger: After save a updated update".Comment exécuter une action dans drupal après chaque enregistrement d'un noeud?

Malheureusement, cette action se produit juste avant que les informations du post récemment enregistré soient enregistrées dans la base de données. c'est à dire. Lorsque je regarde le XML plus tard, je constate que la modification la plus récente que j'ai faite n'a pas été incluse. L'enregistrement après la modification d'un nœud différent restaurera les données précédemment manquantes.

Comment puis-je déclencher mon action une fois le processus d'enregistrement terminé?

Répondre

6

Il y a un écueil courant dans ce contexte, que vous utilisez un déclencheur ou suggestion Mike Munroes via hook_nodeapi() (+1):

Tant que votre logique d'exportation s'exécute sur le même cycle de page qui traite la mise à jour et utilise node_load() pour obtenir les données des noeuds, node_load() peut renvoyer une version mise en cache statique du noeud avant la mise à jour qui ne contient pas encore les modifications . Si tel est le problème dans votre cas, vous pouvez travailler autour de deux façons:

  1. force une réinitialisation du cache de nœud statique en passant TRUE comme troisième paramètre à node_load(). Cela garantirait que le nœud soit fraîchement rempli à partir de la base de données (au prix de certaines requêtes db supplémentaires, alors soyez conscient d'un impact potentiel sur les performances).
  2. Si vous allez la route hook_nodeapi(), vous pourriez éviter la nécessité d'appeler node_load() si vous passez l'objet $node disponible directement à votre fonction d'exportation, car ce sera une représentation de l'état mis à jour.
+0

Henrik, Merci, j'ai essayé votre solution et cela résout mon problème avec précision. Plus précisément, node_load() a résolu le problème de mise en cache L'action devait être déclenchée au bon moment, elle était en train de charger une copie du nœud qui venait d'être mise à jour. – ford

+0

vous pouvez également faire node_load (array ('nid' => $ nid)) et cela va contourner le cache –

5

Vous devez utiliser hook_nodeapi et appeler votre action lors de l'insertion et de la mise à jour. Regardez par-dessus la documentation pour hook_nodeapi pour d'autres instances où vous pourriez appeler votre logique d'exportation.

exemple où le nom du module = 'export_to_xml':

/** 
* Implementation of hook_nodeapi(). 
*/ 
function export_to_xml_nodeapi(&$node, $op, $a3, $a4) { 
    if ($op == 'update' || $op == 'insert') { 
    export_logic_function(); 
    } 
} 
+0

Merci, c'est un bon point de départ. J'ai été capable de faire quelque chose de similaire en implémentant hook_action_info(). Malheureusement, je rencontre le même problème. Si $ op est mis à jour, Drupal ne tiendra pas compte des dernières modifications mises à jour lorsque j'exécuterai export_logic_function(). Au lieu de cela, il exportera les résultats précédemment stockés de la base de données, avant que cette mise à jour ne se produise. En regardant http://api.drupal.org/api/function/hook_nodeapi Je n'arrive pas à trouver une opération spécifiquement post-sauvegarde. 'update' semble devoir fonctionner, sauf pour les résultats auxquels je suis confronté. Merci – ford

Questions connexes