2010-05-06 11 views
6

Sto sviluppando un'azione in Drupal che si suppone per attivare dopo aver salvato un nodo, l'esportazione di contenuti in XML (che comprende i dati dal nodo che è stato appena salvato), utilizzando il "trigger: Dopo aver salvato un posto aggiornato" grilletto.Come si esegue un'azione in drupal ogni volta che viene salvato un nodo?

Purtroppo questa azione avviene in realtà proprio prima che l'informazione dal post di recente salvato viene salvato nel database. vale a dire. quando guardo l'XML più tardi, trovo che il cambiamento più recente che ho fatto non è stato incluso. Il salvataggio dopo la modifica di un nodo diverso ripristinerà i dati mancanti in precedenza.

Come posso ottenere la mia azione al fuoco dopo che il processo di salvataggio è completo?

risposta

6

C'è un errore comune in questo contesto, indipendentemente dal fatto che si utilizza un trigger o Mike Munroes suggerimento tramite hook_nodeapi() (+1):

Fintanto che la logica di esportazione viene eseguita nello stesso ciclo di pagine che ha elaborato l'aggiornamento e utilizza node_load() per ottenere i dati dei nodi, node_load() potrebbe restituire una versione del nodo memorizzata staticamente prima dell'aggiornamento che non contiene ancora le modifiche . Se questo è il problema nel tuo caso, è possibile risolvere in due modi:

  1. forza un reset della cache nodo statico passando TRUE come terzo parametro per node_load(). Ciò assicurerebbe che il nodo venga popolato di recente dal database (al prezzo di alcune query aggiuntive di DB, pertanto tenere presente un potenziale impatto sulle prestazioni).
  2. Se si sta andando il percorso hook_nodeapi(), si potrebbe evitare la necessità di chiamare node_load() del tutto, se si passa l'oggetto $node disponibile là direttamente alla funzione di esportazione, in quanto sarà una rappresentazione dello stato aggiornato.
+0

Henrik, Grazie, ho provato la soluzione e risolve il mio problema con precisione. Specificamente, node_load() risolto il problema di cache L'azione deve essere innescando al momento giusto, era solo caricando una copia memorizzata nella cache del nodo che è stato appena aggiornato. – ford

+0

puoi anche fare node_load (array ('nid' => $ nid)) e questo ignorerà la cache –

5

Si dovrebbe usare hook_nodeapi e richiamare la vostra azione su inserimento e aggiornamento. Esaminare la documentazione per hook_nodeapi per altre istanze in cui è possibile chiamare la logica di esportazione.

esempio in cui il nome del modulo = '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

Grazie, questo è un buon punto di partenza. Sono stato in grado di fare qualcosa di simile implementando hook_action_info(). Sfortunatamente sto incontrando lo stesso problema. Se $ op è aggiornato, Drupal non prenderà in considerazione le ultime modifiche appena aggiornate quando eseguirò export_logic_function(). Invece esporterà i risultati memorizzati in precedenza dal database, da prima che si verificasse questo aggiornamento. Guardando http://api.drupal.org/api/function/hook_nodeapi Non riesco a trovare un'operazione che sia specificamente post-salvataggio. 'aggiornamento' sembra che dovrebbe funzionare, ad eccezione dei risultati che sto affrontando. Grazie – ford

Problemi correlati