Post-save callback?

23,564

Solution 1

The hook has not been removed but splitted up into separate hooks for each $op.

See: http://api.drupal.org/api/search/7/hook_node

For post-save, you want hook_node_insert() and hook_node_update()

Solution 2

Currently Drupal core does not offer any hook to do actions after a node/entity is inserted/updated/deleted in Database. For example, you can not send an email mentioning the node after the node is inserted because Drupal uses SQL transactions and the node is not yet fully written to database when hook node presave is called so if for any reason the transaction is rolled back, users will receive a false mail.

So Hook Post Action module introduces several new Drupal hooks to overcome this limitation:

  • hook_entity_postsave
  • hook_entity_postinsert
  • hook_entity_postupdate
  • hook_entity_postdelete
  • hook_node_postsave
  • hook_node_postinsert
  • hook_node_postupdate
  • hook_node_postdelete

https://drupal.org/project/hook_post_action

Solution 3

I suppose hook_entity_presave could be the hook you're looking for, if you want to act before your node is updated :

Act on an entity before it is about to be created or updated.


Or, if you prefer acting after it's updated, take a look at hook_entity_update :

Act on entities when updated.

Solution 4

Just to complete this a bit more and if you need to perform any operation after the node has been saved/updated you can use the module @sina-salek has recommended you or you can use this code:

// Same for hook_node_save!
function my_module_node_update($node) {
  if ($node->type == 'content_type_name') {
    // Invoke your callback function AFTER the node is updated.
    drupal_register_shutdown_function('_my_module_the_function_to_call', $node);
  }
}


function _my_module_the_function_to_call($node) {
  // do stuff...
}

By using the drupal_register_shutdown_function you are making sure to call your custom function when the hook has finished and the node has been persisted on the DB.

Share:
23,564

Related videos on Youtube

Moon
Author by

Moon

Updated on October 04, 2020

Comments

  • Moon
    Moon over 3 years

    How do I execute a function every time a node is being updated? I tried to use hook_nodeapi, but it looks like that the hook is removed from Drupal 7.

    What I want to do is,

    1. add a new field to my content type called 'main image (bool)' to let the admin set a main image.
    2. I am going to use Views module to display nodes, but order nodes by 'main image' field and added date.
    3. so that the first node is always the main image.

    to do this, I need to make sure that there is always only one node with 'main image' set to true.

  • Jorrit Schippers
    Jorrit Schippers over 11 years
    The node isn't completely saved at that moment, because the transaction isn't committed yet.
  • Christian
    Christian over 10 years
    As Jorrit said, this isn't correct as the transaction is still open.
  • Nadeem Ahmed
    Nadeem Ahmed almost 10 years
    The node is completely saved from the perspective of the executed code, queries over the DB will work as expected and find the node data because they will be executed inside the transaction. This definition of 'completely saved' fits the OP use-case.
  • Felix Eve
    Felix Eve almost 10 years
    Thanks - this looks useful. I wanted to rebuild my sitemap.xml after nodes are added, deleted or updated so this looks perfect for my needs. I've installed it and all seems to be working perfectly too :)
  • Ignacio Segura
    Ignacio Segura over 5 years
    This is the smallest and most simple solution.
  • Leonardo Montenegro
    Leonardo Montenegro almost 2 years
    I tried using it in our project. Initially, it worked, but after some time we noticed some memory leaks being supposedly caused by it. Not sure if it's something in our D7 application though.

Related