Mercurial > defr > drupal > core
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 0:5a113a1c4740 | 1:c1f4ac30525a |
|---|---|
| 1 <?php | |
| 2 // $Id: path.inc,v 1.19 2007/11/04 16:42:45 goba Exp $ | |
| 3 | |
| 4 /** | |
| 5 * @file | |
| 6 * Functions to handle paths in Drupal, including path aliasing. | |
| 7 * | |
| 8 * These functions are not loaded for cached pages, but modules that need | |
| 9 * to use them in hook_init() or hook exit() can make them available, by | |
| 10 * executing "drupal_bootstrap(DRUPAL_BOOTSTRAP_PATH);". | |
| 11 */ | |
| 12 | |
| 13 /** | |
| 14 * Initialize the $_GET['q'] variable to the proper normal path. | |
| 15 */ | |
| 16 function drupal_init_path() { | |
| 17 if (!empty($_GET['q'])) { | |
| 18 $_GET['q'] = drupal_get_normal_path(trim($_GET['q'], '/')); | |
| 19 } | |
| 20 else { | |
| 21 $_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage', 'node')); | |
| 22 } | |
| 23 } | |
| 24 | |
| 25 /** | |
| 26 * Given an alias, return its Drupal system URL if one exists. Given a Drupal | |
| 27 * system URL return one of its aliases if such a one exists. Otherwise, | |
| 28 * return FALSE. | |
| 29 * | |
| 30 * @param $action | |
| 31 * One of the following values: | |
| 32 * - wipe: delete the alias cache. | |
| 33 * - alias: return an alias for a given Drupal system path (if one exists). | |
| 34 * - source: return the Drupal system URL for a path alias (if one exists). | |
| 35 * @param $path | |
| 36 * The path to investigate for corresponding aliases or system URLs. | |
| 37 * @param $path_language | |
| 38 * Optional language code to search the path with. Defaults to the page language. | |
| 39 * If there's no path defined for that language it will search paths without | |
| 40 * language. | |
| 41 * | |
| 42 * @return | |
| 43 * Either a Drupal system path, an aliased path, or FALSE if no path was | |
| 44 * found. | |
| 45 */ | |
| 46 function drupal_lookup_path($action, $path = '', $path_language = '') { | |
| 47 global $language; | |
| 48 // $map is an array with language keys, holding arrays of Drupal paths to alias relations | |
| 49 static $map = array(), $no_src = array(), $count; | |
| 50 | |
| 51 $path_language = $path_language ? $path_language : $language->language; | |
| 52 | |
| 53 // Use $count to avoid looking up paths in subsequent calls if there simply are no aliases | |
| 54 if (!isset($count)) { | |
| 55 $count = db_result(db_query('SELECT COUNT(pid) FROM {url_alias}')); | |
| 56 } | |
| 57 | |
| 58 if ($action == 'wipe') { | |
| 59 $map = array(); | |
| 60 $no_src = array(); | |
| 61 } | |
| 62 elseif ($count > 0 && $path != '') { | |
| 63 if ($action == 'alias') { | |
| 64 if (isset($map[$path_language][$path])) { | |
| 65 return $map[$path_language][$path]; | |
| 66 } | |
| 67 // Get the most fitting result falling back with alias without language | |
| 68 $alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s' AND language IN('%s', '') ORDER BY language DESC", $path, $path_language)); | |
| 69 $map[$path_language][$path] = $alias; | |
| 70 return $alias; | |
| 71 } | |
| 72 // Check $no_src for this $path in case we've already determined that there | |
| 73 // isn't a path that has this alias | |
| 74 elseif ($action == 'source' && !isset($no_src[$path_language][$path])) { | |
| 75 // Look for the value $path within the cached $map | |
| 76 $src = ''; | |
| 77 if (!isset($map[$path_language]) || !($src = array_search($path, $map[$path_language]))) { | |
| 78 // Get the most fitting result falling back with alias without language | |
| 79 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))) { | |
| 80 $map[$path_language][$src] = $path; | |
| 81 } | |
| 82 else { | |
| 83 // We can't record anything into $map because we do not have a valid | |
| 84 // index and there is no need because we have not learned anything | |
| 85 // about any Drupal path. Thus cache to $no_src. | |
| 86 $no_src[$path_language][$path] = TRUE; | |
| 87 } | |
| 88 } | |
| 89 return $src; | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 return FALSE; | |
| 94 } | |
| 95 | |
| 96 /** | |
| 97 * Given an internal Drupal path, return the alias set by the administrator. | |
| 98 * | |
| 99 * @param $path | |
| 100 * An internal Drupal path. | |
| 101 * @param $path_language | |
| 102 * An optional language code to look up the path in. | |
| 103 * | |
| 104 * @return | |
| 105 * An aliased path if one was found, or the original path if no alias was | |
| 106 * found. | |
| 107 */ | |
| 108 function drupal_get_path_alias($path, $path_language = '') { | |
| 109 $result = $path; | |
| 110 if ($alias = drupal_lookup_path('alias', $path, $path_language)) { | |
| 111 $result = $alias; | |
| 112 } | |
| 113 return $result; | |
| 114 } | |
| 115 | |
| 116 /** | |
| 117 * Given a path alias, return the internal path it represents. | |
| 118 * | |
| 119 * @param $path | |
| 120 * A Drupal path alias. | |
| 121 * @param $path_language | |
| 122 * An optional language code to look up the path in. | |
| 123 * | |
| 124 * @return | |
| 125 * The internal path represented by the alias, or the original alias if no | |
| 126 * internal path was found. | |
| 127 */ | |
| 128 function drupal_get_normal_path($path, $path_language = '') { | |
| 129 $result = $path; | |
| 130 if ($src = drupal_lookup_path('source', $path, $path_language)) { | |
| 131 $result = $src; | |
| 132 } | |
| 133 if (function_exists('custom_url_rewrite_inbound')) { | |
| 134 // Modules may alter the inbound request path by reference. | |
| 135 custom_url_rewrite_inbound($result, $path, $path_language); | |
| 136 } | |
| 137 return $result; | |
| 138 } | |
| 139 | |
| 140 /** | |
| 141 * Return a component of the current Drupal path. | |
| 142 * | |
| 143 * When viewing a page at the path "admin/content/types", for example, arg(0) | |
| 144 * would return "admin", arg(1) would return "content", and arg(2) would return | |
| 145 * "types". | |
| 146 * | |
| 147 * Avoid use of this function where possible, as resulting code is hard to read. | |
| 148 * Instead, attempt to use named arguments in menu callback functions. See the | |
| 149 * explanation in menu.inc for how to construct callbacks that take arguments. | |
| 150 * | |
| 151 * @param $index | |
| 152 * The index of the component, where each component is separated by a '/' | |
| 153 * (forward-slash), and where the first component has an index of 0 (zero). | |
| 154 * | |
| 155 * @return | |
| 156 * The component specified by $index, or NULL if the specified component was | |
| 157 * not found. | |
| 158 */ | |
| 159 function arg($index = NULL, $path = NULL) { | |
| 160 static $arguments; | |
| 161 | |
| 162 if (!isset($path)) { | |
| 163 $path = $_GET['q']; | |
| 164 } | |
| 165 if (!isset($arguments[$path])) { | |
| 166 $arguments[$path] = explode('/', $path); | |
| 167 } | |
| 168 if (!isset($index)) { | |
| 169 return $arguments[$path]; | |
| 170 } | |
| 171 if (isset($arguments[$path][$index])) { | |
| 172 return $arguments[$path][$index]; | |
| 173 } | |
| 174 } | |
| 175 | |
| 176 /** | |
| 177 * Get the title of the current page, for display on the page and in the title bar. | |
| 178 * | |
| 179 * @return | |
| 180 * The current page's title. | |
| 181 */ | |
| 182 function drupal_get_title() { | |
| 183 $title = drupal_set_title(); | |
| 184 | |
| 185 // during a bootstrap, menu.inc is not included and thus we cannot provide a title | |
| 186 if (!isset($title) && function_exists('menu_get_active_title')) { | |
| 187 $title = check_plain(menu_get_active_title()); | |
| 188 } | |
| 189 | |
| 190 return $title; | |
| 191 } | |
| 192 | |
| 193 /** | |
| 194 * Set the title of the current page, for display on the page and in the title bar. | |
| 195 * | |
| 196 * @param $title | |
| 197 * Optional string value to assign to the page title; or if set to NULL | |
| 198 * (default), leaves the current title unchanged. | |
| 199 * | |
| 200 * @return | |
| 201 * The updated title of the current page. | |
| 202 */ | |
| 203 function drupal_set_title($title = NULL) { | |
| 204 static $stored_title; | |
| 205 | |
| 206 if (isset($title)) { | |
| 207 $stored_title = $title; | |
| 208 } | |
| 209 return $stored_title; | |
| 210 } | |
| 211 | |
| 212 /** | |
| 213 * Check if the current page is the front page. | |
| 214 * | |
| 215 * @return | |
| 216 * Boolean value: TRUE if the current page is the front page; FALSE if otherwise. | |
| 217 */ | |
| 218 function drupal_is_front_page() { | |
| 219 // As drupal_init_path updates $_GET['q'] with the 'site_frontpage' path, | |
| 220 // we can check it against the 'site_frontpage' variable. | |
| 221 return $_GET['q'] == drupal_get_normal_path(variable_get('site_frontpage', 'node')); | |
| 222 } | |
| 223 | |
| 224 /** | |
| 225 * Check if a path matches any pattern in a set of patterns. | |
| 226 * | |
| 227 * @param $path | |
| 228 * The path to match. | |
| 229 * @param $patterns | |
| 230 * String containing a set of patterns separated by \n, \r or \r\n. | |
| 231 * | |
| 232 * @return | |
| 233 * Boolean value: TRUE if the path matches a pattern, FALSE otherwise. | |
| 234 */ | |
| 235 function drupal_match_path($path, $patterns) { | |
| 236 static $regexps; | |
| 237 | |
| 238 if (!isset($regexps[$patterns])) { | |
| 239 $regexps[$patterns] = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\<front\\\\>($|\|)/'), array('|', '.*', '\1'. preg_quote(variable_get('site_frontpage', 'node'), '/') .'\2'), preg_quote($patterns, '/')) .')$/'; | |
| 240 } | |
| 241 return preg_match($regexps[$patterns], $path); | |
| 242 } |
