summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/forum/forum.module19
-rw-r--r--modules/forum/forum.test2
-rw-r--r--modules/locale/locale.module38
-rw-r--r--modules/path/path.admin.inc5
-rw-r--r--modules/simpletest/tests/path.test109
-rw-r--r--modules/simpletest/tests/url_alter_test.info9
-rw-r--r--modules/simpletest/tests/url_alter_test.install13
-rw-r--r--modules/simpletest/tests/url_alter_test.module43
-rw-r--r--modules/statistics/statistics.module2
-rw-r--r--modules/system/system.api.php56
-rw-r--r--modules/taxonomy/taxonomy.module19
-rw-r--r--modules/taxonomy/taxonomy.pages.inc2
-rw-r--r--modules/taxonomy/taxonomy.tokens.inc2
13 files changed, 285 insertions, 34 deletions
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index 72653dfe5..7ecd00e4c 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -115,12 +115,6 @@ function forum_menu() {
'parent' => 'admin/structure/forum',
'file' => 'forum.admin.inc',
);
- $items['admin/structure/forum/edit/%taxonomy_term'] = array(
- 'page callback' => 'forum_form_main',
- 'access arguments' => array('administer forums'),
- 'type' => MENU_CALLBACK,
- 'file' => 'forum.admin.inc',
- );
$items['admin/structure/forum/edit/container/%taxonomy_term'] = array(
'title' => 'Edit container',
'page callback' => 'forum_form_main',
@@ -610,7 +604,7 @@ function forum_block_view_pre_render($elements) {
*/
function forum_form($node, $form_state) {
$type = node_type_get_type($node);
-
+
if (!empty($node->nid)) {
$forum_terms = $node->taxonomy_forums;
// If editing, give option to leave shadows
@@ -626,10 +620,15 @@ function forum_form($node, $form_state) {
}
/**
- * Implement hook_term_path().
+ * Implement hook_url_outbound_alter().
*/
-function forum_term_path($term) {
- return 'forum/' . $term->tid;
+function forum_url_outbound_alter(&$path, &$options, $original_path) {
+ if (preg_match('!^taxonomy/term/(\d+)!', $path, $matches)) {
+ $term = taxonomy_term_load($matches[1]);
+ if ($term && $term->vocabulary_machine_name == 'forums') {
+ $path = 'forum/' . $matches[1];
+ }
+ }
}
/**
diff --git a/modules/forum/forum.test b/modules/forum/forum.test
index 5bf8501cc..8a4e6ed14 100644
--- a/modules/forum/forum.test
+++ b/modules/forum/forum.test
@@ -211,7 +211,7 @@ class ForumTestCase extends DrupalWebTestCase {
function deleteForum($tid) {
// Delete the forum.
$this->drupalPost('admin/structure/forum/edit/forum/' . $tid, array(), t('Delete'));
- $this->drupalPost(NULL, NULL, t('Delete'));
+ $this->drupalPost(NULL, array(), t('Delete'));
// Assert that the forum no longer exists.
$this->drupalGet('forum/' . $tid);
diff --git a/modules/locale/locale.module b/modules/locale/locale.module
index 45cd6523a..e35fe9ca9 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -1067,3 +1067,41 @@ function locale_date_format_reset_form_submit($form, &$form_state) {
$form_state['redirect'] = 'admin/config/regional/date-time/locale';
}
+/**
+ * Implement hook_url_outbound_alter().
+ *
+ * Rewrite outbound URLs with language based prefixes.
+ */
+function locale_url_outbound_alter(&$path, &$options, $original_path) {
+ // Only modify internal URLs.
+ if (!$options['external']) {
+ static $callbacks;
+
+ if (!isset($callbacks)) {
+ $callbacks = array();
+ include_once DRUPAL_ROOT . '/includes/language.inc';
+
+ foreach (language_types_configurable() as $type) {
+ // Get url rewriter callbacks only from enabled language providers.
+ $negotiation = variable_get("language_negotiation_$type", array());
+
+ foreach ($negotiation as $id => $provider) {
+ if (isset($provider['file'])) {
+ require_once DRUPAL_ROOT . '/' . $provider['file'];
+ }
+
+ // Avoid duplicate callback entries.
+ if (isset($provider['callbacks']['url_rewrite'])) {
+ $callbacks[$provider['callbacks']['url_rewrite']] = NULL;
+ }
+ }
+ }
+
+ $callbacks = array_keys($callbacks);
+ }
+
+ foreach ($callbacks as $callback) {
+ $callback($path, $options);
+ }
+ }
+}
diff --git a/modules/path/path.admin.inc b/modules/path/path.admin.inc
index dd9e3e0ad..b1fd47c00 100644
--- a/modules/path/path.admin.inc
+++ b/modules/path/path.admin.inc
@@ -105,7 +105,7 @@ function path_admin_form($form, &$form_state, $path = array('source' => '', 'ali
'#default_value' => $path['source'],
'#maxlength' => 255,
'#size' => 45,
- '#description' => t('Specify the existing path you wish to alias. For example: node/28, forum/1, taxonomy/term/1+2.'),
+ '#description' => t('Specify the existing path you wish to alias. For example: node/28, forum/1, taxonomy/term/1.'),
'#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='),
'#required' => TRUE,
);
@@ -150,7 +150,8 @@ function path_admin_form($form, &$form_state, $path = array('source' => '', 'ali
* Verify that a URL alias is valid
*/
function path_admin_form_validate($form, &$form_state) {
- $source = $form_state['values']['source'];
+ $source = &$form_state['values']['source'];
+ $source = drupal_get_normal_path($source);
$alias = $form_state['values']['alias'];
$pid = isset($form_state['values']['pid']) ? $form_state['values']['pid'] : 0;
// Language is only set if locale module is enabled, otherwise save for all languages.
diff --git a/modules/simpletest/tests/path.test b/modules/simpletest/tests/path.test
index f76ea4089..519be543d 100644
--- a/modules/simpletest/tests/path.test
+++ b/modules/simpletest/tests/path.test
@@ -126,3 +126,112 @@ class DrupalMatchPathTestCase extends DrupalWebTestCase {
);
}
}
+
+/**
+ * Tests hook_url_alter functions.
+ */
+class UrlAlterFunctionalTest extends DrupalWebTestCase {
+ public static function getInfo() {
+ return array(
+ 'name' => t('URL altering'),
+ 'description' => t('Tests hook_url_inbound_alter() and hook_url_outbound_alter().'),
+ 'group' => t('Path API'),
+ );
+ }
+
+ function setUp() {
+ parent::setUp('path', 'forum', 'url_alter_test');
+ }
+
+ /**
+ * Test that URL altering works and that it occurs in the correct order.
+ */
+ function testUrlAlter() {
+ $account = $this->drupalCreateUser(array('administer url aliases'));
+ $this->drupalLogin($account);
+
+ $uid = $account->uid;
+ $name = $account->name;
+
+ // Test a single altered path.
+ $this->assertUrlInboundAlter("user/$name", "user/$uid");
+ $this->assertUrlOutboundAlter("user/$uid", "user/$name");
+
+ // Test that a path always uses its alias.
+ $path = array('source' => "user/$uid/test1", 'alias' => 'alias/test1');
+ path_save($path);
+ $this->assertUrlInboundAlter('alias/test1', "user/$uid/test1");
+ $this->assertUrlOutboundAlter("user/$uid/test1", 'alias/test1');
+
+ // Test that alias source paths are normalized in the interface.
+ $edit = array('source' => "user/$name/edit", 'alias' => 'alias/test2');
+ $this->drupalPost('admin/config/search/path/add', $edit, t('Create new alias'));
+ $this->assertText(t('The alias has been saved.'));
+
+ // Test that a path always uses its alias.
+ $this->assertUrlInboundAlter('alias/test2', "user/$uid/edit");
+ $this->assertUrlOutboundAlter("user/$uid/edit", 'alias/test2');
+
+ // Test a non-existant user is not altered.
+ $uid++;
+ $this->assertUrlInboundAlter("user/$uid", "user/$uid");
+ $this->assertUrlOutboundAlter("user/$uid", "user/$uid");
+
+ // Test that 'forum' is altered to 'community' correctly.
+ $this->assertUrlInboundAlter('community', 'forum');
+ $this->assertUrlOutboundAlter('forum', 'community');
+
+ // Add a forum to test url altering.
+ $forum_vid = db_query("SELECT vid FROM {taxonomy_vocabulary} WHERE module = 'forum'")->fetchField();
+ $tid = db_insert('taxonomy_term_data')
+ ->fields(array(
+ 'name' => $this->randomName(),
+ 'vid' => $forum_vid,
+ ))
+ ->execute();
+
+ // Test that a existing forum URL is altered.
+ $this->assertUrlInboundAlter("community/$tid", "forum/$tid");
+ $this->assertUrlOutboundAlter("taxonomy/term/$tid", "community/$tid");
+
+ // Test that a non-existant forum URL is not altered.
+ $tid++;
+ $this->assertUrlInboundAlter("taxonomy/term/$tid", "taxonomy/term/$tid");
+ $this->assertUrlOutboundAlter("taxonomy/term/$tid", "taxonomy/term/$tid");
+ }
+
+ /**
+ * Assert that an outbound path is altered to an expected value.
+ *
+ * @param $original
+ * A string with the original path that is run through url().
+ * @param $final
+ * A string with the expected result after url().
+ * @return
+ * TRUE if $original was correctly altered to $final, FALSE otherwise.
+ */
+ protected function assertUrlOutboundAlter($original, $final) {
+ // Test outbound altering.
+ $result = url($original);
+ $base_path = base_path() . (variable_get('clean_url', '0') ? '' : '?q=');
+ $result = substr($result, strlen($base_path));
+ $this->assertIdentical($result, $final, t('Altered outbound URL %original, expected %final, and got %result.', array('%original' => $original, '%final' => $final, '%result' => $result)));
+ }
+
+ /**
+ * Assert that a inbound path is altered to an expected value.
+ *
+ * @param $original
+ * A string with the aliased or un-normal path that is run through
+ * drupal_get_normal_path().
+ * @param $final
+ * A string with the expected result after url().
+ * @return
+ * TRUE if $original was correctly altered to $final, FALSE otherwise.
+ */
+ protected function assertUrlInboundAlter($original, $final) {
+ // Test inbound altering.
+ $result = drupal_get_normal_path($original);
+ $this->assertIdentical($result, $final, t('Altered inbound URL %original, expected %final, and got %result.', array('%original' => $original, '%final' => $final, '%result' => $result)));
+ }
+}
diff --git a/modules/simpletest/tests/url_alter_test.info b/modules/simpletest/tests/url_alter_test.info
new file mode 100644
index 000000000..7e72b4f1b
--- /dev/null
+++ b/modules/simpletest/tests/url_alter_test.info
@@ -0,0 +1,9 @@
+; $Id$
+name = Url_alter tests
+description = A support modules for url_alter hook testing.
+core = 7.x
+package = Testing
+version = VERSION
+files[] = url_alter_test.module
+files[] = url_alter_test.install
+hidden = TRUE
diff --git a/modules/simpletest/tests/url_alter_test.install b/modules/simpletest/tests/url_alter_test.install
new file mode 100644
index 000000000..89454f37e
--- /dev/null
+++ b/modules/simpletest/tests/url_alter_test.install
@@ -0,0 +1,13 @@
+<?php
+// $Id$
+
+/**
+ * Impelement hook_install().
+ */
+function url_alter_test_install() {
+ // Set the weight of this module to one higher than forum.module.
+ db_update('system')
+ ->fields(array('weight' => 2))
+ ->condition('name', 'url_alter_test')
+ ->execute();
+}
diff --git a/modules/simpletest/tests/url_alter_test.module b/modules/simpletest/tests/url_alter_test.module
new file mode 100644
index 000000000..a6841ae39
--- /dev/null
+++ b/modules/simpletest/tests/url_alter_test.module
@@ -0,0 +1,43 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Module to help test hook_url_inbound_alter() and hook_url_outbound_alter().
+ */
+
+/**
+ * Implement hook_url_inbound_alter().
+ */
+function url_alter_test_url_inbound_alter(&$path, $original_path, $path_language) {
+ // Rewrite user/username to user/uid.
+ if (preg_match('!^user/([^/]+)(/.*)?!', $path, $matches)) {
+ if ($account = user_load_by_name($matches[1])) {
+ $matches += array(2 => '');
+ $path = 'user/' . $account->uid . $matches[2];
+ }
+ }
+
+ // Rewrite community/ to forum/.
+ if ($path == 'community' || strpos($path, 'community/') === 0) {
+ $path = 'forum' . substr($path, 9);
+ }
+}
+
+/**
+ * Implement hook_url_outbound_alter().
+ */
+function url_alter_test_url_outbound_alter(&$path, &$options, $original_path) {
+ // Rewrite user/uid to user/username.
+ if (preg_match('!^user/([0-9]+)(/.*)?!', $path, $matches)) {
+ if ($account = user_load($matches[1])) {
+ $matches += array(2 => '');
+ $path = 'user/' . $account->name . $matches[2];
+ }
+ }
+
+ // Rewrite forum/ to community/.
+ if ($path == 'forum' || strpos($path, 'forum/') === 0) {
+ $path = 'community' . substr($path, 5);
+ }
+}
diff --git a/modules/statistics/statistics.module b/modules/statistics/statistics.module
index e8a5247a0..a8dd9ef38 100644
--- a/modules/statistics/statistics.module
+++ b/modules/statistics/statistics.module
@@ -45,7 +45,7 @@ function statistics_help($path, $arg) {
function statistics_exit() {
global $user;
- drupal_bootstrap(DRUPAL_BOOTSTRAP_PATH);
+ drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
if (variable_get('statistics_count_content_views', 0)) {
// We are counting content views.
diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index b379649a6..02c69ee36 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -2667,5 +2667,61 @@ function hook_page_delivery_callback_alter(&$callback) {
}
/**
+ * Alters inbound URL requests.
+ *
+ * @param $path
+ * The path being constructed, which, if a path alias, has been resolved to a
+ * Drupal path by the database, and which also may have been altered by other
+ * modules before this one.
+ * @param $original_path
+ * The original path, before being checked for path aliases or altered by any
+ * modules.
+ * @param $path_language
+ * The language of the path.
+ *
+ * @see drupal_get_normal_path()
+ */
+function hook_url_inbound_alter(&$path, $original_path, $path_language) {
+ // Create the path user/me/edit, which allows a user to edit their account.
+ if (preg_match('|^user/me/edit(/.*)?|', $path, $matches)) {
+ global $user;
+ $path = 'user/' . $user->uid . '/edit' . $matches[1];
+ }
+}
+
+/**
+ * Alters outbound URLs.
+ *
+ * @param $path
+ * The outbound path to alter, not adjusted for path aliases yet. It won't be
+ * adjusted for path aliases until all modules are finished altering it, thus
+ * being consistent with hook_url_alter_inbound(), which adjusts for all path
+ * aliases before allowing modules to alter it. This may have been altered by
+ * other modules before this one.
+ * @param $options
+ * A set of URL options for the URL so elements such as a fragment or a query
+ * string can be added to the URL.
+ * @param $original_path
+ * The original path, before being altered by any modules.
+ *
+ * @see url()
+ */
+function hook_url_outbound_alter(&$path, &$options, $original_path) {
+ // Use an external RSS feed rather than the Drupal one.
+ if ($path == 'rss.xml') {
+ $path = 'http://example.com/rss.xml';
+ $options['external'] = TRUE;
+ }
+
+ // Instead of pointing to user/[uid]/edit, point to user/me/edit.
+ if (preg_match('|^user/([0-9]*)/edit(/.*)?|', $path, $matches)) {
+ global $user;
+ if ($user->uid == $matches[1]) {
+ $path = 'user/me/edit' . $matches[2];
+ }
+ }
+}
+
+/**
* @} End of "addtogroup hooks".
*/
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index b04336fa0..613383a90 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -164,23 +164,6 @@ function taxonomy_theme() {
}
/**
- * For vocabularies not maintained by taxonomy.module, give the maintaining
- * module a chance to provide a path for terms in that vocabulary.
- *
- * @param $term
- * A term object.
- * @return
- * An internal Drupal path.
- */
-function taxonomy_term_path($term) {
- $vocabulary = taxonomy_vocabulary_load($term->vid);
- if ($vocabulary->module != 'taxonomy' && $path = module_invoke($vocabulary->module, 'term_path', $term)) {
- return $path;
- }
- return 'taxonomy/term/' . $term->tid;
-}
-
-/**
* Implement hook_menu().
*/
function taxonomy_menu() {
@@ -1103,7 +1086,7 @@ function taxonomy_field_formatter_info() {
function theme_field_formatter_taxonomy_term_link($variables) {
$term = $variables['element']['#item']['taxonomy_term'];
$attributes = empty($variables['link_options']) ? array() : $variables['link_options'];
- return l($term->name, taxonomy_term_path($term), $attributes);
+ return l($term->name, 'taxonomy/term/' . $term->tid, $attributes);
}
/**
diff --git a/modules/taxonomy/taxonomy.pages.inc b/modules/taxonomy/taxonomy.pages.inc
index eadbd9cf3..90ff994f0 100644
--- a/modules/taxonomy/taxonomy.pages.inc
+++ b/modules/taxonomy/taxonomy.pages.inc
@@ -22,7 +22,7 @@ function taxonomy_term_page($term) {
$breadcrumb = array();
while ($parents = taxonomy_get_parents($current->tid)) {
$current = array_shift($parents);
- $breadcrumb[] = l($current->name, taxonomy_term_path($current));
+ $breadcrumb[] = l($current->name, 'taxonomy/term/' . $current->tid);
}
$breadcrumb[] = l(t('Home'), NULL);
$breadcrumb = array_reverse($breadcrumb);
diff --git a/modules/taxonomy/taxonomy.tokens.inc b/modules/taxonomy/taxonomy.tokens.inc
index f2ee1aac9..c7d92ce46 100644
--- a/modules/taxonomy/taxonomy.tokens.inc
+++ b/modules/taxonomy/taxonomy.tokens.inc
@@ -119,7 +119,7 @@ function taxonomy_tokens($type, $tokens, array $data = array(), array $options =
break;
case 'url':
- $replacements[$original] = url(taxonomy_term_path($term), array('absolute' => TRUE));
+ $replacements[$original] = url('taxonomy/term/' . $term, array('absolute' => TRUE));
break;
case 'node-count':