web/drupal/includes/path.inc
branchdrupal
changeset 74 0ff3ba646492
equal deleted inserted replaced
73:fcf75e232c5b 74:0ff3ba646492
       
     1 <?php
       
     2 // $Id: path.inc,v 1.19.2.1 2008/10/13 21:06:41 dries 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     $count = NULL;
       
    62   }
       
    63   elseif ($count > 0 && $path != '') {
       
    64     if ($action == 'alias') {
       
    65       if (isset($map[$path_language][$path])) {
       
    66         return $map[$path_language][$path];
       
    67       }
       
    68       // Get the most fitting result falling back with alias without language
       
    69       $alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s' AND language IN('%s', '') ORDER BY language DESC", $path, $path_language));
       
    70       $map[$path_language][$path] = $alias;
       
    71       return $alias;
       
    72     }
       
    73     // Check $no_src for this $path in case we've already determined that there
       
    74     // isn't a path that has this alias
       
    75     elseif ($action == 'source' && !isset($no_src[$path_language][$path])) {
       
    76       // Look for the value $path within the cached $map
       
    77       $src = '';
       
    78       if (!isset($map[$path_language]) || !($src = array_search($path, $map[$path_language]))) {
       
    79         // Get the most fitting result falling back with alias without language
       
    80         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))) {
       
    81           $map[$path_language][$src] = $path;
       
    82         }
       
    83         else {
       
    84           // We can't record anything into $map because we do not have a valid
       
    85           // index and there is no need because we have not learned anything
       
    86           // about any Drupal path. Thus cache to $no_src.
       
    87           $no_src[$path_language][$path] = TRUE;
       
    88         }
       
    89       }
       
    90       return $src;
       
    91     }
       
    92   }
       
    93 
       
    94   return FALSE;
       
    95 }
       
    96 
       
    97 /**
       
    98  * Given an internal Drupal path, return the alias set by the administrator.
       
    99  *
       
   100  * @param $path
       
   101  *   An internal Drupal path.
       
   102  * @param $path_language
       
   103  *   An optional language code to look up the path in.
       
   104  *
       
   105  * @return
       
   106  *   An aliased path if one was found, or the original path if no alias was
       
   107  *   found.
       
   108  */
       
   109 function drupal_get_path_alias($path, $path_language = '') {
       
   110   $result = $path;
       
   111   if ($alias = drupal_lookup_path('alias', $path, $path_language)) {
       
   112     $result = $alias;
       
   113   }
       
   114   return $result;
       
   115 }
       
   116 
       
   117 /**
       
   118  * Given a path alias, return the internal path it represents.
       
   119  *
       
   120  * @param $path
       
   121  *   A Drupal path alias.
       
   122  * @param $path_language
       
   123  *   An optional language code to look up the path in.
       
   124  *
       
   125  * @return
       
   126  *   The internal path represented by the alias, or the original alias if no
       
   127  *   internal path was found.
       
   128  */
       
   129 function drupal_get_normal_path($path, $path_language = '') {
       
   130   $result = $path;
       
   131   if ($src = drupal_lookup_path('source', $path, $path_language)) {
       
   132     $result = $src;
       
   133   }
       
   134   if (function_exists('custom_url_rewrite_inbound')) {
       
   135     // Modules may alter the inbound request path by reference.
       
   136     custom_url_rewrite_inbound($result, $path, $path_language);
       
   137   }
       
   138   return $result;
       
   139 }
       
   140 
       
   141 /**
       
   142  * Return a component of the current Drupal path.
       
   143  *
       
   144  * When viewing a page at the path "admin/content/types", for example, arg(0)
       
   145  * would return "admin", arg(1) would return "content", and arg(2) would return
       
   146  * "types".
       
   147  *
       
   148  * Avoid use of this function where possible, as resulting code is hard to read.
       
   149  * Instead, attempt to use named arguments in menu callback functions. See the
       
   150  * explanation in menu.inc for how to construct callbacks that take arguments.
       
   151  *
       
   152  * @param $index
       
   153  *   The index of the component, where each component is separated by a '/'
       
   154  *   (forward-slash), and where the first component has an index of 0 (zero).
       
   155  *
       
   156  * @return
       
   157  *   The component specified by $index, or NULL if the specified component was
       
   158  *   not found.
       
   159  */
       
   160 function arg($index = NULL, $path = NULL) {
       
   161   static $arguments;
       
   162 
       
   163   if (!isset($path)) {
       
   164     $path = $_GET['q'];
       
   165   }
       
   166   if (!isset($arguments[$path])) {
       
   167     $arguments[$path] = explode('/', $path);
       
   168   }
       
   169   if (!isset($index)) {
       
   170     return $arguments[$path];
       
   171   }
       
   172   if (isset($arguments[$path][$index])) {
       
   173     return $arguments[$path][$index];
       
   174   }
       
   175 }
       
   176 
       
   177 /**
       
   178  * Get the title of the current page, for display on the page and in the title bar.
       
   179  *
       
   180  * @return
       
   181  *   The current page's title.
       
   182  */
       
   183 function drupal_get_title() {
       
   184   $title = drupal_set_title();
       
   185 
       
   186   // during a bootstrap, menu.inc is not included and thus we cannot provide a title
       
   187   if (!isset($title) && function_exists('menu_get_active_title')) {
       
   188     $title = check_plain(menu_get_active_title());
       
   189   }
       
   190 
       
   191   return $title;
       
   192 }
       
   193 
       
   194 /**
       
   195  * Set the title of the current page, for display on the page and in the title bar.
       
   196  *
       
   197  * @param $title
       
   198  *   Optional string value to assign to the page title; or if set to NULL
       
   199  *   (default), leaves the current title unchanged.
       
   200  *
       
   201  * @return
       
   202  *   The updated title of the current page.
       
   203  */
       
   204 function drupal_set_title($title = NULL) {
       
   205   static $stored_title;
       
   206 
       
   207   if (isset($title)) {
       
   208     $stored_title = $title;
       
   209   }
       
   210   return $stored_title;
       
   211 }
       
   212 
       
   213 /**
       
   214  * Check if the current page is the front page.
       
   215  *
       
   216  * @return
       
   217  *   Boolean value: TRUE if the current page is the front page; FALSE if otherwise.
       
   218  */
       
   219 function drupal_is_front_page() {
       
   220   // As drupal_init_path updates $_GET['q'] with the 'site_frontpage' path,
       
   221   // we can check it against the 'site_frontpage' variable.
       
   222   return $_GET['q'] == drupal_get_normal_path(variable_get('site_frontpage', 'node'));
       
   223 }
       
   224 
       
   225 /**
       
   226  * Check if a path matches any pattern in a set of patterns.
       
   227  *
       
   228  * @param $path
       
   229  *   The path to match.
       
   230  * @param $patterns
       
   231  *   String containing a set of patterns separated by \n, \r or \r\n.
       
   232  *
       
   233  * @return
       
   234  *   Boolean value: TRUE if the path matches a pattern, FALSE otherwise.
       
   235  */
       
   236 function drupal_match_path($path, $patterns) {
       
   237   static $regexps;
       
   238 
       
   239   if (!isset($regexps[$patterns])) {
       
   240     $regexps[$patterns] = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\<front\\\\>($|\|)/'), array('|', '.*', '\1'. preg_quote(variable_get('site_frontpage', 'node'), '/') .'\2'), preg_quote($patterns, '/')) .')$/';
       
   241   }
       
   242   return preg_match($regexps[$patterns], $path);
       
   243 }