1 system.tokens.inc | system_tokens($type, $tokens, array $data = array(), array $options = array()) |
Implements hook_tokens().
File
- core/
modules/ system/ system.tokens.inc, line 296 - Builds placeholder replacement tokens system-wide data.
Code
function system_tokens($type, $tokens, array $data = array(), array $options = array()) {
$url_options = array('absolute' => TRUE);
if (isset($options['language'])) {
$url_options['language'] = $options['language'];
$language_code = $options['language']->langcode;
}
else {
$language_code = NULL;
}
$sanitize = !empty($options['sanitize']);
$replacements = array();
if ($type == 'site') {
foreach ($tokens as $name => $original) {
switch ($name) {
case 'name':
$site_name = config_get_translated('system.core', 'site_name');
$replacements[$original] = $sanitize ? check_plain($site_name) : $site_name;
break;
case 'slogan':
$slogan = config_get_translated('system.core', 'site_slogan');
$replacements[$original] = $sanitize ? check_plain($slogan) : $slogan;
break;
case 'mail':
$replacements[$original] = config_get('system.core', 'site_mail');
break;
case 'url':
$replacements[$original] = url('<front>', $url_options);
break;
// @deprecated: Use url:brief instead.
case 'url-brief':
$replacements[$original] = preg_replace(array('!^https?://!', '!/$!'), '', url('<front>', $url_options));
break;
case 'login-url':
$replacements[$original] = url('user', $url_options);
break;
}
}
// Chained token relationships.
if ($url_tokens = token_find_with_prefix($tokens, 'url')) {
$replacements += token_generate('url', $url_tokens, array('path' => '<front>'), $options);
}
}
// Current page tokens.
elseif ($type == 'current-page') {
$current_path = current_path();
foreach ($tokens as $name => $original) {
switch ($name) {
case 'title':
$title = backdrop_get_title();
$replacements[$original] = $sanitize ? $title : decode_entities($title);
break;
case 'url':
$replacements[$original] = url($current_path, $url_options);
break;
case 'page-number':
if ($page = filter_input(INPUT_GET, 'page')) {
// @see PagerDefault::execute()
$pager_page_array = explode(',', $page);
$page = $pager_page_array[0];
}
$replacements[$original] = (int) $page + 1;
break;
}
}
// @deprecated
// [current-page:arg] dynamic tokens.
if ($arg_tokens = token_find_with_prefix($tokens, 'arg')) {
foreach ($arg_tokens as $name => $original) {
if (is_numeric($name) && ($arg = arg($name)) && isset($arg)) {
$replacements[$original] = $sanitize ? check_plain($arg) : $arg;
}
}
}
// [current-page:query] dynamic tokens.
if ($query_tokens = token_find_with_prefix($tokens, 'query')) {
foreach ($query_tokens as $name => $original) {
// @todo Should this use filter_input()?
if (isset($_GET[$name])) {
$replacements[$original] = $sanitize ? check_plain($_GET[$name]) : $_GET[$name];
}
}
}
// Chained token relationships.
if ($url_tokens = token_find_with_prefix($tokens, 'url')) {
$replacements += token_generate('url', $url_tokens, array('path' => $current_path), $options);
}
}
// Current date tokens.
elseif ($type == 'current-date') {
$replacements += token_generate('date', $tokens, array('date' => REQUEST_TIME), $options);
}
// URL tokens.
elseif ($type == 'url' && !empty($data['path'])) {
$path = $data['path'];
if (isset($data['options'])) {
// Merge in the URL options if available.
$url_options = $data['options'] + $url_options;
}
foreach ($tokens as $name => $original) {
switch ($name) {
case 'path':
$value = empty($url_options['alias']) ? backdrop_get_path_alias($path, $language_code) : $path;
$replacements[$original] = $sanitize ? check_plain($value) : $value;
break;
case 'alias':
// @deprecated
$alias = backdrop_get_path_alias($path, $language_code);
$replacements[$original] = $sanitize ? check_plain($alias) : $alias;
break;
case 'absolute':
$replacements[$original] = url($path, $url_options);
break;
case 'relative':
$replacements[$original] = url($path, array('absolute' => FALSE) + $url_options);
break;
case 'brief':
$replacements[$original] = preg_replace(array('!^https?://!', '!/$!'), '', url($path, $url_options));
break;
case 'unaliased':
$replacements[$original] = url($path, array('alias' => TRUE) + $url_options);
break;
case 'args':
$value = empty($url_options['alias']) ? backdrop_get_path_alias($path, $language_code) : $path;
$replacements[$original] = token_render_array(arg(NULL, $value), $options);
break;
}
}
// [url:arg:*] chained tokens.
if ($arg_tokens = token_find_with_prefix($tokens, 'args')) {
$value = empty($url_options['alias']) ? backdrop_get_path_alias($path, $language_code) : $path;
$replacements += token_generate('array', $arg_tokens, array('array' => arg(NULL, $value)), $options);
}
// [url:unaliased:*] chained tokens.
if ($unaliased_tokens = token_find_with_prefix($tokens, 'unaliased')) {
$unaliased_token_data['path'] = $path;
$unaliased_token_data['options'] = isset($data['options']) ? $data['options'] : array();
$unaliased_token_data['options']['alias'] = TRUE;
$replacements += token_generate('url', $unaliased_tokens, $unaliased_token_data, $options);
}
}
elseif ($type == 'array' && !empty($data['array']) && is_array($data['array'])) {
$array = $data['array'];
if (isset($options['array sort']) ? $options['array sort'] : FALSE) {
backdrop_sort($array, array('#weight' => SORT_NUMERIC));
}
$keys = array();
foreach ($array as $key => $value) {
if (substr($key, 0, 1) !== '#') {
$keys[] = $key;
}
}
foreach ($tokens as $name => $original) {
switch ($name) {
case 'first':
$value = $array[$keys[0]];
$value = is_array($value) ? render($value) : (string) $value;
$replacements[$original] = $sanitize ? check_plain($value) : $value;
break;
case 'last':
$value = $array[$keys[count($keys) - 1]];
$value = is_array($value) ? render($value) : (string) $value;
$replacements[$original] = $sanitize ? check_plain($value) : $value;
break;
case 'count':
$replacements[$original] = count($keys);
break;
case 'keys':
$replacements[$original] = token_render_array($keys, $options);
break;
case 'reversed':
$reversed = array_reverse($array, TRUE);
$replacements[$original] = token_render_array($reversed, $options);
break;
case 'join':
$replacements[$original] = token_render_array($array, array('join' => '') + $options);
break;
}
}
// [array:value:*] dynamic tokens.
if ($value_tokens = token_find_with_prefix($tokens, 'value')) {
foreach ($value_tokens as $key => $original) {
if (substr($key, 0, 1) !== '#' && isset($array[$key])) {
$replacements[$original] = token_render_array_value($array[$key], $options);
}
}
}
// [array:join:*] dynamic tokens.
if ($join_tokens = token_find_with_prefix($tokens, 'join')) {
foreach ($join_tokens as $join => $original) {
$replacements[$original] = token_render_array($array, array('join' => $join) + $options);
}
}
// [array:keys:*] chained tokens.
if ($key_tokens = token_find_with_prefix($tokens, 'keys')) {
$options['array sort'] = FALSE;
$replacements += token_generate('array', $key_tokens, array('array' => $keys), $options);
}
// [array:reversed:*] chained tokens.
if ($reversed_tokens = token_find_with_prefix($tokens, 'reversed')) {
$replacements += token_generate('array', $reversed_tokens, array('array' => array_reverse($array, TRUE)) + $options);
}
}
elseif ($type == 'date') {
$date = !empty($data['date']) ? $data['date'] : REQUEST_TIME;
$date_format_types = system_get_date_formats();
foreach ($tokens as $name => $original) {
switch ($name) {
case 'since':
$replacements[$original] = format_interval((REQUEST_TIME - $date), 2, $language_code);
break;
case 'raw':
$replacements[$original] = $sanitize ? check_plain($date) : $date;
break;
default:
if (isset($date_format_types[$name])) {
$replacements[$original] = format_date($date, $name, '', NULL, $language_code);
}
break;
}
}
if ($created_tokens = token_find_with_prefix($tokens, 'custom')) {
foreach ($created_tokens as $name => $original) {
$replacements[$original] = format_date($date, 'custom', $name, NULL, $language_code);
}
}
}
elseif ($type == 'file' && !empty($data['file'])) {
$file = $data['file'];
foreach ($tokens as $name => $original) {
switch ($name) {
case 'fid':
$replacements[$original] = $file->fid;
break;
case 'name':
$replacements[$original] = $sanitize ? check_plain($file->filename) : $file->filename;
break;
case 'basename':
$basename = pathinfo($file->uri, PATHINFO_BASENAME);
$replacements[$original] = $sanitize ? check_plain($basename) : $basename;
break;
case 'path':
$replacements[$original] = $sanitize ? check_plain($file->uri) : $file->uri;
break;
case 'url':
$replacements[$original] = $sanitize ? check_plain(file_create_url($file->uri)) : file_create_url($file->uri);
break;
case 'mime':
$replacements[$original] = $sanitize ? check_plain($file->filemime) : $file->filemime;
break;
case 'extension':
$extension = pathinfo($file->uri, PATHINFO_EXTENSION);
$replacements[$original] = $sanitize ? check_plain($extension) : $extension;
break;
case 'size':
$replacements[$original] = format_size($file->filesize);
break;
case 'size-raw':
$replacements[$original] = (int) $file->filesize;
break;
// These tokens are default variations on the chained tokens handled below.
case 'timestamp':
$replacements[$original] = format_date($file->timestamp, 'medium', '', NULL, $language_code);
break;
case 'owner':
$account = user_load($file->uid);
$name = user_format_name($account);
$replacements[$original] = $sanitize ? check_plain($name) : $name;
break;
}
}
if ($date_tokens = token_find_with_prefix($tokens, 'timestamp')) {
$replacements += token_generate('date', $date_tokens, array('date' => $file->timestamp), $options);
}
if (($owner_tokens = token_find_with_prefix($tokens, 'owner')) && $account = user_load($file->uid)) {
$replacements += token_generate('user', $owner_tokens, array('user' => $account), $options);
}
if (($url_tokens = token_find_with_prefix($tokens, 'url'))) {
$replacements += token_generate('url', $url_tokens, $file->uri(), $options);
}
}
// Random tokens.
elseif ($type == 'random') {
foreach ($tokens as $name => $original) {
switch ($name) {
case 'number':
$replacements[$original] = mt_rand();
break;
}
}
// For [random:hash:?] dynamic token.
if ($hash_tokens = token_find_with_prefix($tokens, 'hash')) {
$algos = hash_algos();
foreach ($hash_tokens as $name => $original) {
if (in_array($name, $algos)) {
$replacements[$original] = hash($name, backdrop_random_bytes(55));
}
}
}
}
// If the token type specifics a 'needs-data' value, and the value is not
// present in $data, then throw an error.
if (!empty($GLOBALS['backdrop_test_info']['test_run_id'])) {
// Only check when tests are running.
$type_info = token_get_info($type);
if (!empty($type_info['needs-data']) && !isset($data[$type_info['needs-data']])) {
trigger_error(t('Attempting to perform token replacement for token type %type without required data', array('%type' => $type)), E_USER_WARNING);
}
}
return $replacements;
}