diff options
Diffstat (limited to 'modules/node')
-rw-r--r-- | modules/node/node.admin.inc | 2 | ||||
-rw-r--r-- | modules/node/node.module | 8 | ||||
-rw-r--r-- | modules/node/node.test | 36 | ||||
-rw-r--r-- | modules/node/tests/node_test.module | 18 |
4 files changed, 61 insertions, 3 deletions
diff --git a/modules/node/node.admin.inc b/modules/node/node.admin.inc index 02891de93..a86ffb6ff 100644 --- a/modules/node/node.admin.inc +++ b/modules/node/node.admin.inc @@ -288,6 +288,8 @@ function node_mass_update($nodes, $updates) { */ function _node_mass_update_helper($nid, $updates) { $node = node_load($nid, NULL, TRUE); + // For efficiency manually save the original node before applying any changes. + $node->original = clone $node; foreach ($updates as $name => $value) { $node->$name = $value; } diff --git a/modules/node/node.module b/modules/node/node.module index 44a2274d1..d7cc85d83 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -1032,6 +1032,11 @@ function node_save($node) { $transaction = db_transaction(); try { + // Load the stored entity, if any. + if (!empty($node->nid) && !isset($node->original)) { + $node->original = entity_load_unchanged('node', $node->nid); + } + field_attach_presave('node', $node); global $user; @@ -1135,6 +1140,9 @@ function node_save($node) { // Clear internal properties. unset($node->is_new); + unset($node->original); + // Clear the static loading cache. + entity_get_controller('node')->resetCache(array($node->nid)); // Ignore slave server temporarily to give time for the // saved node to be propagated to the slave. diff --git a/modules/node/node.test b/modules/node/node.test index 27abb4f4a..c0b6096c2 100644 --- a/modules/node/node.test +++ b/modules/node/node.test @@ -1041,14 +1041,14 @@ class NodeSaveTestCase extends DrupalWebTestCase { $changed = $node->changed; node_save($node); - $node = $this->drupalGetNodeByTitle($edit['title']); + $node = $this->drupalGetNodeByTitle($edit['title'], TRUE); $this->assertEqual($node->created, $created, t('Updating a node preserves "created" timestamp.')); // Programmatically set the timestamps using hook_node_presave. $node->title = 'testing_node_presave'; node_save($node); - $node = $this->drupalGetNodeByTitle('testing_node_presave'); + $node = $this->drupalGetNodeByTitle('testing_node_presave', TRUE); $this->assertEqual($node->created, 280299600, t('Saving a node uses "created" timestamp set in presave hook.')); $this->assertEqual($node->changed, 979534800, t('Saving a node uses "changed" timestamp set in presave hook.')); @@ -1071,10 +1071,40 @@ class NodeSaveTestCase extends DrupalWebTestCase { $node->changed = 280299600; node_save($node); - $node = $this->drupalGetNodeByTitle($edit['title']); + $node = $this->drupalGetNodeByTitle($edit['title'], TRUE); $this->assertEqual($node->created, 979534800, t('Updating a node uses user-set "created" timestamp.')); $this->assertNotEqual($node->changed, 280299600, t('Updating a node doesn\'t use user-set "changed" timestamp.')); } + + /** + * Tests determing changes in hook_node_presave() and verifies the static node + * load cache is cleared upon save. + */ + function testDeterminingChanges() { + // Initial creation. + $node = (object) array( + 'uid' => $this->web_user->uid, + 'type' => 'article', + 'title' => 'test_changes', + ); + node_save($node); + + // Update the node without applying changes. + node_save($node); + $this->assertEqual($node->title, 'test_changes', 'No changes have been determined.'); + + // Apply changes. + $node->title = 'updated'; + node_save($node); + + // The hook implementations node_test_node_presave() and + // node_test_node_update() determine changes and change the title. + $this->assertEqual($node->title, 'updated_presave_update', 'Changes have been determined.'); + + // Test the static node load cache to be cleared. + $node = node_load($node->nid); + $this->assertEqual($node->title, 'updated_presave', 'Static cache has been cleared.'); + } } /** diff --git a/modules/node/tests/node_test.module b/modules/node/tests/node_test.module index c32bc1ec0..821f48ca1 100644 --- a/modules/node/tests/node_test.module +++ b/modules/node/tests/node_test.module @@ -131,4 +131,22 @@ function node_test_node_presave($node) { // Drupal 1.0 release. $node->changed = 979534800; } + // Determine changes. + if (!empty($node->original) && $node->original->title == 'test_changes') { + if ($node->original->title != $node->title) { + $node->title .= '_presave'; + } + } +} + +/** + * Implements hook_node_update(). + */ +function node_test_node_update($node) { + // Determine changes on update. + if (!empty($node->original) && $node->original->title == 'test_changes') { + if ($node->original->title != $node->title) { + $node->title .= '_update'; + } + } } |