diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/forum/forum.module | 19 | ||||
-rw-r--r-- | modules/forum/forum.test | 2 | ||||
-rw-r--r-- | modules/locale/locale.module | 38 | ||||
-rw-r--r-- | modules/path/path.admin.inc | 5 | ||||
-rw-r--r-- | modules/simpletest/tests/path.test | 109 | ||||
-rw-r--r-- | modules/simpletest/tests/url_alter_test.info | 9 | ||||
-rw-r--r-- | modules/simpletest/tests/url_alter_test.install | 13 | ||||
-rw-r--r-- | modules/simpletest/tests/url_alter_test.module | 43 | ||||
-rw-r--r-- | modules/statistics/statistics.module | 2 | ||||
-rw-r--r-- | modules/system/system.api.php | 56 | ||||
-rw-r--r-- | modules/taxonomy/taxonomy.module | 19 | ||||
-rw-r--r-- | modules/taxonomy/taxonomy.pages.inc | 2 | ||||
-rw-r--r-- | modules/taxonomy/taxonomy.tokens.inc | 2 |
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': |