2010-05-06 13 views
6

Estoy desarrollando una acción en Drupal que se supone que se activa después de guardar un nodo, exportar contenido a XML (que incluye datos del nodo que acaba de guardar), usando el disparador "Disparador: Después de guardar una publicación actualizada".¿Cómo ejecuto una acción en drupal después de cada vez que se guarda un nodo?

Lamentablemente, esta acción realmente ocurre justo antes de que la información de la publicación guardada recientemente se guarde en la base de datos. es decir. Cuando miro el XML más tarde, descubro que el cambio más reciente que hice no estaba incluido. Guardar después de editar un nodo diferente restaurará los datos que faltaban anteriormente.

¿Cómo puedo activar mi acción después de que se complete el proceso de guardado?

Respuesta

6

Hay un error común en este contexto, independientemente de si se utiliza un disparador o sugerencia a través de Mike Munroes hook_nodeapi() (1):

Siempre que su lógica de exportación se ejecute en el mismo ciclo de página que procesó la actualización y usa node_load() para obtener los datos de los nodos, node_load() podría devolver una versión almacenada en caché del nodo antes de la actualización que aún no contiene los cambios . Si este es el problema en su caso, se puede trabajar alrededor de dos maneras:

  1. fuerza un reinicio del nodo de caché estática pasando TRUE como tercer parámetro a node_load(). Esto garantizaría que el nodo se llene recientemente desde la base de datos (al precio de algunas consultas adicionales de db, así que tenga en cuenta un posible impacto en el rendimiento).
  2. Si va por la ruta hook_nodeapi(), puede evitar la necesidad de llamar al node_load() si pasa el objeto $node disponible allí directamente a su función de exportación, ya que será una representación del estado actualizado.
+0

Henrik, Gracias, probé su solución y resuelve mi problema con precisión. Específicamente, node_load() resolvió el problema de almacenamiento en memoria caché La acción debe haberse estado desencadenando en el momento correcto, solo estaba cargando una copia en caché del nodo que acababa de actualizarse. – ford

+0

también puedes hacer node_load (array ('nid' => $ nid)) y eso omitirá el caché –

5

Debe usar hook_nodeapi e invocar su acción al insertar y actualizar. Consulte la documentación de hook_nodeapi para conocer otras instancias en las que puede llamar a su lógica de exportación.

ejemplo en el nombre del módulo = '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

Gracias, este es un buen punto de partida. Pude hacer algo similar al implementar hook_action_info(). Lamentablemente, me encuentro con el mismo problema. Si $ op es una actualización, Drupal no tomará los cambios más recientes, solo actualizados en la cuenta cuando ejecute export_logic_function(). En su lugar, exportará los resultados previamente almacenados de la base de datos, desde antes de que ocurriera esta actualización. Observando http://api.drupal.org/api/function/hook_nodeapi Parece que no puedo encontrar una operación que sea específicamente posterior a la guarda. 'update' parece que debería funcionar, excepto por los resultados que estoy enfrentando. Gracias – ford

Cuestiones relacionadas