Mercurial > defr > drupal > core
diff includes/path.inc @ 1:c1f4ac30525a 6.0
Drupal 6.0
author | Franck Deroche <webmaster@defr.org> |
---|---|
date | Tue, 23 Dec 2008 14:28:28 +0100 |
parents | |
children | 8b6c45761e01 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/includes/path.inc Tue Dec 23 14:28:28 2008 +0100 @@ -0,0 +1,242 @@ +<?php +// $Id: path.inc,v 1.19 2007/11/04 16:42:45 goba Exp $ + +/** + * @file + * Functions to handle paths in Drupal, including path aliasing. + * + * These functions are not loaded for cached pages, but modules that need + * to use them in hook_init() or hook exit() can make them available, by + * executing "drupal_bootstrap(DRUPAL_BOOTSTRAP_PATH);". + */ + +/** + * Initialize the $_GET['q'] variable to the proper normal path. + */ +function drupal_init_path() { + if (!empty($_GET['q'])) { + $_GET['q'] = drupal_get_normal_path(trim($_GET['q'], '/')); + } + else { + $_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage', 'node')); + } +} + +/** + * Given an alias, return its Drupal system URL if one exists. Given a Drupal + * system URL return one of its aliases if such a one exists. Otherwise, + * return FALSE. + * + * @param $action + * One of the following values: + * - wipe: delete the alias cache. + * - alias: return an alias for a given Drupal system path (if one exists). + * - source: return the Drupal system URL for a path alias (if one exists). + * @param $path + * The path to investigate for corresponding aliases or system URLs. + * @param $path_language + * Optional language code to search the path with. Defaults to the page language. + * If there's no path defined for that language it will search paths without + * language. + * + * @return + * Either a Drupal system path, an aliased path, or FALSE if no path was + * found. + */ +function drupal_lookup_path($action, $path = '', $path_language = '') { + global $language; + // $map is an array with language keys, holding arrays of Drupal paths to alias relations + static $map = array(), $no_src = array(), $count; + + $path_language = $path_language ? $path_language : $language->language; + + // Use $count to avoid looking up paths in subsequent calls if there simply are no aliases + if (!isset($count)) { + $count = db_result(db_query('SELECT COUNT(pid) FROM {url_alias}')); + } + + if ($action == 'wipe') { + $map = array(); + $no_src = array(); + } + elseif ($count > 0 && $path != '') { + if ($action == 'alias') { + if (isset($map[$path_language][$path])) { + return $map[$path_language][$path]; + } + // Get the most fitting result falling back with alias without language + $alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s' AND language IN('%s', '') ORDER BY language DESC", $path, $path_language)); + $map[$path_language][$path] = $alias; + return $alias; + } + // Check $no_src for this $path in case we've already determined that there + // isn't a path that has this alias + elseif ($action == 'source' && !isset($no_src[$path_language][$path])) { + // Look for the value $path within the cached $map + $src = ''; + if (!isset($map[$path_language]) || !($src = array_search($path, $map[$path_language]))) { + // Get the most fitting result falling back with alias without language + if ($src = db_result(db_query("SELECT src FROM {url_alias} WHERE dst = '%s' AND language IN('%s', '') ORDER BY language DESC", $path, $path_language))) { + $map[$path_language][$src] = $path; + } + else { + // We can't record anything into $map because we do not have a valid + // index and there is no need because we have not learned anything + // about any Drupal path. Thus cache to $no_src. + $no_src[$path_language][$path] = TRUE; + } + } + return $src; + } + } + + return FALSE; +} + +/** + * Given an internal Drupal path, return the alias set by the administrator. + * + * @param $path + * An internal Drupal path. + * @param $path_language + * 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, $path_language = '') { + $result = $path; + if ($alias = drupal_lookup_path('alias', $path, $path_language)) { + $result = $alias; + } + return $result; +} + +/** + * Given a path alias, return the internal path it represents. + * + * @param $path + * A Drupal path alias. + * @param $path_language + * 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, $path_language = '') { + $result = $path; + if ($src = drupal_lookup_path('source', $path, $path_language)) { + $result = $src; + } + if (function_exists('custom_url_rewrite_inbound')) { + // Modules may alter the inbound request path by reference. + custom_url_rewrite_inbound($result, $path, $path_language); + } + return $result; +} + +/** + * Return a component of the current Drupal path. + * + * When viewing a page at the path "admin/content/types", for example, arg(0) + * would return "admin", arg(1) would return "content", and arg(2) would return + * "types". + * + * Avoid use of this function where possible, as resulting code is hard to read. + * Instead, attempt to use named arguments in menu callback functions. See the + * explanation in menu.inc for how to construct callbacks that take arguments. + * + * @param $index + * The index of the component, where each component is separated by a '/' + * (forward-slash), and where the first component has an index of 0 (zero). + * + * @return + * The component specified by $index, or NULL if the specified component was + * not found. + */ +function arg($index = NULL, $path = NULL) { + static $arguments; + + if (!isset($path)) { + $path = $_GET['q']; + } + if (!isset($arguments[$path])) { + $arguments[$path] = explode('/', $path); + } + if (!isset($index)) { + return $arguments[$path]; + } + if (isset($arguments[$path][$index])) { + return $arguments[$path][$index]; + } +} + +/** + * Get the title of the current page, for display on the page and in the title bar. + * + * @return + * The current page's title. + */ +function drupal_get_title() { + $title = drupal_set_title(); + + // during a bootstrap, menu.inc is not included and thus we cannot provide a title + if (!isset($title) && function_exists('menu_get_active_title')) { + $title = check_plain(menu_get_active_title()); + } + + return $title; +} + +/** + * Set the title of the current page, for display on the page and in the title bar. + * + * @param $title + * Optional string value to assign to the page title; or if set to NULL + * (default), leaves the current title unchanged. + * + * @return + * The updated title of the current page. + */ +function drupal_set_title($title = NULL) { + static $stored_title; + + if (isset($title)) { + $stored_title = $title; + } + return $stored_title; +} + +/** + * Check if the current page is the front page. + * + * @return + * Boolean value: TRUE if the current page is the front page; FALSE if otherwise. + */ +function drupal_is_front_page() { + // As drupal_init_path updates $_GET['q'] with the 'site_frontpage' path, + // we can check it against the 'site_frontpage' variable. + return $_GET['q'] == drupal_get_normal_path(variable_get('site_frontpage', 'node')); +} + +/** + * Check if a path matches any pattern in a set of patterns. + * + * @param $path + * The path to match. + * @param $patterns + * String containing a set of patterns separated by \n, \r or \r\n. + * + * @return + * Boolean value: TRUE if the path matches a pattern, FALSE otherwise. + */ +function drupal_match_path($path, $patterns) { + static $regexps; + + if (!isset($regexps[$patterns])) { + $regexps[$patterns] = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\<front\\\\>($|\|)/'), array('|', '.*', '\1'. preg_quote(variable_get('site_frontpage', 'node'), '/') .'\2'), preg_quote($patterns, '/')) .')$/'; + } + return preg_match($regexps[$patterns], $path); +}