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_submit
se llama, el nid aún no existe. hook_node_insert
tiene 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?
hook_node_insert
yhook_node_update
(actúa cada vez que se guarda un nodo).hook_node_submit
pero nohook_node_update
?hook_node_insert
tanto como dentrohook_node_update
.hook_node_insert()
yhook_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 ganchoRespuestas:
Mirando los comentarios sobre la pregunta, parece que la solución obvia es usar los ganchos
hook_node_insert()
yhook_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
fuente
hook_form_alter()
. drupal.stackexchange.com/a/221041/15055La 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.
ACTUALIZACIÓN: También puede encontrar una alternativa más fácil aquí /programming//a/24035797/1726778
fuente
drupal_register_shutdown_function()
. Pero tenga en cuenta que ambos parecen tener problemas en el entorno php-fpm, consulte drupal.stackexchange.com/q/102603/10667og_is_group
. Creo que estaba recibiendo falsos negativos por este motivo.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.
fuente