[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/includes/ -> path.inc (source)

   1  <?php
   2  // $Id: path.inc,v 1.19.2.7 2010/11/04 10:27:46 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      $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, pid 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 = FALSE;
  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, pid 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   * @param $path
 156   *   A path to break into components. Defaults to the path of the current page.
 157   *
 158   * @return
 159   *   The component specified by $index, or NULL if the specified component was
 160   *   not found. If called without arguments, it returns an array containing all
 161   *   the components of the current path.
 162   */
 163  function arg($index = NULL, $path = NULL) {
 164    static $arguments;
 165  
 166    if (!isset($path)) {
 167      $path = $_GET['q'];
 168    }
 169    if (!isset($arguments[$path])) {
 170      $arguments[$path] = explode('/', $path);
 171    }
 172    if (!isset($index)) {
 173      return $arguments[$path];
 174    }
 175    if (isset($arguments[$path][$index])) {
 176      return $arguments[$path][$index];
 177    }
 178  }
 179  
 180  /**
 181   * Get the title of the current page, for display on the page and in the title bar.
 182   *
 183   * @return
 184   *   The current page's title.
 185   */
 186  function drupal_get_title() {
 187    $title = drupal_set_title();
 188  
 189    // during a bootstrap, menu.inc is not included and thus we cannot provide a title
 190    if (!isset($title) && function_exists('menu_get_active_title')) {
 191      $title = check_plain(menu_get_active_title());
 192    }
 193  
 194    return $title;
 195  }
 196  
 197  /**
 198   * Set the title of the current page, for display on the page and in the title bar.
 199   *
 200   * @param $title
 201   *   Optional string value to assign to the page title; or if set to NULL
 202   *   (default), leaves the current title unchanged.
 203   *
 204   * @return
 205   *   The updated title of the current page.
 206   */
 207  function drupal_set_title($title = NULL) {
 208    static $stored_title;
 209  
 210    if (isset($title)) {
 211      $stored_title = $title;
 212    }
 213    return $stored_title;
 214  }
 215  
 216  /**
 217   * Check if the current page is the front page.
 218   *
 219   * @return
 220   *   Boolean value: TRUE if the current page is the front page; FALSE if otherwise.
 221   */
 222  function drupal_is_front_page() {
 223    static $is_front_page;
 224  
 225    if (!isset($is_front_page)) {
 226      // As drupal_init_path updates $_GET['q'] with the 'site_frontpage' path,
 227      // we can check it against the 'site_frontpage' variable.
 228      $is_front_page = ($_GET['q'] == drupal_get_normal_path(variable_get('site_frontpage', 'node')));
 229    }
 230  
 231    return $is_front_page;
 232  }
 233  
 234  /**
 235   * Check if a path matches any pattern in a set of patterns.
 236   *
 237   * @param $path
 238   *   The path to match.
 239   * @param $patterns
 240   *   String containing a set of patterns separated by \n, \r or \r\n.
 241   *
 242   * @return
 243   *   1 if there is a match, 0 if there is not a match.
 244   */
 245  function drupal_match_path($path, $patterns) {
 246    static $regexps;
 247  
 248    if (!isset($regexps[$patterns])) {
 249      $regexps[$patterns] = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\<front\\\\>($|\|)/'), array('|', '.*', '\1'. preg_quote(variable_get('site_frontpage', 'node'), '/') .'\2'), preg_quote($patterns, '/')) .')$/';
 250    }
 251    return preg_match($regexps[$patterns], $path);
 252  }


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7