url

5 common.inc url($path = NULL, $query = NULL, $fragment = NULL, $absolute = FALSE)
6 common.inc url($path = NULL, $options = array())
7 common.inc url($path = NULL, array $options = array())
8 common.inc url($path = NULL, array $options = array())

Generates an internal or external URL.

When creating links in modules, consider whether l() could be a better alternative than url().

Parameters

$path: The internal path or external URL being linked to, such as "node/34" or "http://example.com/foo". A few notes:

  • If you provide a full URL, it will be considered an external URL.
  • If you provide only the path (e.g. "node/34"), it will be considered an internal link. In this case, it should be a system URL, and it will be replaced with the alias, if one exists. Additional query arguments for internal paths must be supplied in $options['query'], not included in $path.
  • If you provide an internal path and $options['alias'] is set to TRUE, the path is assumed already to be the correct path alias, and the alias is not looked up.
  • The special string '<front>' generates a link to the site's base URL.
  • If your external URL contains a query (e.g. http://example.com/foo?a=b), then you can either URL encode the query keys and values yourself and include them in $path, or use $options['query'] to let this function URL encode them.

$options: An associative array of additional options, with the following elements:

  • 'query': A URL-encoded query string to append to the link, or an array of query key/value-pairs without any URL-encoding.
  • 'fragment': A fragment identifier (named anchor) to append to the URL. Do not include the leading '#' character.
  • 'absolute' (default FALSE): Whether to force the output to be an absolute link (beginning with http:). Useful for links that will be displayed outside the site, such as in an RSS feed.
  • 'alias' (default FALSE): Whether the given path is a URL alias already.
  • 'external': Whether the given path is an external URL.
  • 'language': An optional language object. Used to build the URL to link to and look up the proper alias for the link.
  • 'base_url': Only used internally, to modify the base URL when a language dependent URL requires so.
  • 'prefix': Only used internally, to modify the path when a language dependent URL requires so.

Return value

A string containing a URL to the given path.

140 calls to url()

27 string references to 'url'

File

includes/common.inc, line 1463
Common functions that many Drupal modules will need to reference.

Code

function url($path = NULL, $options = array()) {
  // Merge in defaults.
  $options += array(
    'fragment' => '', 
    'query' => '', 
    'absolute' => FALSE, 
    'alias' => FALSE, 
    'prefix' => '',
  );
  if (!isset($options['external'])) {
    // Return an external link if $path contains an allowed absolute URL.
    // Only call the slow filter_xss_bad_protocol if $path contains a ':' before
    // any / ? or #.
    $colonpos = strpos($path, ':');
    $options['external'] = ($colonpos !== FALSE && !preg_match('![/?#]!', substr($path, 0, $colonpos)) && filter_xss_bad_protocol($path, FALSE) == check_plain($path));
  }

  // May need language dependent rewriting if language.inc is present.
  if (function_exists('language_url_rewrite')) {
    language_url_rewrite($path, $options);
  }
  if ($options['fragment']) {
    $options['fragment'] = '#' . $options['fragment'];
  }
  if (is_array($options['query'])) {
    $options['query'] = drupal_query_string_encode($options['query']);
  }

  if ($options['external']) {
    // Split off the fragment.
    if (strpos($path, '#') !== FALSE) {
      list($path, $old_fragment) = explode('#', $path, 2);
      if (isset($old_fragment) && !$options['fragment']) {
        $options['fragment'] = '#' . $old_fragment;
      }
    }
    // Append the query.
    if ($options['query']) {
      $path .= (strpos($path, '?') !== FALSE ? '&' : '?') . $options['query'];
    }
    // Reassemble.
    return $path . $options['fragment'];
  }

  global $base_url;
  static $script;

  if (!isset($script)) {
    // On some web servers, such as IIS, we can't omit "index.php". So, we
    // generate "index.php?q=foo" instead of "?q=foo" on anything that is not
    // Apache.
    $script = (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') === FALSE) ? 'index.php' : '';
  }

  if (!isset($options['base_url'])) {
    // The base_url might be rewritten from the language rewrite in domain mode.
    $options['base_url'] = $base_url;
  }

  // Preserve the original path before aliasing.
  $original_path = $path;

  // The special path '<front>' links to the default front page.
  if ($path == '<front>') {
    $path = '';
  }
  elseif (!empty($path) && !$options['alias']) {
    $path = drupal_get_path_alias($path, isset($options['language']) ? $options['language']->language : '');
  }

  if (function_exists('custom_url_rewrite_outbound')) {
    // Modules may alter outbound links by reference.
    custom_url_rewrite_outbound($path, $options, $original_path);
  }

  $base = $options['absolute'] ? $options['base_url'] . '/' : base_path();
  $prefix = empty($path) ? rtrim($options['prefix'], '/') : $options['prefix'];
  $path = drupal_urlencode($prefix . $path);

  if (variable_get('clean_url', '0')) {
    // With Clean URLs.
    if ($options['query']) {
      return $base . $path . '?' . $options['query'] . $options['fragment'];
    }
    else {
      return $base . $path . $options['fragment'];
    }
  }
  else {
    // Without Clean URLs.
    $variables = array();
    if (!empty($path)) {
      $variables[] = 'q=' . $path;
    }
    if (!empty($options['query'])) {
      $variables[] = $options['query'];
    }
    if ($query = join('&', $variables)) {
      return $base . $script . '?' . $query . $options['fragment'];
    }
    else {
      return $base . $options['fragment'];
    }
  }
}

Comments

Don't use url() to generate JS and CSS paths

Do not use url() to generate JS and CSS paths. Because of this fragment:

if (function_exists('custom_url_rewrite_outbound')) {
    // Modules may alter outbound links by reference.
    custom_url_rewrite_outbound($path, $options, $original_path);
  }

if you call e.g.:
url('modules/node/node.css');
you'll get e.g.:
/prefix/modules/node/node.css
That'll happen if you have modules like i18n or Spaces enabled and configured to use path prefixes.

See: http://drupal.org/node/872340

use the query option to pass variables in your link

anything after the ? is a variable to include in the query.

THIS IS WRONG:

url("user/register?gids[]=$node->nid", array('absolute' => TRUE))

outputs incorrect:
user/register%3Fgids%5B%5D%3D6

THIS IS RIGHT:

url("user/register", array('query' => 'gids[]='. $node->nid,'absolute' => TRUE))

which outputs the correct:
user/register?gids[]=6

Dave Shaw
Tribe Rising

i need admin/settings/site-information front page url in drupal

Is it possible to get the node or any custom url , which one is set under site information / will i use variable_get() function

i need to display custom 404 page , have the link to front page url

can anyone assist for this?

Is there a way to add class to a url() function?

I have this line from the module http://drupal.org/project/r4032login

header('Location: '. url('user/login', array('query' => 'destination='. $path, 'absolute' => TRUE)), TRUE, 302);
    exit;
  }

I want to use the 'attributes' $options to add class to the url to display it in a colorbox
however url() seems to be the only function that will output a url and not a link.

l() function will output a class but it also wraps the url in an a href. not what I want.

Anyone out there have any tips

I can answer anything you like to help.

thanks,

Nick

url ignore current working directory

Is it possible to have url ignore its current working directory and have it form urls based at web root?

Login or register to post comments