summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/includes/path.inc30
-rw-r--r--core/modules/simpletest/tests/path.test46
-rw-r--r--core/modules/simpletest/tests/path_test.info6
-rw-r--r--core/modules/simpletest/tests/path_test.module22
4 files changed, 92 insertions, 12 deletions
diff --git a/core/includes/path.inc b/core/includes/path.inc
index 44bf3fe..b49d42b 100644
--- a/core/includes/path.inc
+++ b/core/includes/path.inc
@@ -431,21 +431,27 @@ function path_load($conditions) {
* - langcode: (optional) The language code of the alias.
*/
function path_save(&$path) {
- $path += array('pid' => NULL, 'langcode' => LANGUAGE_NONE);
+ $path += array('langcode' => LANGUAGE_NONE);
- // Insert or update the alias.
- $status = drupal_write_record('url_alias', $path, (!empty($path['pid']) ? 'pid' : array()));
+ // Load the stored alias, if any.
+ if (!empty($path['pid']) && !isset($path['original'])) {
+ $path['original'] = path_load($path['pid']);
+ }
- // Verify that a record was written.
- if ($status) {
- if ($status === SAVED_NEW) {
- module_invoke_all('path_insert', $path);
- }
- else {
- module_invoke_all('path_update', $path);
- }
- drupal_clear_path_cache($path['source']);
+ if (empty($path['pid'])) {
+ drupal_write_record('url_alias', $path);
+ module_invoke_all('path_insert', $path);
+ }
+ else {
+ drupal_write_record('url_alias', $path, array('pid'));
+ module_invoke_all('path_update', $path);
}
+
+ // Clear internal properties.
+ unset($path['original']);
+
+ // Clear the static alias cache.
+ drupal_clear_path_cache($path['source']);
}
/**
diff --git a/core/modules/simpletest/tests/path.test b/core/modules/simpletest/tests/path.test
index 18dab6b..308ef64 100644
--- a/core/modules/simpletest/tests/path.test
+++ b/core/modules/simpletest/tests/path.test
@@ -333,3 +333,49 @@ class PathLookupTest extends DrupalWebTestCase {
$this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], t('Newer alias record is returned when comparing two LANGUAGE_NONE paths with the same alias.'));
}
}
+
+/**
+ * Tests the path_save() function.
+ */
+class PathSaveTest extends DrupalWebTestCase {
+ public static function getInfo() {
+ return array(
+ 'name' => t('Path save'),
+ 'description' => t('Tests that path_save() exposes the previous alias value.'),
+ 'group' => t('Path API'),
+ );
+ }
+
+ function setUp() {
+ // Enable a helper module that implements hook_path_update().
+ parent::setUp('path_test');
+ path_test_reset();
+ }
+
+ /**
+ * Tests that path_save() makes the original path available to modules.
+ */
+ function testDrupalSaveOriginalPath() {
+ $account = $this->drupalCreateUser();
+ $uid = $account->uid;
+ $name = $account->name;
+
+ // Create a language-neutral alias.
+ $path = array(
+ 'source' => "user/$uid",
+ 'alias' => 'foo',
+ );
+ $path_original = $path;
+ path_save($path);
+
+ // Alter the path.
+ $path['alias'] = 'bar';
+ path_save($path);
+
+ // Test to see if the original alias is available to modules during
+ // hook_path_update().
+ $results = variable_get('path_test_results', array());
+ $this->assertIdentical($results['hook_path_update']['original']['alias'], $path_original['alias'], t('Old path alias available to modules during hook_path_update.'));
+ $this->assertIdentical($results['hook_path_update']['original']['source'], $path_original['source'], t('Old path alias available to modules during hook_path_update.'));
+ }
+}
diff --git a/core/modules/simpletest/tests/path_test.info b/core/modules/simpletest/tests/path_test.info
new file mode 100644
index 0000000..d2573a4
--- /dev/null
+++ b/core/modules/simpletest/tests/path_test.info
@@ -0,0 +1,6 @@
+name = "Hook path tests"
+description = "Support module for path hook testing."
+package = Testing
+version = VERSION
+core = 8.x
+hidden = TRUE
diff --git a/core/modules/simpletest/tests/path_test.module b/core/modules/simpletest/tests/path_test.module
new file mode 100644
index 0000000..0111675
--- /dev/null
+++ b/core/modules/simpletest/tests/path_test.module
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the path tests.
+ */
+
+/**
+ * Resets the path test results.
+ */
+function path_test_reset() {
+ variable_set('path_test_results', array());
+}
+
+/**
+ * Implements hook_path_update().
+ */
+function path_test_path_update($path) {
+ $results = variable_get('path_test_results', array());
+ $results['hook_path_update'] = $path;
+ variable_set('path_test_results', $results);
+}