Moon
Moon

Reputation: 22565

Post-save callback?

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.

Upvotes: 12

Views: 26627

Answers (5)

bpile
bpile

Reputation: 380

Another way this can be achieved is by extending the Node entity with your custom class and calling your code inside the Node::postSave method. This method will get called when node gets saved or updated.

You specify your custom extended class by implementing hook called hook_entity_type_build and provide your new class, e.g.: $entity_types['node']->setClass(NodeExtended::class)

Inside your class you than override postSave method. I usually just dispatch my custom event here so other modules can subscribe to this node post save event, but that's another topic.

Upvotes: 1

Sina Salek
Sina Salek

Reputation: 323

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

Upvotes: 16

Salvador P.
Salvador P.

Reputation: 1489

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.

Upvotes: 7

Berdir
Berdir

Reputation: 6891

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()

Upvotes: 11

Pascal MARTIN
Pascal MARTIN

Reputation: 400932

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.

Upvotes: 7

Related Questions