summaryrefslogtreecommitdiff
path: root/modules/node
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2010-11-30 19:31:47 +0000
committerDries Buytaert <dries@buytaert.net>2010-11-30 19:31:47 +0000
commit1fb5f62ba56bdbc6ff9f8a4045bccca8c5b9decd (patch)
tree2160f4d43f9da6385d200a04ee470c08b022c69e /modules/node
parent96b74a1594456dc1879df03222656e0dec815ad6 (diff)
downloadbrdo-1fb5f62ba56bdbc6ff9f8a4045bccca8c5b9decd.tar.gz
brdo-1fb5f62ba56bdbc6ff9f8a4045bccca8c5b9decd.tar.bz2
- Patch #651240 by fago, sun: allow modules to react to changes to an entity.
Diffstat (limited to 'modules/node')
-rw-r--r--modules/node/node.admin.inc2
-rw-r--r--modules/node/node.module8
-rw-r--r--modules/node/node.test36
-rw-r--r--modules/node/tests/node_test.module18
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';
+ }
+ }
}