Reputation: 22565
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,
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
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
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:
https://drupal.org/project/hook_post_action
Upvotes: 16
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
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
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