¿Qué gancho puedo usar para las acciones posteriores al guardado?

16

He encontrado varias publicaciones con esta misma pregunta, pero las respuestas siempre difieren de algún otro tema o no funcionan para mis necesidades.

Después de guardar un nodo, quiero que mi módulo personalizado inserte una fila en una de mis tablas personalizadas que contiene el nid del nuevo nodo. Cuando hook_node_submitse llama, el nid aún no existe. hook_node_inserttiene el nid, pero solo se llama la primera vez que se guarda el nodo, pero potencialmente necesito tomar medidas cada vez que se guarda el nodo.

Mi plan es separar mi funcionalidad en su propio método e implementar ambos ganchos, pero estoy tratando de aprender a hacer las cosas correctamente con Drupal, por lo que me pregunto si hay un gancho que realmente se ajuste a mis requisitos.

¿Hay un gancho que se llama cada vez que se guarda un nodo y se llama DESPUÉS de que se completa el guardado?

Kenny Wyland
fuente
3
puede usar la combinación de hook_node_inserty hook_node_update(actúa cada vez que se guarda un nodo).
AjitS
Sí, lo describí en la publicación anterior.
Kenny Wyland
@KennyWyland que mencionaste hook_node_submitpero no hook_node_update?
David Thomas
Obtendrá el nid de nodo hook_node_inserttanto como dentro hook_node_update.
Sumit Madan
2
hook_node_insert()y hook_node_update()son los ganchos correctos para esto, hook_node_submit()se llama durante el proceso de envío del formulario antes de que se guarde el nodo. No olvide que necesita borrar cachés cada vez que agrega / elimina un gancho
Clive

Respuestas:

5

Mirando los comentarios sobre la pregunta, parece que la solución obvia es usar los ganchos hook_node_insert()y hook_node_update().

En realidad, acabo de hacer algo muy similar a lo descrito en la respuesta: escribí una función que hace lo que quiero que se haga cada vez que se crea / actualiza un nodo y luego lo llamo desde cada uno de esos ganchos. Funciona bien

rosquilla
fuente
¡Eso es genial! Incluso podrías hacer esto desde hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx
1
@leymannx La desventaja de ese método es que solo se llamaría cuando se inserta / actualiza un nodo a través de un formulario específico. En mi caso, necesitaba capturar todas las adiciones y modificaciones de los nodos.
donut
12

La forma correcta de hacerlo es respetar la transacción db de Drupal. Si desea realizar alguna acción de base de datos en hook_node_insert, debe considerar que el nodo aún no se ha guardado. lo que significa que si falla y retrocede, terminas con datos huérfanos en tu base de datos. Por lo tanto, se debe utilizar la API de la base de datos Drupal y no la ejecución directa de consultas.

Si desea actualizar el nodo en sí mismo en hook_node_insert, no puede porque no es posible usar node_save ya que el nodo aún no está guardado en la base de datos y llamarlo causa una excepción. Una solución es usar la función register_shutdown_function y pasar nid, puede usar node_load para asegurarse de que realmente se guarde y luego realizar cualquier otra acción que desee en el nuevo nodo.

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);
  }
} 

ACTUALIZACIÓN: También puede encontrar una alternativa más fácil aquí /programming//a/24035797/1726778

Sina Salek
fuente
1
Buena idea. Aunque es mejor usarlo drupal_register_shutdown_function(). Pero tenga en cuenta que ambos parecen tener problemas en el entorno php-fpm, consulte drupal.stackexchange.com/q/102603/10667
Shevchuk
Estaba teniendo problemas para la comprobación de si un nodo estaba actuando como un grupo orgánico og_is_group. Creo que estaba recibiendo falsos negativos por este motivo.
icicleking
5

Hay un nuevo módulo de drupal, Hook Post Action , que agrega los ganchos para guardar la publicación. Probémoslo para ver si funciona.

Druvision
fuente