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 } |