diff --git a/core/includes/common.inc b/core/includes/common.inc index 689d136..9008849 100644 --- a/core/includes/common.inc +++ b/core/includes/common.inc @@ -2176,7 +2176,7 @@ function url($path = NULL, array $options = array()) { } elseif (!empty($path) && !$options['alias']) { $langcode = isset($options['language']) && isset($options['language']->langcode) ? $options['language']->langcode : ''; - $alias = drupal_get_path_alias($original_path, $langcode); + $alias = drupal_container()->get('path_registry')->getPathAlias($original_path, $langcode); if ($alias != $original_path) { $path = $alias; } @@ -2499,7 +2499,7 @@ function drupal_deliver_html_page($page_callback_result) { $_GET['destination'] = current_path(); } - $path = drupal_get_normal_path($site_config->get('page.404')); + $path = drupal_container()->get('path_registry')->getSystemPath($site_config->get('page.404')); if ($path && $path != current_path()) { // Custom 404 handler. Set the active item in case there are tabs to // display, or other dependencies on the path. @@ -2528,7 +2528,7 @@ function drupal_deliver_html_page($page_callback_result) { $_GET['destination'] = current_path(); } - $path = drupal_get_normal_path($site_config->get('page.403')); + $path = drupal_container()->get('path_registry')->getSystemPath($site_config->get('page.403')); if ($path && $path != current_path()) { // Custom 403 handler. Set the active item in case there are tabs to // display or other dependencies on the path. @@ -5123,9 +5123,6 @@ function _drupal_bootstrap_full($skip = FALSE) { // current_path(). drupal_language_initialize(); - // Initialize current_path() prior to invoking hook_init(). - drupal_path_initialize(); - // Let all modules take action before the menu system handles the request. // We do not want this while running update.php. if (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update') { diff --git a/core/includes/menu.inc b/core/includes/menu.inc index 581a6ce..91ee47d 100644 --- a/core/includes/menu.inc +++ b/core/includes/menu.inc @@ -2992,7 +2992,7 @@ function _menu_delete_item($item, $force = FALSE) { * @param $item * An associative array representing a menu link item, with elements: * - link_path: (required) The path of the menu item, which should be - * normalized first by calling drupal_get_normal_path() on it. + * normalized first by calling drupal_container()->get('path_registry')->getSystemPath() on it. * - link_title: (required) Title to appear in menu for the link. * - menu_name: (optional) The machine name of the menu for the link. * Defaults to 'navigation'. diff --git a/core/includes/path.inc b/core/includes/path.inc index 62a58a6..2c6ae57 100644 --- a/core/includes/path.inc +++ b/core/includes/path.inc @@ -1,5 +1,7 @@ get('page.front'); - _current_path($path); - } - - // Normalize the path. - _current_path(drupal_get_normal_path($path)); -} /** * Given an alias, return its Drupal system URL if one exists. Given a Drupal @@ -133,7 +115,7 @@ function drupal_lookup_path($action, $path = '', $langcode = NULL) { if (isset($cache['map'][$langcode][$path])) { return $cache['map'][$langcode][$path]; } - // Check the path whitelist, if the top_level part before the first / + // Check the path whitelist, if the top-level part before the first / // is not in the list, then there is no need to do anything further, // it is not in the database. elseif (!isset($cache['whitelist'][strtok($path, '/')])) { @@ -226,64 +208,6 @@ function drupal_cache_system_paths() { } /** - * Given an internal Drupal path, return the alias set by the administrator. - * - * If no path is provided, the function will return the alias of the current - * page. - * - * @param $path - * An internal Drupal path. - * @param $langcode - * An optional language code to look up the path in. - * - * @return - * An aliased path if one was found, or the original path if no alias was - * found. - */ -function drupal_get_path_alias($path = NULL, $langcode = NULL) { - // If no path is specified, use the current page's path. - if ($path == NULL) { - $path = current_path(); - } - $result = $path; - if ($alias = drupal_lookup_path('alias', $path, $langcode)) { - $result = $alias; - } - return $result; -} - -/** - * Given a path alias, return the internal path it represents. - * - * @param $path - * A Drupal path alias. - * @param $langcode - * An optional language code to look up the path in. - * - * @return - * The internal path represented by the alias, or the original alias if no - * internal path was found. - */ -function drupal_get_normal_path($path, $langcode = NULL) { - $original_path = $path; - - // Lookup the path alias first. - if ($source = drupal_lookup_path('source', $path, $langcode)) { - $path = $source; - } - - // Allow other modules to alter the inbound URL. We cannot use drupal_alter() - // here because we need to run hook_url_inbound_alter() in the reverse order - // of hook_url_outbound_alter(). - foreach (array_reverse(module_implements('url_inbound_alter')) as $module) { - $function = $module . '_url_inbound_alter'; - $function($path, $original_path, $langcode); - } - - return $path; -} - -/** * Check if the current page is the front page. * * @return @@ -392,95 +316,6 @@ function drupal_path_alias_whitelist_rebuild($source = NULL) { } /** - * Fetch a specific URL alias from the database. - * - * @param $conditions - * A string representing the source, a number representing the pid, or an - * array of query conditions. - * - * @return - * FALSE if no alias was found or an associative array containing the - * following keys: - * - source: The internal system path. - * - alias: The URL alias. - * - pid: Unique path alias identifier. - * - langcode: The language code of the alias. - */ -function path_load($conditions) { - if (is_numeric($conditions)) { - $conditions = array('pid' => $conditions); - } - elseif (is_string($conditions)) { - $conditions = array('source' => $conditions); - } - elseif (!is_array($conditions)) { - return FALSE; - } - $select = db_select('url_alias'); - foreach ($conditions as $field => $value) { - $select->condition($field, $value); - } - return $select - ->fields('url_alias') - ->execute() - ->fetchAssoc(); -} - -/** - * Save a path alias to the database. - * - * @param $path - * An associative array containing the following keys: - * - source: The internal system path. - * - alias: The URL alias. - * - pid: (optional) Unique path alias identifier. - * - langcode: (optional) The language code of the alias. - */ -function path_save(&$path) { - $path += array('langcode' => LANGUAGE_NOT_SPECIFIED); - - // Load the stored alias, if any. - if (!empty($path['pid']) && !isset($path['original'])) { - $path['original'] = path_load($path['pid']); - } - - 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']); -} - -/** - * Delete a URL alias. - * - * @param $criteria - * A number representing the pid or an array of criteria. - */ -function path_delete($criteria) { - if (!is_array($criteria)) { - $criteria = array('pid' => $criteria); - } - $path = path_load($criteria); - $query = db_delete('url_alias'); - foreach ($criteria as $field => $value) { - $query->condition($field, $value); - } - $query->execute(); - module_invoke_all('path_delete', $path); - drupal_clear_path_cache($path['source']); -} - -/** * Determine whether a path is in the administrative section of the site. * * By default, paths are considered to be non-administrative. If a path does not @@ -580,14 +415,3 @@ function drupal_valid_path($path, $dynamic_allowed = FALSE) { return $item && $item['access']; } -/** - * Clear the path cache. - * - * @param $source - * An optional system path for which an alias is being changed. - */ -function drupal_clear_path_cache($source = NULL) { - // Clear the drupal_lookup_path() static cache. - drupal_static_reset('drupal_lookup_path'); - drupal_path_alias_whitelist_rebuild($source); -} diff --git a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php index 3dc0df5..45126b3 100644 --- a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php +++ b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php @@ -9,6 +9,7 @@ namespace Drupal\Core\DependencyInjection; use Symfony\Component\DependencyInjection\ContainerBuilder as BaseContainerBuilder; use Symfony\Component\DependencyInjection\Reference; +use Drupal\Core\Database\Database; /** @@ -50,5 +51,14 @@ class ContainerBuilder extends BaseContainerBuilder { // Register configuration object factory. $this->register('config.factory', 'Drupal\Core\Config\ConfigFactory') ->addArgument(new Reference('config.storage.dispatcher')); + + // We need a database connection to add to the path registry. + $this->register('database', 'Drupal\Core\Database\Connection') + ->setFactoryClass('Drupal\Core\Database\Database') + ->setFactoryMethod('getConnection') + ->addArgument('default'); + // Register the path registry for url alias lookups. + $this->register('path_registry', 'Drupal\Core\Path\PathRegistry') + ->addArgument(new Reference('database')); } } diff --git a/core/lib/Drupal/Core/EventSubscriber/PathSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/PathSubscriber.php index 2e1bece..9ee912f 100644 --- a/core/lib/Drupal/Core/EventSubscriber/PathSubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/PathSubscriber.php @@ -30,7 +30,7 @@ class PathSubscriber extends PathListenerBase implements EventSubscriberInterfac $path = $this->extractPath($request); - $path = drupal_get_normal_path($path); + $path = drupal_container()->get('path_registry')->getSystemPath($path); $this->setPath($request, $path); } diff --git a/core/lib/Drupal/Core/ExceptionController.php b/core/lib/Drupal/Core/ExceptionController.php index 9870cd4..525bbde 100644 --- a/core/lib/Drupal/Core/ExceptionController.php +++ b/core/lib/Drupal/Core/ExceptionController.php @@ -94,7 +94,7 @@ class ExceptionController { $system_path = $request->attributes->get('system_path'); watchdog('access denied', $system_path, NULL, WATCHDOG_WARNING); - $path = drupal_get_normal_path(config('system.site')->get('page.403')); + $path = drupal_container()->get('path_registry')->getSystemPath(config('system.site')->get('page.403')); if ($path && $path != $system_path) { // Keep old path for reference, and to allow forms to redirect to it. if (!isset($_GET['destination'])) { @@ -160,7 +160,7 @@ class ExceptionController { $_GET['destination'] = $system_path; } - $path = drupal_get_normal_path(config('system.site')->get('page.404')); + $path = drupal_container()->get('path_registry')->getSystemPath(config('system.site')->get('page.404')); if ($path && $path != $system_path) { // @todo Um, how do I specify an override URL again? Totally not clear. Do // that and sub-call the kernel rather than using meah(). diff --git a/core/lib/Drupal/Core/Path/PathRegistry.php b/core/lib/Drupal/Core/Path/PathRegistry.php new file mode 100644 index 0000000..4ea15dc --- /dev/null +++ b/core/lib/Drupal/Core/Path/PathRegistry.php @@ -0,0 +1,118 @@ +connection = $connection; + } + + public function save($source, $alias, $langcode = LANGUAGE_NOT_SPECIFIED, $pid = NULL) { + + $fields = array( + 'source' => $source, + 'alias' => $alias, + 'langcode' => $langcode, + ); + + // Insert or update the alias. + if (empty($pid)) { + $query = $this->connection->insert('url_alias', array('return' => Database::RETURN_INSERT_ID)) + ->fields($fields); + } + else { + $fields['pid'] = $pid; + $query = $this->connection->update('url_alias') + ->fields($fields) + ->condition('pid', $pid); + } + if ($pid = $query->execute()) { + $fields['pid'] = $pid; + $this->cacheClear($source); + return $fields; + } + return FALSE; + } + + public function load($conditions) { + if (is_numeric($conditions)) { + $conditions = array('pid' => $conditions); + } + elseif (is_string($conditions)) { + $conditions = array('source' => $conditions); + } + elseif (!is_array($conditions)) { + return FALSE; + } + $select = $this->connection->select('url_alias'); + foreach ($conditions as $field => $value) { + $select->condition($field, $value); + } + return $select + ->fields('url_alias') + ->execute() + ->fetchAssoc(); + } + + public function delete($conditions) { + if (!is_array($conditions)) { + $conditions = array('pid' => $conditions); + } + $path = $this->load($conditions); + $query = $this->connection->delete('url_alias'); + foreach ($conditions as $field => $value) { + $query->condition($field, $value); + } + $deleted = $query->execute(); + $this->cacheClear($path['source']); + // TODO: figure out where we can invoke hook_path_delete() + return $deleted; + } + + public function getSystemPath($path, $path_language = NULL) { + $original_path = $path; + + // Lookup the path alias first. + if ($source = drupal_lookup_path('source', $path, $path_language)) { + $path = $source; + } + + // Allow other modules to alter the inbound URL. We cannot use drupal_alter() + // here because we need to run hook_url_inbound_alter() in the reverse order + // of hook_url_outbound_alter(). + foreach (array_reverse(module_implements('url_inbound_alter')) as $module) { + $function = $module . '_url_inbound_alter'; + $function($path, $original_path, $path_language); + } + + return $path; + } + + public function getPathAlias($path = NULL, $path_language = NULL) { + // If no path is specified, use the current page's path. + if ($path === NULL) { + $path = _current_path(); + } + $result = $path; + if ($alias = drupal_lookup_path('alias', $path, $path_language)) { + $result = $alias; + } + return $result; + } + + public function cacheClear($source = NULL) { + drupal_static_reset('drupal_lookup_path'); + drupal_path_alias_whitelist_rebuild($source); + } +} + diff --git a/core/lib/Drupal/Core/Path/PathRegistryInterface.php b/core/lib/Drupal/Core/Path/PathRegistryInterface.php new file mode 100644 index 0000000..251849b --- /dev/null +++ b/core/lib/Drupal/Core/Path/PathRegistryInterface.php @@ -0,0 +1,88 @@ +visibility < BLOCK_VISIBILITY_PHP) { // Compare the lowercase path alias (if any) and internal path. $path = current_path(); - $path_alias = drupal_strtolower(drupal_get_path_alias($path)); + $path_alias = drupal_strtolower(drupal_container()->get('path_registry')->getPathAlias($path)); $page_match = drupal_match_path($path_alias, $pages) || (($path != $path_alias) && drupal_match_path($path, $pages)); // When $block->visibility has a value of 0 (BLOCK_VISIBILITY_NOTLISTED), // the block is displayed on all pages except those listed in $block->pages. diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php index 5476a7a..9ed5f75 100644 --- a/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php +++ b/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php @@ -96,38 +96,23 @@ class LocalePathTest extends WebTestBase { $custom_path = $this->randomName(8); // Check priority of language for alias by source path. - $edit = array( - 'source' => 'node/' . $node->nid, - 'alias' => $custom_path, - 'langcode' => LANGUAGE_NOT_SPECIFIED, - ); - path_save($edit); - $lookup_path = drupal_lookup_path('alias', 'node/' . $node->nid, 'en'); + drupal_container()->get('path_registry')->save('node/' . $node->nid, $custom_path, LANGUAGE_NOT_SPECIFIED); + $lookup_path = drupal_container()->get('path_registry')->getPathAlias('node/' . $node->nid, 'en'); $this->assertEqual($english_path, $lookup_path, t('English language alias has priority.')); // Same check for language 'xx'. - $lookup_path = drupal_lookup_path('alias', 'node/' . $node->nid, $prefix); + $lookup_path = drupal_container()->get('path_registry')->getPathAlias('node/' . $node->nid, $prefix); $this->assertEqual($custom_language_path, $lookup_path, t('Custom language alias has priority.')); - path_delete($edit); + drupal_container()->get('path_registry')->delete(array('source' => 'node/' . $node->nid, 'alias' => $custom_path, 'langcode' => LANGUAGE_NOT_SPECIFIED)); // Create language nodes to check priority of aliases. $first_node = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1)); $second_node = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1)); // Assign a custom path alias to the first node with the English language. - $edit = array( - 'source' => 'node/' . $first_node->nid, - 'alias' => $custom_path, - 'langcode' => 'en', - ); - path_save($edit); + drupal_container()->get('path_registry')->save('node/' . $first_node->nid, $custom_path, 'en'); // Assign a custom path alias to second node with LANGUAGE_NOT_SPECIFIED. - $edit = array( - 'source' => 'node/' . $second_node->nid, - 'alias' => $custom_path, - 'langcode' => LANGUAGE_NOT_SPECIFIED, - ); - path_save($edit); + drupal_container()->get('path_registry')->save('node/' . $second_node->nid, $custom_path, LANGUAGE_NOT_SPECIFIED); // Test that both node titles link to our path alias. $this->drupalGet(''); diff --git a/core/modules/menu/menu.admin.inc b/core/modules/menu/menu.admin.inc index 496ff88..67213b9 100644 --- a/core/modules/menu/menu.admin.inc +++ b/core/modules/menu/menu.admin.inc @@ -369,7 +369,7 @@ function menu_edit_item($form, &$form_state, $type, $item, $menu) { */ function menu_edit_item_validate($form, &$form_state) { $item = &$form_state['values']; - $normal_path = drupal_get_normal_path($item['link_path']); + $normal_path = drupal_container()->get('path_registry')->getSystemPath($item['link_path']); if ($item['link_path'] != $normal_path) { drupal_set_message(t('The menu system stores system paths only, but will use the URL alias for display. %link_path has been stored as %normal_path', array('%link_path' => $item['link_path'], '%normal_path' => $normal_path))); $item['link_path'] = $normal_path; diff --git a/core/modules/path/lib/Drupal/path/Tests/PathAliasTest.php b/core/modules/path/lib/Drupal/path/Tests/PathAliasTest.php index af8b0c7..457230b 100644 --- a/core/modules/path/lib/Drupal/path/Tests/PathAliasTest.php +++ b/core/modules/path/lib/Drupal/path/Tests/PathAliasTest.php @@ -84,7 +84,7 @@ class PathAliasTest extends PathTestBase { $this->assertText($node1->title, 'Changed alias works.'); $this->assertResponse(200); - drupal_static_reset('drupal_lookup_path'); + drupal_container()->get('path_registry')->cacheClear(); // Confirm that previous alias no longer works. $this->drupalGet($previous); $this->assertNoText($node1->title, 'Previous alias no longer works.'); diff --git a/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php b/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php index b3dba0e..a297168 100644 --- a/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php +++ b/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php @@ -70,7 +70,7 @@ class PathLanguageTest extends PathTestBase { $this->drupalPost(NULL, $edit, t('Save')); // Clear the path lookup cache. - drupal_lookup_path('wipe'); + drupal_container()->get('path_registry')->cacheClear(); // Ensure the node was created. $french_node = $this->drupalGetNodeByTitle($edit["title"]); @@ -109,7 +109,7 @@ class PathLanguageTest extends PathTestBase { // We need to ensure that the user language preference is not taken into // account while determining the path alias language, because if this // happens we have no way to check that the path alias is valid: there is no - // path alias for French matching the english alias. So drupal_lookup_path() + // path alias for French matching the english alias. So DrupalPathRegistry // needs to use the URL language to check whether the alias is valid. $this->drupalGet($english_alias); $this->assertText($english_node->title, 'Alias for English translation works.'); @@ -133,20 +133,20 @@ class PathLanguageTest extends PathTestBase { $this->drupalGet($french_alias); $this->assertResponse(404, t('Alias for French translation is unavailable when URL language negotiation is disabled.')); - // drupal_lookup_path() has an internal static cache. Check to see that + // DrupalPathRegistry has an internal static cache. Check to see that // it has the appropriate contents at this point. - drupal_lookup_path('wipe'); - $french_node_path = drupal_lookup_path('source', $french_alias, $french_node->langcode); + drupal_container()->get('path_registry')->cacheClear(); + $french_node_path = drupal_container()->get('path_registry')->getSystemPath($french_alias, $french_node->langcode); $this->assertEqual($french_node_path, 'node/' . $french_node->nid, t('Normal path works.')); // Second call should return the same path. - $french_node_path = drupal_lookup_path('source', $french_alias, $french_node->langcode); + $french_node_path = drupal_container()->get('path_registry')->getSystemPath($french_alias, $french_node->langcode); $this->assertEqual($french_node_path, 'node/' . $french_node->nid, t('Normal path is the same.')); // Confirm that the alias works. - $french_node_alias = drupal_lookup_path('alias', 'node/' . $french_node->nid, $french_node->langcode); + $french_node_alias = drupal_container()->get('path_registry')->getPathAlias('node/' . $french_node->nid, $french_node->langcode); $this->assertEqual($french_node_alias, $french_alias, t('Alias works.')); // Second call should return the same alias. - $french_node_alias = drupal_lookup_path('alias', 'node/' . $french_node->nid, $french_node->langcode); + $french_node_alias = drupal_container()->get('path_registry')->getPathAlias('node/' . $french_node->nid, $french_node->langcode); $this->assertEqual($french_node_alias, $french_alias, t('Alias is the same.')); } } diff --git a/core/modules/path/path.admin.inc b/core/modules/path/path.admin.inc index 4188eff..b32542e 100644 --- a/core/modules/path/path.admin.inc +++ b/core/modules/path/path.admin.inc @@ -76,7 +76,7 @@ function path_admin_overview($keys = NULL) { // If the system path maps to a different URL alias, highlight this table // row to let the user know of old aliases. - if ($data->alias != drupal_get_path_alias($data->source, $data->langcode)) { + if ($data->alias != drupal_container()->get('path_registry')->getPathAlias($data->source, $data->langcode)) { $row['class'] = array('warning'); } @@ -218,7 +218,7 @@ function path_admin_form_delete_submit($form, &$form_state) { */ function path_admin_form_validate($form, &$form_state) { $source = &$form_state['values']['source']; - $source = drupal_get_normal_path($source); + $source = drupal_container()->get('path_registry')->getSystemPath($source); $alias = $form_state['values']['alias']; $pid = isset($form_state['values']['pid']) ? $form_state['values']['pid'] : 0; // Language is only set if language.module is enabled, otherwise save for all @@ -250,7 +250,18 @@ function path_admin_form_submit($form, &$form_state) { // Remove unnecessary values. form_state_values_clean($form_state); - path_save($form_state['values']); + $pid = isset($form_state['values']['pid']) ? $form_state['values']['pid'] : 0; + $source = &$form_state['values']['source']; + $source = drupal_container()->get('path_registry')->getSystemPath($source); + $alias = $form_state['values']['alias']; + // Language is only set if language.module is enabled, otherwise save for all + // languages. + $langcode = isset($form_state['values']['langcode']) ? $form_state['values']['langcode'] : LANGUAGE_NOT_SPECIFIED; + + $op = $pid ? 'update' : 'insert'; + if ($path = drupal_container()->get('path_registry')->save($source, $alias, $langcode, $pid)) { + module_invoke_all('path_' . $op, $path); + } drupal_set_message(t('The alias has been saved.')); $form_state['redirect'] = 'admin/config/search/path'; @@ -282,7 +293,7 @@ function path_admin_delete_confirm($form, &$form_state, $path) { */ function path_admin_delete_confirm_submit($form, &$form_state) { if ($form_state['values']['confirm']) { - path_delete($form_state['path']['pid']); + drupal_container()->get('path_registry')->delete($form_state['path']['pid']); $form_state['redirect'] = 'admin/config/search/path'; } } diff --git a/core/modules/path/path.api.php b/core/modules/path/path.api.php index f2c5ece..09901aa 100644 --- a/core/modules/path/path.api.php +++ b/core/modules/path/path.api.php @@ -20,7 +20,7 @@ * - pid: Unique path alias identifier. * - langcode: The language code of the alias. * - * @see path_save() + * @see DrupalPathRegistry::save() */ function hook_path_insert($path) { db_insert('mytable') @@ -41,7 +41,7 @@ function hook_path_insert($path) { * - pid: Unique path alias identifier. * - langcode: The language code of the alias. * - * @see path_save() + * @see DrupalPathRegistry::save() */ function hook_path_update($path) { db_update('mytable') @@ -60,7 +60,7 @@ function hook_path_update($path) { * - pid: Unique path alias identifier. * - langcode: The language code of the alias. * - * @see path_delete() + * @see DrupalPathRegistry::delete() */ function hook_path_delete($path) { db_delete('mytable') diff --git a/core/modules/path/path.module b/core/modules/path/path.module index d01c623..cc1e906 100644 --- a/core/modules/path/path.module +++ b/core/modules/path/path.module @@ -105,7 +105,7 @@ function path_form_node_form_alter(&$form, $form_state) { if ($form['#node']->langcode != LANGUAGE_NOT_SPECIFIED) { $conditions['langcode'] = $form['#node']->langcode; } - $path = path_load($conditions); + $path = drupal_container()->get('path_registry')->load($conditions); if ($path === FALSE) { $path = array(); } @@ -190,14 +190,15 @@ function path_form_element_validate($element, &$form_state, $complete_form) { */ function path_node_insert(Node $node) { if (isset($node->path)) { - $path = $node->path; - $path['alias'] = trim($path['alias']); + $alias = trim($node->path['alias']); // Only save a non-empty alias. - if (!empty($path['alias'])) { + if (!empty($alias)) { // Ensure fields for programmatic executions. - $path['source'] = 'node/' . $node->nid; - $path['langcode'] = isset($node->langcode) ? $node->langcode : LANGUAGE_NOT_SPECIFIED; - path_save($path); + $source = 'node/' . $node->nid; + $langcode = isset($node->langcode) ? $node->langcode : LANGUAGE_NOT_SPECIFIED; + if ($path = drupal_container()->get('path_registry')->save($source, $alias, $langcode)) { + module_invoke_all('path_insert', $path); + } } } } @@ -208,17 +209,19 @@ function path_node_insert(Node $node) { function path_node_update(Node $node) { if (isset($node->path)) { $path = $node->path; - $path['alias'] = trim($path['alias']); + $alias = trim($path['alias']); // Delete old alias if user erased it. if (!empty($path['pid']) && empty($path['alias'])) { - path_delete($path['pid']); + drupal_container()->get('path_registry')->delete($path['pid']); } // Only save a non-empty alias. if (!empty($path['alias'])) { // Ensure fields for programmatic executions. - $path['source'] = 'node/' . $node->nid; - $path['langcode'] = isset($node->langcode) ? $node->langcode : LANGUAGE_NOT_SPECIFIED; - path_save($path); + $source = 'node/' . $node->nid; + $langcode = isset($node->langcode) ? $node->langcode : LANGUAGE_NOT_SPECIFIED; + if ($path = drupal_container()->get('path_registry')->save($source, $alias, $langcode, $path['pid'])) { + module_invoke_all('path_update', $path); + } } } } @@ -228,7 +231,7 @@ function path_node_update(Node $node) { */ function path_node_predelete(Node $node) { // Delete all aliases associated with this node. - path_delete(array('source' => 'node/' . $node->nid)); + drupal_container()->get('path_registry')->delete(array('source' => 'node/' . $node->nid)); } /** @@ -237,7 +240,7 @@ function path_node_predelete(Node $node) { function path_form_taxonomy_form_term_alter(&$form, $form_state) { // Make sure this does not show up on the delete confirmation form. if (empty($form_state['confirm_delete'])) { - $path = (isset($form['#term']['tid']) ? path_load('taxonomy/term/' . $form['#term']['tid']) : array()); + $path = (isset($form['#term']['tid']) ? drupal_container()->get('path_registry')->load('taxonomy/term/' . $form['#term']['tid']) : array()); if ($path === FALSE) { $path = array(); } @@ -278,7 +281,7 @@ function path_taxonomy_term_insert(Term $term) { // Ensure fields for programmatic executions. $path['source'] = 'taxonomy/term/' . $term->tid; $path['langcode'] = LANGUAGE_NOT_SPECIFIED; - path_save($path); + drupal_container()->get('path_registry')->save($path); } } } @@ -292,14 +295,14 @@ function path_taxonomy_term_update(Term $term) { $path['alias'] = trim($path['alias']); // Delete old alias if user erased it. if (!empty($path['pid']) && empty($path['alias'])) { - path_delete($path['pid']); + drupal_container()->get('path_registry')->delete($path['pid']); } // Only save a non-empty alias. if (!empty($path['alias'])) { // Ensure fields for programmatic executions. $path['source'] = 'taxonomy/term/' . $term->tid; $path['langcode'] = LANGUAGE_NOT_SPECIFIED; - path_save($path); + drupal_container()->get('path_registry')->save($path); } } } @@ -309,5 +312,5 @@ function path_taxonomy_term_update(Term $term) { */ function path_taxonomy_term_delete(Term $term) { // Delete all aliases associated with this term. - path_delete(array('source' => 'taxonomy/term/' . $term->tid)); + drupal_container()->get('path_registry')->delete(array('source' => 'taxonomy/term/' . $term->tid)); } diff --git a/core/modules/search/search.module b/core/modules/search/search.module index f567dae..f903daa 100644 --- a/core/modules/search/search.module +++ b/core/modules/search/search.module @@ -640,7 +640,7 @@ function search_index($sid, $module, $text) { if ($tagname == 'a') { // Check if link points to a node on this site if (preg_match($node_regexp, $value, $match)) { - $path = drupal_get_normal_path($match[1]); + $path = drupal_container()->get('path_registry')->getSystemPath($match[1]); if (preg_match('!(?:node|book)/(?:view/)?([0-9]+)!i', $path, $match)) { $linknid = $match[1]; if ($linknid > 0) { diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Tests/ShortcutLinksTest.php b/core/modules/shortcut/lib/Drupal/shortcut/Tests/ShortcutLinksTest.php index 278b1e0..e1c1959 100644 --- a/core/modules/shortcut/lib/Drupal/shortcut/Tests/ShortcutLinksTest.php +++ b/core/modules/shortcut/lib/Drupal/shortcut/Tests/ShortcutLinksTest.php @@ -27,18 +27,15 @@ class ShortcutLinksTest extends ShortcutTestBase { $set = $this->set; // Create an alias for the node so we can test aliases. - $path = array( - 'source' => 'node/' . $this->node->nid, - 'alias' => $this->randomName(8), - ); - path_save($path); + $alias = $this->randomName(8); + drupal_container()->get('path_registry')->save('node/' . $this->node->nid, $alias); // Create some paths to test. $test_cases = array( array('path' => 'admin'), array('path' => 'admin/config/system/site-information'), array('path' => "node/{$this->node->nid}/edit"), - array('path' => $path['alias']), + array('path' => $alias), ); // Check that each new shortcut links where it should. @@ -52,7 +49,7 @@ class ShortcutLinksTest extends ShortcutTestBase { $this->assertResponse(200); $saved_set = shortcut_set_load($set->set_name); $paths = $this->getShortcutInformation($saved_set, 'link_path'); - $this->assertTrue(in_array(drupal_get_normal_path($test['path']), $paths), 'Shortcut created: '. $test['path']); + $this->assertTrue(in_array(drupal_container()->get('path_registry')->getSystemPath($test['path']), $paths), 'Shortcut created: '. $test['path']); $this->assertLink($title, 0, 'Shortcut link found on the page.'); } } diff --git a/core/modules/shortcut/shortcut.admin.inc b/core/modules/shortcut/shortcut.admin.inc index 9f1888a..2d43aea 100644 --- a/core/modules/shortcut/shortcut.admin.inc +++ b/core/modules/shortcut/shortcut.admin.inc @@ -473,7 +473,7 @@ function _shortcut_link_form_elements($shortcut_link = NULL) { ); } else { - $shortcut_link['link_path'] = drupal_get_path_alias($shortcut_link['link_path']); + $shortcut_link['link_path'] = drupal_container()->get('path_registry')->getPathAlias($shortcut_link['link_path']); } $form['shortcut_link']['#tree'] = TRUE; @@ -520,7 +520,7 @@ function shortcut_link_edit_validate($form, &$form_state) { */ function shortcut_link_edit_submit($form, &$form_state) { // Normalize the path in case it is an alias. - $form_state['values']['shortcut_link']['link_path'] = drupal_get_normal_path($form_state['values']['shortcut_link']['link_path']); + $form_state['values']['shortcut_link']['link_path'] = drupal_container()->get('path_registry')->getSystemPath($form_state['values']['shortcut_link']['link_path']); $shortcut_link = array_merge($form_state['values']['original_shortcut_link'], $form_state['values']['shortcut_link']); @@ -576,7 +576,7 @@ function shortcut_admin_add_link($shortcut_link, &$shortcut_set, $limit = NULL) } // Normalize the path in case it is an alias. - $shortcut_link['link_path'] = drupal_get_normal_path($shortcut_link['link_path']); + $shortcut_link['link_path'] = drupal_container()->get('path_registry')->getSystemPath($shortcut_link['link_path']); // Add the link to the end of the list. $shortcut_set->links[] = $shortcut_link; diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module index be29dce..83c37e9 100644 --- a/core/modules/shortcut/shortcut.module +++ b/core/modules/shortcut/shortcut.module @@ -613,7 +613,7 @@ function shortcut_set_title_exists($title) { */ function shortcut_valid_link($path) { // Do not use URL aliases. - $normal_path = drupal_get_normal_path($path); + $normal_path = drupal_container()->get('path_registry')->getSystemPath($path); if ($path != $normal_path) { $path = $normal_path; } diff --git a/core/modules/statistics/statistics.module b/core/modules/statistics/statistics.module index ef1bceb..25bb4eb 100644 --- a/core/modules/statistics/statistics.module +++ b/core/modules/statistics/statistics.module @@ -386,7 +386,7 @@ function statistics_block_view($delta = '') { * A string as a link, truncated to the width, linked to the given $path. */ function _statistics_link($path, $width = 35) { - $title = drupal_get_path_alias($path); + $title = drupal_container()->get('path_registry')->getPathAlias($path); $title = truncate_utf8($title, $width, FALSE, TRUE); return l($title, $path); } diff --git a/core/modules/system/lib/Drupal/system/Tests/Path/LookupTest.php b/core/modules/system/lib/Drupal/system/Tests/Path/LookupTest.php index a90b5f4..fdc08b4 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Path/LookupTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Path/LookupTest.php @@ -10,19 +10,19 @@ namespace Drupal\system\Tests\Path; use Drupal\simpletest\WebTestBase; /** - * Unit test for drupal_lookup_path(). + * Tests for DrupalPathRegistry. */ class LookupTest extends WebTestBase { public static function getInfo() { return array( 'name' => t('Path lookup'), - 'description' => t('Tests that drupal_lookup_path() returns correct paths.'), + 'description' => t('Tests that DrupalPathRegistry returns correct paths.'), 'group' => t('Path API'), ); } /** - * Test that drupal_lookup_path() returns the correct path. + * Test that DrupalPathRegistry returns the correct path. */ function testDrupalLookupPath() { $account = $this->drupalCreateUser(); @@ -35,9 +35,9 @@ class LookupTest extends WebTestBase { 'source' => "user/$uid", 'alias' => 'foo', ); - path_save($path); - $this->assertEqual(drupal_lookup_path('alias', $path['source']), $path['alias'], t('Basic alias lookup works.')); - $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], t('Basic source lookup works.')); + drupal_container()->get('path_registry')->save($path['source'], $path['alias']); + $this->assertEqual(drupal_container()->get('path_registry')->getPathAlias($path['source']), $path['alias'], t('Basic alias lookup works.')); + $this->assertEqual(drupal_container()->get('path_registry')->getSystemPath($path['alias']), $path['source'], t('Basic source lookup works.')); // Create a language specific alias for the default language (English). $path = array( @@ -45,56 +45,38 @@ class LookupTest extends WebTestBase { 'alias' => "users/$name", 'langcode' => 'en', ); - path_save($path); - $this->assertEqual(drupal_lookup_path('alias', $path['source']), $path['alias'], t('English alias overrides language-neutral alias.')); - $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], t('English source overrides language-neutral source.')); + drupal_container()->get('path_registry')->save($path['source'], $path['alias'], $path['langcode']); + $this->assertEqual(drupal_container()->get('path_registry')->getPathAlias($path['source']), $path['alias'], t('English alias overrides language-neutral alias.')); + $this->assertEqual(drupal_container()->get('path_registry')->getSystemPath($path['alias']), $path['source'], t('English source overrides language-neutral source.')); // Create a language-neutral alias for the same path, again. - $path = array( - 'source' => "user/$uid", - 'alias' => 'bar', - ); - path_save($path); - $this->assertEqual(drupal_lookup_path('alias', $path['source']), "users/$name", t('English alias still returned after entering a language-neutral alias.')); + drupal_container()->get('path_registry')->save("user/$uid", 'bar'); + $this->assertEqual(drupal_container()->get('path_registry')->getPathAlias("user/$uid"), "users/$name", t('English alias still returned after entering a language-neutral alias.')); // Create a language-specific (xx-lolspeak) alias for the same path. - $path = array( - 'source' => "user/$uid", - 'alias' => 'LOL', - 'langcode' => 'xx-lolspeak', - ); - path_save($path); - $this->assertEqual(drupal_lookup_path('alias', $path['source']), "users/$name", t('English alias still returned after entering a LOLspeak alias.')); + drupal_container()->get('path_registry')->save("user/$uid", 'LOL', 'xx-lolspeak'); + $this->assertEqual(drupal_container()->get('path_registry')->getPathAlias("user/$uid"), "users/$name", t('English alias still returned after entering a LOLspeak alias.')); // The LOLspeak alias should be returned if we really want LOLspeak. - $this->assertEqual(drupal_lookup_path('alias', $path['source'], 'xx-lolspeak'), 'LOL', t('LOLspeak alias returned if we specify xx-lolspeak to drupal_lookup_path().')); + $this->assertEqual(drupal_container()->get('path_registry')->getPathAlias("user/$uid", 'xx-lolspeak'), 'LOL', t('LOLspeak alias returned if we specify xx-lolspeak to DrupalPathRegistry.')); // Create a new alias for this path in English, which should override the // previous alias for "user/$uid". - $path = array( - 'source' => "user/$uid", - 'alias' => 'users/my-new-path', - 'langcode' => 'en', - ); - path_save($path); - $this->assertEqual(drupal_lookup_path('alias', $path['source']), $path['alias'], t('Recently created English alias returned.')); - $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], t('Recently created English source returned.')); + drupal_container()->get('path_registry')->save("user/$uid", 'users/my-new-path', 'en'); + $this->assertEqual(drupal_container()->get('path_registry')->getPathAlias("user/$uid"), 'users/my-new-path', t('Recently created English alias returned.')); + $this->assertEqual(drupal_container()->get('path_registry')->getSystemPath('users/my-new-path'), "user/$uid", t('Recently created English source returned.')); // Remove the English aliases, which should cause a fallback to the most // recently created language-neutral alias, 'bar'. db_delete('url_alias') ->condition('langcode', 'en') ->execute(); - drupal_clear_path_cache(); - $this->assertEqual(drupal_lookup_path('alias', $path['source']), 'bar', t('Path lookup falls back to recently created language-neutral alias.')); + drupal_container()->get('path_registry')->cacheClear(); + $this->assertEqual(drupal_container()->get('path_registry')->getPathAlias($path['source']), 'bar', t('Path lookup falls back to recently created language-neutral alias.')); // Test the situation where the alias and language are the same, but // the source differs. The newer alias record should be returned. $account2 = $this->drupalCreateUser(); - $path = array( - 'source' => 'user/' . $account2->uid, - 'alias' => 'bar', - ); - path_save($path); - $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], t('Newer alias record is returned when comparing two LANGUAGE_NOT_SPECIFIED paths with the same alias.')); + drupal_container()->get('path_registry')->save('user/' . $account2->uid, 'bar'); + $this->assertEqual(drupal_lookup_path('source', 'bar'), 'user/' . $account2->uid, t('Newer alias record is returned when comparing two LANGUAGE_NOT_SPECIFIED paths with the same alias.')); } } diff --git a/core/modules/system/lib/Drupal/system/Tests/Path/SaveTest.php b/core/modules/system/lib/Drupal/system/Tests/Path/SaveTest.php index a34b384..9654d8d 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Path/SaveTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Path/SaveTest.php @@ -10,13 +10,13 @@ namespace Drupal\system\Tests\Path; use Drupal\simpletest\WebTestBase; /** - * Tests the path_save() function. + * Tests the drupal_container()->get('path_registry')->save() function. */ class SaveTest extends WebTestBase { public static function getInfo() { return array( 'name' => t('Path save'), - 'description' => t('Tests that path_save() exposes the previous alias value.'), + 'description' => t('Tests that the save() method of PathRegistry exposes the previous alias value.'), 'group' => t('Path API'), ); } @@ -28,7 +28,7 @@ class SaveTest extends WebTestBase { } /** - * Tests that path_save() makes the original path available to modules. + * Tests that drupal_container()->get('path_registry')->save() makes the original path available to modules. */ function testDrupalSaveOriginalPath() { $account = $this->drupalCreateUser(); @@ -41,11 +41,11 @@ class SaveTest extends WebTestBase { 'alias' => 'foo', ); $path_original = $path; - path_save($path); + drupal_container()->get('path_registry')->save($path['source'], $path['alias']); // Alter the path. $path['alias'] = 'bar'; - path_save($path); + drupal_container()->get('path_registry')->save($path['source'], $path['alias']); // Test to see if the original alias is available to modules during // hook_path_update(). diff --git a/core/modules/system/lib/Drupal/system/Tests/Path/UrlAlterFunctionalTest.php b/core/modules/system/lib/Drupal/system/Tests/Path/UrlAlterFunctionalTest.php index 9188b02..c83d643 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Path/UrlAlterFunctionalTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Path/UrlAlterFunctionalTest.php @@ -40,8 +40,7 @@ class UrlAlterFunctionalTest extends WebTestBase { $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); + drupal_container()->get('path_registry')->save("user/$uid/test1", 'alias/test1'); $this->assertUrlInboundAlter('alias/test1', "user/$uid/test1"); $this->assertUrlOutboundAlter("user/$uid/test1", 'alias/test1'); @@ -114,7 +113,7 @@ class UrlAlterFunctionalTest extends WebTestBase { * * @param $original * A string with the aliased or un-normal path that is run through - * drupal_get_normal_path(). + * drupal_container()->get('path_registry')->getSystemPath(). * @param $final * A string with the expected result after url(). * @return @@ -122,7 +121,7 @@ class UrlAlterFunctionalTest extends WebTestBase { */ protected function assertUrlInboundAlter($original, $final) { // Test inbound altering. - $result = drupal_get_normal_path($original); + $result = drupal_container()->get('path_registry')->getSystemPath($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/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc index f64447e..00a7ade 100644 --- a/core/modules/system/system.admin.inc +++ b/core/modules/system/system.admin.inc @@ -1499,10 +1499,11 @@ function system_site_information_settings($form, &$form_state) { '#type' => 'fieldset', '#title' => t('Front page'), ); + $front_page = $site_config->get('page.front') != 'user' ? drupal_container()->get('path_registry')->getPathAlias($site_config->get('page.front')) : ''; $form['front_page']['site_frontpage'] = array( '#type' => 'textfield', '#title' => t('Default front page'), - '#default_value' => ($site_config->get('page.front') != 'user' ? drupal_get_path_alias($site_config->get('page.front')) : ''), + '#default_value' => $front_page, '#size' => 40, '#description' => t('Optionally, specify a relative URL to display as the front page. Leave blank to display the default content feed.'), '#field_prefix' => url(NULL, array('absolute' => TRUE)), @@ -1544,7 +1545,7 @@ function system_site_information_settings_validate($form, &$form_state) { } else { // Get the normal path of the front page. - form_set_value($form['front_page']['site_frontpage'], drupal_get_normal_path($form_state['values']['site_frontpage']), $form_state); + form_set_value($form['front_page']['site_frontpage'], drupal_container()->get('path_registry')->getSystemPath($form_state['values']['site_frontpage']), $form_state); } // Validate front page path. if (!drupal_valid_path($form_state['values']['site_frontpage'])) { @@ -1552,10 +1553,10 @@ function system_site_information_settings_validate($form, &$form_state) { } // Get the normal paths of both error pages. if (!empty($form_state['values']['site_403'])) { - form_set_value($form['error_page']['site_403'], drupal_get_normal_path($form_state['values']['site_403']), $form_state); + form_set_value($form['error_page']['site_403'], drupal_container()->get('path_registry')->getSystemPath($form_state['values']['site_403']), $form_state); } if (!empty($form_state['values']['site_404'])) { - form_set_value($form['error_page']['site_404'], drupal_get_normal_path($form_state['values']['site_404']), $form_state); + form_set_value($form['error_page']['site_404'], drupal_container()->get('path_registry')->getSystemPath($form_state['values']['site_404']), $form_state); } // Validate 403 error path. if (!empty($form_state['values']['site_403']) && !drupal_valid_path($form_state['values']['site_403'])) { diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php index 12428fe..78aba1f 100644 --- a/core/modules/system/system.api.php +++ b/core/modules/system/system.api.php @@ -3718,7 +3718,7 @@ function hook_system_themes_page_alter(&$theme_groups) { * @param $path_language * The language of the path. * - * @see drupal_get_normal_path() + * @see DrupalPathRegistry::getSystemPath() */ function hook_url_inbound_alter(&$path, $original_path, $path_language) { // Create the path user/me/edit, which allows a user to edit their account. diff --git a/core/scripts/generate-d7-content.sh b/core/scripts/generate-d7-content.sh index 7f03846..c769323 100644 --- a/core/scripts/generate-d7-content.sh +++ b/core/scripts/generate-d7-content.sh @@ -253,7 +253,7 @@ for ($i = 0; $i < 12; $i++) { 'alias' => "content/poll/$i/results", 'source' => "node/$node->nid/results", ); - path_save($path); + drupal_container()->get('path_registry')->save($path); // Add some votes $node = node_load($node->nid);