diff --git modules/node/node.api.php modules/node/node.api.php index 045234f..119b501 100644 --- modules/node/node.api.php +++ modules/node/node.api.php @@ -466,8 +466,11 @@ function hook_node_search_result($node) { * * @param $node * The node that is being inserted or updated. + * @param $node_unchanged + * The node object without the currently saved changes applied. May be NULL + * in case of an insert. */ -function hook_node_presave($node) { +function hook_node_presave($node, $node_unchanged = NULL) { if ($node->nid && $node->moderate) { // Reset votes when node is updated: $node->score = 0; @@ -485,8 +488,10 @@ function hook_node_presave($node) { * * @param $node * The node that is being updated. + * @param $node_unchanged + * The node object without the currently saved changes applied. */ -function hook_node_update($node) { +function hook_node_update($node, $node_unchanged) { db_update('mytable') ->fields(array('extra' => $node->extra)) ->condition('nid', $node->nid) @@ -934,8 +939,10 @@ function hook_load($nodes) { * * @param $node * The node that is being updated. + * @param $node_unchanged + * The node object without the currently saved changes applied. */ -function hook_update($node) { +function hook_update($node, $node_unchanged) { db_update('mytable') ->fields(array('extra' => $node->extra)) ->condition('nid', $node->nid) diff --git modules/node/node.module modules/node/node.module index b51f850..f10fa62 100644 --- modules/node/node.module +++ modules/node/node.module @@ -957,14 +957,16 @@ function node_save($node) { $transaction = db_transaction(); try { - field_attach_presave('node', $node); - // Let modules modify the node before it is saved to the database. - module_invoke_all('node_presave', $node); - global $user; - if (!isset($node->is_new)) { $node->is_new = empty($node->nid); } + // Keep a copy of the unchanged node so we can pass it to hooks later on. + $node_unchanged = $node->is_new ? NULL : clone node_load($node->nid); + + field_attach_presave('node', $node); + // Let modules modify the node before it is saved to the database. + module_invoke_all('node_presave', $node, $node_unchanged); + global $user; // Apply filters to some default node fields: if ($node->is_new) { @@ -1039,13 +1041,13 @@ function node_save($node) { // Call the node specific callback (if any). This can be // node_invoke($node, 'insert') or // node_invoke($node, 'update'). - node_invoke($node, $op); + node_invoke($node, $op, $node_unchanged); // Save fields. $function = "field_attach_$op"; $function('node', $node); - module_invoke_all('node_' . $op, $node); + module_invoke_all('node_' . $op, $node, $node_unchanged); // Update the node access table for this node. node_access_acquire_grants($node);