danielebarchiesi@0: t('Current date'), danielebarchiesi@0: 'description' => t('Tokens related to the current date and time.'), danielebarchiesi@0: 'type' => 'date', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Add a 'dynamic' key to any tokens that have chained but dynamic tokens. danielebarchiesi@0: $info['tokens']['date']['custom']['dynamic'] = TRUE; danielebarchiesi@0: danielebarchiesi@0: // The [file:size] may not always return in kilobytes. danielebarchiesi@0: // @todo Remove when http://drupal.org/node/1193044 is fixed. danielebarchiesi@0: $info['tokens']['file']['size']['description'] = t('The size of the file.'); danielebarchiesi@0: danielebarchiesi@0: // Remove deprecated tokens from being listed. danielebarchiesi@0: unset($info['tokens']['node']['tnid']); danielebarchiesi@0: unset($info['tokens']['node']['type']); danielebarchiesi@0: unset($info['tokens']['node']['type-name']); danielebarchiesi@0: danielebarchiesi@0: // Support 'url' type tokens for core tokens. danielebarchiesi@0: if (isset($info['tokens']['comment']['url']) && module_exists('comment')) { danielebarchiesi@0: $info['tokens']['comment']['url']['type'] = 'url'; danielebarchiesi@0: } danielebarchiesi@0: $info['tokens']['node']['url']['type'] = 'url'; danielebarchiesi@0: if (isset($info['tokens']['term']['url']) && module_exists('taxonomy')) { danielebarchiesi@0: $info['tokens']['term']['url']['type'] = 'url'; danielebarchiesi@0: } danielebarchiesi@0: $info['tokens']['user']['url']['type'] = 'url'; danielebarchiesi@0: danielebarchiesi@0: // Add [token:url] tokens for any URI-able entities. danielebarchiesi@0: $entities = entity_get_info(); danielebarchiesi@0: foreach ($entities as $entity => $entity_info) { danielebarchiesi@0: if (!isset($entity_info['token type'])) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $token_type = $entity_info['token type']; danielebarchiesi@0: if (!isset($info['types'][$token_type]) || !isset($info['tokens'][$token_type])) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Add [entity:url] tokens if they do not already exist. danielebarchiesi@0: // @todo Support entity:label danielebarchiesi@0: if (!isset($info['tokens'][$token_type]['url']) && !empty($entity_info['uri callback'])) { danielebarchiesi@0: $info['tokens'][$token_type]['url'] = array( danielebarchiesi@0: 'name' => t('URL'), danielebarchiesi@0: 'description' => t('The URL of the @entity.', array('@entity' => drupal_strtolower($entity_info['label']))), danielebarchiesi@0: 'module' => 'token', danielebarchiesi@0: 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Add [entity:original] tokens if they do not already exist. danielebarchiesi@0: if (!isset($info['tokens'][$token_type]['original'])) { danielebarchiesi@0: $info['tokens'][$token_type]['original'] = array( danielebarchiesi@0: 'name' => t('Original @entity', array('@entity' => drupal_strtolower($entity_info['label']))), danielebarchiesi@0: 'description' => t('The original @entity data if the @entity is being updated or saved.', array('@entity' => drupal_strtolower($entity_info['label']))), danielebarchiesi@0: 'module' => 'token', danielebarchiesi@0: 'type' => $token_type, danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Add support for custom date formats. danielebarchiesi@0: // @todo Remove when http://drupal.org/node/1173706 is fixed. danielebarchiesi@0: $date_format_types = system_get_date_types(); danielebarchiesi@0: foreach ($date_format_types as $date_format_type => $date_format_type_info) { danielebarchiesi@0: if (!isset($info['tokens']['date'][$date_format_type])) { danielebarchiesi@0: $info['tokens']['date'][$date_format_type] = array( danielebarchiesi@0: 'name' => check_plain($date_format_type_info['title']), danielebarchiesi@0: 'description' => t("A date in '@type' format. (%date)", array('@type' => $date_format_type, '%date' => format_date(REQUEST_TIME, $date_format_type))), danielebarchiesi@0: 'module' => 'token', danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_token_info(). danielebarchiesi@0: */ danielebarchiesi@0: function token_token_info() { danielebarchiesi@0: // Node tokens. danielebarchiesi@0: $info['tokens']['node']['source'] = array( danielebarchiesi@0: 'name' => t('Translation source node'), danielebarchiesi@0: 'description' => t("The source node for this current node's translation set."), danielebarchiesi@0: 'type' => 'node', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['node']['log'] = array( danielebarchiesi@0: 'name' => t('Revision log message'), danielebarchiesi@0: 'description' => t('The explanation of the most recent changes made to the node.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['node']['content-type'] = array( danielebarchiesi@0: 'name' => t('Content type'), danielebarchiesi@0: 'description' => t('The content type of the node.'), danielebarchiesi@0: 'type' => 'content-type', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Content type tokens. danielebarchiesi@0: $info['types']['content-type'] = array( danielebarchiesi@0: 'name' => t('Content types'), danielebarchiesi@0: 'description' => t('Tokens related to content types.'), danielebarchiesi@0: 'needs-data' => 'node_type', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['content-type']['name'] = array( danielebarchiesi@0: 'name' => t('Name'), danielebarchiesi@0: 'description' => t('The name of the content type.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['content-type']['machine-name'] = array( danielebarchiesi@0: 'name' => t('Machine-readable name'), danielebarchiesi@0: 'description' => t('The unique machine-readable name of the content type.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['content-type']['description'] = array( danielebarchiesi@0: 'name' => t('Description'), danielebarchiesi@0: 'description' => t('The optional description of the content type.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['content-type']['node-count'] = array( danielebarchiesi@0: 'name' => t('Node count'), danielebarchiesi@0: 'description' => t('The number of nodes belonging to the content type.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['content-type']['edit-url'] = array( danielebarchiesi@0: 'name' => t('Edit URL'), danielebarchiesi@0: 'description' => t("The URL of the content type's edit page."), danielebarchiesi@0: // 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Taxonomy term and vocabulary tokens. danielebarchiesi@0: if (module_exists('taxonomy')) { danielebarchiesi@0: $info['tokens']['term']['edit-url'] = array( danielebarchiesi@0: 'name' => t('Edit URL'), danielebarchiesi@0: 'description' => t("The URL of the taxonomy term's edit page."), danielebarchiesi@0: // 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['term']['parents'] = array( danielebarchiesi@0: 'name' => t('Parents'), danielebarchiesi@0: 'description' => t("An array of all the term's parents, starting with the root."), danielebarchiesi@0: 'type' => 'array', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['term']['root'] = array( danielebarchiesi@0: 'name' => t('Root term'), danielebarchiesi@0: 'description' => t("The root term of the taxonomy term."), danielebarchiesi@0: 'type' => 'term', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $info['tokens']['vocabulary']['machine-name'] = array( danielebarchiesi@0: 'name' => t('Machine-readable name'), danielebarchiesi@0: 'description' => t('The unique machine-readable name of the vocabulary.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['vocabulary']['edit-url'] = array( danielebarchiesi@0: 'name' => t('Edit URL'), danielebarchiesi@0: 'description' => t("The URL of the vocabulary's edit page."), danielebarchiesi@0: // 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // File tokens. danielebarchiesi@0: $info['tokens']['file']['basename'] = array( danielebarchiesi@0: 'name' => t('Base name'), danielebarchiesi@0: 'description' => t('The base name of the file.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['file']['extension'] = array( danielebarchiesi@0: 'name' => t('Extension'), danielebarchiesi@0: 'description' => t('The extension of the file.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['file']['size-raw'] = array( danielebarchiesi@0: 'name' => t('File byte size'), danielebarchiesi@0: 'description' => t('The size of the file, in bytes.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // User tokens. danielebarchiesi@0: // Add information on the restricted user tokens. danielebarchiesi@0: $info['tokens']['user']['cancel-url'] = array( danielebarchiesi@0: 'name' => t('Account cancellation URL'), danielebarchiesi@0: 'description' => t('The URL of the confirm delete page for the user account.'), danielebarchiesi@0: 'restricted' => TRUE, danielebarchiesi@0: // 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['user']['one-time-login-url'] = array( danielebarchiesi@0: 'name' => t('One-time login URL'), danielebarchiesi@0: 'description' => t('The URL of the one-time login page for the user account.'), danielebarchiesi@0: 'restricted' => TRUE, danielebarchiesi@0: // 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: if (variable_get('user_pictures', 0)) { danielebarchiesi@0: $info['tokens']['user']['picture'] = array( danielebarchiesi@0: 'name' => t('Picture'), danielebarchiesi@0: 'description' => t('The picture of the user.'), danielebarchiesi@0: 'type' => 'file', danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: $info['tokens']['user']['roles'] = array( danielebarchiesi@0: 'name' => t('Roles'), danielebarchiesi@0: 'description' => t('The user roles associated with the user account.'), danielebarchiesi@0: 'type' => 'array', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Current user tokens. danielebarchiesi@0: $info['tokens']['current-user']['ip-address'] = array( danielebarchiesi@0: 'name' => t('IP address'), danielebarchiesi@0: 'description' => 'The IP address of the current user.', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Menu link tokens (work regardless if menu module is enabled or not). danielebarchiesi@0: $info['types']['menu-link'] = array( danielebarchiesi@0: 'name' => t('Menu links'), danielebarchiesi@0: 'description' => t('Tokens related to menu links.'), danielebarchiesi@0: 'needs-data' => 'menu-link', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu-link']['mlid'] = array( danielebarchiesi@0: 'name' => t('Link ID'), danielebarchiesi@0: 'description' => t('The unique ID of the menu link.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu-link']['title'] = array( danielebarchiesi@0: 'name' => t('Title'), danielebarchiesi@0: 'description' => t('The title of the menu link.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu-link']['url'] = array( danielebarchiesi@0: 'name' => t('URL'), danielebarchiesi@0: 'description' => t('The URL of the menu link.'), danielebarchiesi@0: 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu-link']['parent'] = array( danielebarchiesi@0: 'name' => t('Parent'), danielebarchiesi@0: 'description' => t("The menu link's parent."), danielebarchiesi@0: 'type' => 'menu-link', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu-link']['parents'] = array( danielebarchiesi@0: 'name' => t('Parents'), danielebarchiesi@0: 'description' => t("An array of all the menu link's parents, starting with the root."), danielebarchiesi@0: 'type' => 'array', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu-link']['root'] = array( danielebarchiesi@0: 'name' => t('Root'), danielebarchiesi@0: 'description' => t("The menu link's root."), danielebarchiesi@0: 'type' => 'menu-link', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Current page tokens. danielebarchiesi@0: $info['types']['current-page'] = array( danielebarchiesi@0: 'name' => t('Current page'), danielebarchiesi@0: 'description' => t('Tokens related to the current page request.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['current-page']['title'] = array( danielebarchiesi@0: 'name' => t('Title'), danielebarchiesi@0: 'description' => t('The title of the current page.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['current-page']['url'] = array( danielebarchiesi@0: 'name' => t('URL'), danielebarchiesi@0: 'description' => t('The URL of the current page.'), danielebarchiesi@0: 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['current-page']['page-number'] = array( danielebarchiesi@0: 'name' => t('Page number'), danielebarchiesi@0: 'description' => t('The page number of the current page when viewing paged lists.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['current-page']['query'] = array( danielebarchiesi@0: 'name' => t('Query string value'), danielebarchiesi@0: 'description' => t('The value of a specific query string field of the current page.'), danielebarchiesi@0: 'dynamic' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // URL tokens. danielebarchiesi@0: $info['types']['url'] = array( danielebarchiesi@0: 'name' => t('URL'), danielebarchiesi@0: 'description' => t('Tokens related to URLs.'), danielebarchiesi@0: 'needs-data' => 'path', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['url']['path'] = array( danielebarchiesi@0: 'name' => t('Path'), danielebarchiesi@0: 'description' => t('The path component of the URL.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['url']['relative'] = array( danielebarchiesi@0: 'name' => t('Relative URL'), danielebarchiesi@0: 'description' => t('The relative URL.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['url']['absolute'] = array( danielebarchiesi@0: 'name' => t('Absolute URL'), danielebarchiesi@0: 'description' => t('The absolute URL.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['url']['brief'] = array( danielebarchiesi@0: 'name' => t('Brief URL'), danielebarchiesi@0: 'description' => t('The URL without the protocol and trailing backslash.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['url']['unaliased'] = array( danielebarchiesi@0: 'name' => t('Unaliased URL'), danielebarchiesi@0: 'description' => t('The unaliased URL.'), danielebarchiesi@0: 'type' => 'url', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['url']['args'] = array( danielebarchiesi@0: 'name' => t('Arguments'), danielebarchiesi@0: 'description' => t("The specific argument of the current page (e.g. 'arg:1' on the page 'node/1' returns '1')."), danielebarchiesi@0: 'type' => 'array', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Array tokens. danielebarchiesi@0: $info['types']['array'] = array( danielebarchiesi@0: 'name' => t('Array'), danielebarchiesi@0: 'description' => t('Tokens related to arrays of strings.'), danielebarchiesi@0: 'needs-data' => 'array', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['array']['first'] = array( danielebarchiesi@0: 'name' => t('First'), danielebarchiesi@0: 'description' => t('The first element of the array.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['array']['last'] = array( danielebarchiesi@0: 'name' => t('Last'), danielebarchiesi@0: 'description' => t('The last element of the array.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['array']['count'] = array( danielebarchiesi@0: 'name' => t('Count'), danielebarchiesi@0: 'description' => t('The number of elements in the array.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['array']['reversed'] = array( danielebarchiesi@0: 'name' => t('Reversed'), danielebarchiesi@0: 'description' => t('The array reversed.'), danielebarchiesi@0: 'type' => 'array', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['array']['keys'] = array( danielebarchiesi@0: 'name' => t('Keys'), danielebarchiesi@0: 'description' => t('The array of keys of the array.'), danielebarchiesi@0: 'type' => 'array', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['array']['join'] = array( danielebarchiesi@0: 'name' => t('Imploded'), danielebarchiesi@0: 'description' => t('The values of the array joined together with a custom string in-between each value.'), danielebarchiesi@0: 'dynamic' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['array']['value'] = array( danielebarchiesi@0: 'name' => t('Value'), danielebarchiesi@0: 'description' => t('The specific value of the array.'), danielebarchiesi@0: 'dynamic' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Random tokens. danielebarchiesi@0: $info['types']['random'] = array( danielebarchiesi@0: 'name' => t('Random'), danielebarchiesi@0: 'description' => ('Tokens related to random data.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['random']['number'] = array( danielebarchiesi@0: 'name' => t('Number'), danielebarchiesi@0: 'description' => t('A random number from 0 to @max.', array('@max' => mt_getrandmax())), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['random']['hash'] = array( danielebarchiesi@0: 'name' => t('Hash'), danielebarchiesi@0: 'description' => t('A random hash. The possible hashing algorithms are: @hash-algos.', array('@hash-algos' => implode(', ', hash_algos()))), danielebarchiesi@0: 'dynamic' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return $info; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_tokens(). danielebarchiesi@0: */ danielebarchiesi@0: function token_tokens($type, $tokens, array $data = array(), array $options = array()) { danielebarchiesi@0: $replacements = array(); danielebarchiesi@0: danielebarchiesi@0: $url_options = array('absolute' => TRUE); danielebarchiesi@0: if (isset($options['language'])) { danielebarchiesi@0: $url_options['language'] = $options['language']; danielebarchiesi@0: $language_code = $options['language']->language; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $language_code = NULL; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $sanitize = !empty($options['sanitize']); danielebarchiesi@0: danielebarchiesi@0: // Date tokens. danielebarchiesi@0: if ($type == 'date') { danielebarchiesi@0: $date = !empty($data['date']) ? $data['date'] : REQUEST_TIME; danielebarchiesi@0: danielebarchiesi@0: // @todo Remove when http://drupal.org/node/1173706 is fixed. danielebarchiesi@0: $date_format_types = system_get_date_types(); danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: if (isset($date_format_types[$name]) && _token_module('date', $name) == 'token') { danielebarchiesi@0: $replacements[$original] = format_date($date, $name, '', NULL, $language_code); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Current date tokens. danielebarchiesi@0: // @todo Remove when http://drupal.org/node/943028 is fixed. danielebarchiesi@0: if ($type == 'current-date') { danielebarchiesi@0: $replacements += token_generate('date', $tokens, array('date' => REQUEST_TIME), $options); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Comment tokens. danielebarchiesi@0: if ($type == 'comment' && !empty($data['comment'])) { danielebarchiesi@0: $comment = $data['comment']; danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if (($url_tokens = token_find_with_prefix($tokens, 'url'))) { danielebarchiesi@0: $replacements += token_generate('url', $url_tokens, entity_uri('comment', $comment), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Node tokens. danielebarchiesi@0: if ($type == 'node' && !empty($data['node'])) { danielebarchiesi@0: $node = $data['node']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'source': danielebarchiesi@0: if (!empty($node->tnid) && $source_node = node_load($node->tnid)) { danielebarchiesi@0: $title = $source_node->title; danielebarchiesi@0: $replacements[$original] = $sanitize ? filter_xss($title) : $title; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: case 'log': danielebarchiesi@0: $replacements[$original] = $sanitize ? filter_xss($node->log) : $node->log; danielebarchiesi@0: break; danielebarchiesi@0: case 'content-type': danielebarchiesi@0: $type_name = node_type_get_name($node); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($type_name) : $type_name; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if (!empty($node->tnid) && ($source_tokens = token_find_with_prefix($tokens, 'source')) && $source_node = node_load($node->tnid)) { danielebarchiesi@0: $replacements += token_generate('node', $source_tokens, array('node' => $source_node), $options); danielebarchiesi@0: } danielebarchiesi@0: if (($node_type_tokens = token_find_with_prefix($tokens, 'content-type')) && $node_type = node_type_load($node->type)) { danielebarchiesi@0: $replacements += token_generate('content-type', $node_type_tokens, array('node_type' => $node_type), $options); danielebarchiesi@0: } danielebarchiesi@0: if (($url_tokens = token_find_with_prefix($tokens, 'url'))) { danielebarchiesi@0: $replacements += token_generate('url', $url_tokens, entity_uri('node', $node), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Content type tokens. danielebarchiesi@0: if ($type == 'content-type' && !empty($data['node_type'])) { danielebarchiesi@0: $node_type = $data['node_type']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'name': danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($node_type->name) : $node_type->name; danielebarchiesi@0: break; danielebarchiesi@0: case 'machine-name': danielebarchiesi@0: // This is a machine name so does not ever need to be sanitized. danielebarchiesi@0: $replacements[$original] = $node_type->type; danielebarchiesi@0: break; danielebarchiesi@0: case 'description': danielebarchiesi@0: $replacements[$original] = $sanitize ? filter_xss($node_type->description) : $node_type->description; danielebarchiesi@0: break; danielebarchiesi@0: case 'node-count': danielebarchiesi@0: $query = db_select('node'); danielebarchiesi@0: $query->condition('type', $node_type->type); danielebarchiesi@0: $query->addTag('node_type_node_count'); danielebarchiesi@0: $count = $query->countQuery()->execute()->fetchField(); danielebarchiesi@0: $replacements[$original] = (int) $count; danielebarchiesi@0: break; danielebarchiesi@0: case 'edit-url': danielebarchiesi@0: $replacements[$original] = url("admin/structure/types/manage/{$node_type->type}", $url_options); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Taxonomy term tokens. danielebarchiesi@0: if ($type == 'term' && !empty($data['term'])) { danielebarchiesi@0: $term = $data['term']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'edit-url': danielebarchiesi@0: $replacements[$original] = url("taxonomy/term/{$term->tid}/edit", $url_options); danielebarchiesi@0: break; danielebarchiesi@0: danielebarchiesi@0: case 'parents': danielebarchiesi@0: if ($parents = token_taxonomy_term_load_all_parents($term->tid)) { danielebarchiesi@0: $replacements[$original] = token_render_array($parents, $options); danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: danielebarchiesi@0: case 'root': danielebarchiesi@0: $parents = taxonomy_get_parents_all($term->tid); danielebarchiesi@0: $root_term = end($parents); danielebarchiesi@0: if ($root_term->tid != $term->tid) { danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($root_term->name) : $root_term->name; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if (($url_tokens = token_find_with_prefix($tokens, 'url'))) { danielebarchiesi@0: $replacements += token_generate('url', $url_tokens, entity_uri('taxonomy_term', $term), $options); danielebarchiesi@0: } danielebarchiesi@0: // [term:parents:*] chained tokens. danielebarchiesi@0: if ($parents_tokens = token_find_with_prefix($tokens, 'parents')) { danielebarchiesi@0: if ($parents = token_taxonomy_term_load_all_parents($term->tid)) { danielebarchiesi@0: $replacements += token_generate('array', $parents_tokens, array('array' => $parents), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: if ($root_tokens = token_find_with_prefix($tokens, 'root')) { danielebarchiesi@0: $parents = taxonomy_get_parents_all($term->tid); danielebarchiesi@0: $root_term = end($parents); danielebarchiesi@0: if ($root_term->tid != $term->tid) { danielebarchiesi@0: $replacements += token_generate('term', $root_tokens, array('term' => $root_term), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Vocabulary tokens. danielebarchiesi@0: if ($type == 'vocabulary' && !empty($data['vocabulary'])) { danielebarchiesi@0: $vocabulary = $data['vocabulary']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'machine-name': danielebarchiesi@0: // This is a machine name so does not ever need to be sanitized. danielebarchiesi@0: $replacements[$original] = $vocabulary->machine_name; danielebarchiesi@0: break; danielebarchiesi@0: case 'edit-url': danielebarchiesi@0: $replacements[$original] = url("admin/structure/taxonomy/{$vocabulary->machine_name}/edit", $url_options); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // File tokens. danielebarchiesi@0: if ($type == 'file' && !empty($data['file'])) { danielebarchiesi@0: $file = $data['file']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'basename': danielebarchiesi@0: $basename = pathinfo($file->uri, PATHINFO_BASENAME); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($basename) : $basename; danielebarchiesi@0: break; danielebarchiesi@0: case 'extension': danielebarchiesi@0: $extension = pathinfo($file->uri, PATHINFO_EXTENSION); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($extension) : $extension; danielebarchiesi@0: break; danielebarchiesi@0: case 'size-raw': danielebarchiesi@0: $replacements[$original] = (int) $file->filesize; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // User tokens. danielebarchiesi@0: if ($type == 'user' && !empty($data['user'])) { danielebarchiesi@0: $account = $data['user']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'picture': danielebarchiesi@0: if (variable_get('user_pictures', 0)) { danielebarchiesi@0: $replacements[$original] = theme('user_picture', array('account' => $account)); danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: case 'roles': danielebarchiesi@0: // The roles array may be set from checkbox values so ensure it always danielebarchiesi@0: // has 'proper' data with the role names. danielebarchiesi@0: $roles = array_intersect_key(user_roles(), $account->roles); danielebarchiesi@0: $replacements[$original] = token_render_array($roles, $options); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if (variable_get('user_pictures', 0) && !empty($account->picture) && ($picture_tokens = token_find_with_prefix($tokens, 'picture'))) { danielebarchiesi@0: // @todo Remove when core bug http://drupal.org/node/978028 is fixed. danielebarchiesi@0: $account->picture->description = ''; danielebarchiesi@0: $replacements += token_generate('file', $picture_tokens, array('file' => $account->picture), $options); danielebarchiesi@0: } danielebarchiesi@0: if ($url_tokens = token_find_with_prefix($tokens, 'url')) { danielebarchiesi@0: $replacements += token_generate('url', $url_tokens, entity_uri('user', $account), $options); danielebarchiesi@0: } danielebarchiesi@0: if ($role_tokens = token_find_with_prefix($tokens, 'roles')) { danielebarchiesi@0: // The roles array may be set from checkbox values so ensure it always danielebarchiesi@0: // has 'proper' data with the role names. danielebarchiesi@0: $roles = array_intersect_key(user_roles(), $account->roles); danielebarchiesi@0: $replacements += token_generate('array', $role_tokens, array('array' => $roles), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Current user tokens. danielebarchiesi@0: if ($type == 'current-user') { danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'ip-address': danielebarchiesi@0: $ip = ip_address(); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($ip) : $ip; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Menu link tokens. danielebarchiesi@0: if ($type == 'menu-link' && !empty($data['menu-link'])) { danielebarchiesi@0: $link = (array) $data['menu-link']; danielebarchiesi@0: danielebarchiesi@0: if (!isset($link['title'])) { danielebarchiesi@0: // Re-load the link if it was not loaded via token_menu_link_load(). danielebarchiesi@0: $link = token_menu_link_load($link['mlid']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'mlid': danielebarchiesi@0: $replacements[$original] = $link['mlid']; danielebarchiesi@0: break; danielebarchiesi@0: case 'title': danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($link['title']) : $link['title']; danielebarchiesi@0: break; danielebarchiesi@0: case 'url': danielebarchiesi@0: $replacements[$original] = url($link['href'], $url_options); danielebarchiesi@0: break; danielebarchiesi@0: case 'parent': danielebarchiesi@0: if (!empty($link['plid']) && $parent = token_menu_link_load($link['plid'])) { danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($parent['title']) : $parent['title']; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: case 'parents': danielebarchiesi@0: if ($parents = token_menu_link_load_all_parents($link['mlid'])) { danielebarchiesi@0: $replacements[$original] = token_render_array($parents, $options); danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: case 'root'; danielebarchiesi@0: if (!empty($link['p1']) && $link['p1'] != $link['mlid'] && $root = token_menu_link_load($link['p1'])) { danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($root['title']) : $root['title']; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if (!empty($link['plid']) && ($source_tokens = token_find_with_prefix($tokens, 'parent')) && $parent = token_menu_link_load($link['plid'])) { danielebarchiesi@0: $replacements += token_generate('menu-link', $source_tokens, array('menu-link' => $parent), $options); danielebarchiesi@0: } danielebarchiesi@0: // [menu-link:parents:*] chained tokens. danielebarchiesi@0: if ($parents_tokens = token_find_with_prefix($tokens, 'parents')) { danielebarchiesi@0: if ($parents = token_menu_link_load_all_parents($link['mlid'])) { danielebarchiesi@0: $replacements += token_generate('array', $parents_tokens, array('array' => $parents), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: if (!empty($link['p1']) && $link['p1'] != $link['mlid'] && ($root_tokens = token_find_with_prefix($tokens, 'root')) && $root = token_menu_link_load($link['p1'])) { danielebarchiesi@0: $replacements += token_generate('menu-link', $root_tokens, array('menu-link' => $root), $options); danielebarchiesi@0: } danielebarchiesi@0: if ($url_tokens = token_find_with_prefix($tokens, 'url')) { danielebarchiesi@0: $replacements += token_generate('url', $url_tokens, array('path' => $link['href']), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Current page tokens. danielebarchiesi@0: if ($type == 'current-page') { danielebarchiesi@0: $current_path = current_path(); danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'title': danielebarchiesi@0: $title = drupal_get_title(); danielebarchiesi@0: $replacements[$original] = $sanitize ? $title : decode_entities($title); danielebarchiesi@0: break; danielebarchiesi@0: case 'url': danielebarchiesi@0: $replacements[$original] = url($current_path, $url_options); danielebarchiesi@0: break; danielebarchiesi@0: case 'page-number': danielebarchiesi@0: if ($page = filter_input(INPUT_GET, 'page')) { danielebarchiesi@0: // @see PagerDefault::execute() danielebarchiesi@0: $pager_page_array = explode(',', $page); danielebarchiesi@0: $page = $pager_page_array[0]; danielebarchiesi@0: } danielebarchiesi@0: $replacements[$original] = (int) $page + 1; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // @deprecated danielebarchiesi@0: // [current-page:arg] dynamic tokens. danielebarchiesi@0: if ($arg_tokens = token_find_with_prefix($tokens, 'arg')) { danielebarchiesi@0: foreach ($arg_tokens as $name => $original) { danielebarchiesi@0: if (is_numeric($name) && ($arg = arg($name)) && isset($arg)) { danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($arg) : $arg; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [current-page:query] dynamic tokens. danielebarchiesi@0: if ($query_tokens = token_find_with_prefix($tokens, 'query')) { danielebarchiesi@0: foreach ($query_tokens as $name => $original) { danielebarchiesi@0: // @todo Should this use filter_input()? danielebarchiesi@0: if (isset($_GET[$name])) { danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($_GET[$name]) : $_GET[$name]; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if ($url_tokens = token_find_with_prefix($tokens, 'url')) { danielebarchiesi@0: $replacements += token_generate('url', $url_tokens, array('path' => $current_path), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // URL tokens. danielebarchiesi@0: if ($type == 'url' && !empty($data['path'])) { danielebarchiesi@0: $path = $data['path']; danielebarchiesi@0: danielebarchiesi@0: if (isset($data['options'])) { danielebarchiesi@0: // Merge in the URL options if available. danielebarchiesi@0: $url_options = $data['options'] + $url_options; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'path': danielebarchiesi@0: $value = empty($url_options['alias']) ? drupal_get_path_alias($path, $language_code) : $path; danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($value) : $value; danielebarchiesi@0: break; danielebarchiesi@0: case 'alias': danielebarchiesi@0: // @deprecated danielebarchiesi@0: $alias = drupal_get_path_alias($path, $language_code); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($alias) : $alias; danielebarchiesi@0: break; danielebarchiesi@0: case 'absolute': danielebarchiesi@0: $replacements[$original] = url($path, $url_options); danielebarchiesi@0: break; danielebarchiesi@0: case 'relative': danielebarchiesi@0: $replacements[$original] = url($path, array('absolute' => FALSE) + $url_options); danielebarchiesi@0: break; danielebarchiesi@0: case 'brief': danielebarchiesi@0: $replacements[$original] = preg_replace(array('!^https?://!', '!/$!'), '', url($path, $url_options)); danielebarchiesi@0: break; danielebarchiesi@0: case 'unaliased': danielebarchiesi@0: $replacements[$original] = url($path, array('alias' => TRUE) + $url_options); danielebarchiesi@0: break; danielebarchiesi@0: case 'args': danielebarchiesi@0: $value = empty($url_options['alias']) ? drupal_get_path_alias($path, $language_code) : $path; danielebarchiesi@0: $replacements[$original] = token_render_array(arg(NULL, $value), $options); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [url:arg:*] chained tokens. danielebarchiesi@0: if ($arg_tokens = token_find_with_prefix($tokens, 'args')) { danielebarchiesi@0: $value = empty($url_options['alias']) ? drupal_get_path_alias($path, $language_code) : $path; danielebarchiesi@0: $replacements += token_generate('array', $arg_tokens, array('array' => arg(NULL, $value)), $options); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [url:unaliased:*] chained tokens. danielebarchiesi@0: if ($unaliased_tokens = token_find_with_prefix($tokens, 'unaliased')) { danielebarchiesi@0: $unaliased_token_data['path'] = $path; danielebarchiesi@0: $unaliased_token_data['options'] = isset($data['options']) ? $data['options'] : array(); danielebarchiesi@0: $unaliased_token_data['options']['alias'] = TRUE; danielebarchiesi@0: $replacements += token_generate('url', $unaliased_tokens, $unaliased_token_data, $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Entity tokens. danielebarchiesi@0: if (!empty($data[$type]) && $entity_type = token_get_entity_mapping('token', $type)) { danielebarchiesi@0: $entity = $data[$type]; danielebarchiesi@0: danielebarchiesi@0: // Sometimes taxonomy terms are not properly loaded. danielebarchiesi@0: // @see http://drupal.org/node/870528 danielebarchiesi@0: if ($entity_type == 'taxonomy_term' && !isset($entity->vocabulary_machine_name)) { danielebarchiesi@0: $entity->vocabulary_machine_name = db_query("SELECT machine_name FROM {taxonomy_vocabulary} WHERE vid = :vid", array(':vid' => $entity->vid))->fetchField(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'url': danielebarchiesi@0: if (_token_module($type, 'url') == 'token' && $uri = entity_uri($entity_type, $entity)) { danielebarchiesi@0: $replacements[$original] = url($uri['path'], $uri['options']); danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: danielebarchiesi@0: case 'original': danielebarchiesi@0: if (_token_module($type, 'original') == 'token' && !empty($entity->original)) { danielebarchiesi@0: $label = entity_label($entity_type, $entity->original); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($label) : $label; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [entity:url:*] chained tokens. danielebarchiesi@0: if (($url_tokens = token_find_with_prefix($tokens, 'url')) && _token_module($type, 'url') == 'token') { danielebarchiesi@0: $replacements += token_generate('url', $url_tokens, entity_uri($entity_type, $entity), $options); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [entity:original:*] chained tokens. danielebarchiesi@0: if (($original_tokens = token_find_with_prefix($tokens, 'original')) && _token_module($type, 'original') == 'token' && !empty($entity->original)) { danielebarchiesi@0: $replacements += token_generate($type, $original_tokens, array($type => $entity->original), $options); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Pass through to an generic 'entity' token type generation. danielebarchiesi@0: $entity_data = array( danielebarchiesi@0: 'entity_type' => $entity_type, danielebarchiesi@0: 'entity' => $entity, danielebarchiesi@0: 'token_type' => $type, danielebarchiesi@0: ); danielebarchiesi@0: // @todo Investigate passing through more data like everything from entity_extract_ids(). danielebarchiesi@0: $replacements += token_generate('entity', $tokens, $entity_data, $options); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Array tokens. danielebarchiesi@0: if ($type == 'array' && !empty($data['array']) && is_array($data['array'])) { danielebarchiesi@0: $array = $data['array']; danielebarchiesi@0: danielebarchiesi@0: $sort = isset($options['array sort']) ? $options['array sort'] : TRUE; danielebarchiesi@0: $keys = element_children($array, $sort); danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'first': danielebarchiesi@0: $value = $array[$keys[0]]; danielebarchiesi@0: $value = is_array($value) ? render($value) : (string) $value; danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($value) : $value; danielebarchiesi@0: break; danielebarchiesi@0: case 'last': danielebarchiesi@0: $value = $array[$keys[count($keys) - 1]]; danielebarchiesi@0: $value = is_array($value) ? render($value) : (string) $value; danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($value) : $value; danielebarchiesi@0: break; danielebarchiesi@0: case 'count': danielebarchiesi@0: $replacements[$original] = count($keys); danielebarchiesi@0: break; danielebarchiesi@0: case 'keys': danielebarchiesi@0: $replacements[$original] = token_render_array($keys, $options); danielebarchiesi@0: break; danielebarchiesi@0: case 'reversed': danielebarchiesi@0: $reversed = array_reverse($array, TRUE); danielebarchiesi@0: $replacements[$original] = token_render_array($reversed, $options); danielebarchiesi@0: break; danielebarchiesi@0: case 'join': danielebarchiesi@0: $replacements[$original] = token_render_array($array, array('join' => '') + $options); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [array:value:*] dynamic tokens. danielebarchiesi@0: if ($value_tokens = token_find_with_prefix($tokens, 'value')) { danielebarchiesi@0: foreach ($value_tokens as $key => $original) { danielebarchiesi@0: if ($key[0] !== '#' && isset($array[$key])) { danielebarchiesi@0: $replacements[$original] = token_render_array_value($array[$key], $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [array:join:*] dynamic tokens. danielebarchiesi@0: if ($join_tokens = token_find_with_prefix($tokens, 'join')) { danielebarchiesi@0: foreach ($join_tokens as $join => $original) { danielebarchiesi@0: $replacements[$original] = token_render_array($array, array('join' => $join) + $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [array:keys:*] chained tokens. danielebarchiesi@0: if ($key_tokens = token_find_with_prefix($tokens, 'keys')) { danielebarchiesi@0: $replacements += token_generate('array', $key_tokens, array('array' => $keys), $options); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [array:reversed:*] chained tokens. danielebarchiesi@0: if ($reversed_tokens = token_find_with_prefix($tokens, 'reversed')) { danielebarchiesi@0: $replacements += token_generate('array', $reversed_tokens, array('array' => array_reverse($array, TRUE)), array('array sort' => FALSE) + $options); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // @todo Handle if the array values are not strings and could be chained. danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Random tokens. danielebarchiesi@0: if ($type == 'random') { danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'number': danielebarchiesi@0: $replacements[$original] = mt_rand(); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // [custom:hash:*] dynamic token. danielebarchiesi@0: if ($hash_tokens = token_find_with_prefix($tokens, 'hash')) { danielebarchiesi@0: $algos = hash_algos(); danielebarchiesi@0: foreach ($hash_tokens as $name => $original) { danielebarchiesi@0: if (in_array($name, $algos)) { danielebarchiesi@0: $replacements[$original] = hash($name, drupal_random_bytes(55)); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If $type is a token type, $data[$type] is empty but $data[$entity_type] is danielebarchiesi@0: // not, re-run token replacements. danielebarchiesi@0: if (empty($data[$type]) && ($entity_type = token_get_entity_mapping('token', $type)) && $entity_type != $type && !empty($data[$entity_type]) && empty($options['recursive'])) { danielebarchiesi@0: $data[$type] = $data[$entity_type]; danielebarchiesi@0: $options['recursive'] = TRUE; danielebarchiesi@0: $replacements += module_invoke_all('tokens', $type, $tokens, $data, $options); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If the token type specifics a 'needs-data' value, and the value is not danielebarchiesi@0: // present in $data, then throw an error. danielebarchiesi@0: if (!empty($GLOBALS['drupal_test_info']['test_run_id'])) { danielebarchiesi@0: // Only check when tests are running. danielebarchiesi@0: $type_info = token_get_info($type); danielebarchiesi@0: if (!empty($type_info['needs-data']) && !isset($data[$type_info['needs-data']])) { danielebarchiesi@0: trigger_error(t('Attempting to perform token replacement for token type %type without required data', array('%type' => $type)), E_USER_WARNING); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $replacements; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_tokens_alter(). danielebarchiesi@0: * danielebarchiesi@0: * Fix existing core tokens that do not work correctly. danielebarchiesi@0: */ danielebarchiesi@0: function token_tokens_alter(array &$replacements, array $context) { danielebarchiesi@0: $options = $context['options']; danielebarchiesi@0: danielebarchiesi@0: $sanitize = !empty($options['sanitize']); danielebarchiesi@0: $langcode = !empty($options['language']->language) ? $options['language']->language : NULL; danielebarchiesi@0: danielebarchiesi@0: // Comment token fixes. danielebarchiesi@0: if ($context['type'] == 'comment' && !empty($context['data']['comment'])) { danielebarchiesi@0: $comment = $context['data']['comment']; danielebarchiesi@0: danielebarchiesi@0: foreach ($context['tokens'] as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'name': danielebarchiesi@0: case 'author': danielebarchiesi@0: // @todo Remove when http://drupal.org/node/920056 is fixed. danielebarchiesi@0: if (!empty($comment->uid)) { danielebarchiesi@0: $account = user_load($comment->uid); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $account = drupal_anonymous_user(); danielebarchiesi@0: $account->name = $comment->name; danielebarchiesi@0: } danielebarchiesi@0: $name = format_username($account); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($name) : $name; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Node token fixes. danielebarchiesi@0: if ($context['type'] == 'node' && !empty($context['data']['node'])) { danielebarchiesi@0: $node = $context['data']['node']; danielebarchiesi@0: danielebarchiesi@0: foreach ($context['tokens'] as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'author': danielebarchiesi@0: // http://drupal.org/node/1185842 was fixed in core release 7.9. danielebarchiesi@0: if (version_compare(VERSION, '7.9', '<')) { danielebarchiesi@0: $account = user_load($node->uid); danielebarchiesi@0: $name = format_username($account); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($name) : $name; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // File token fixes. danielebarchiesi@0: if ($context['type'] == 'file' && !empty($context['data']['file'])) { danielebarchiesi@0: $file = $context['data']['file']; danielebarchiesi@0: danielebarchiesi@0: foreach ($context['tokens'] as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'owner': danielebarchiesi@0: // http://drupal.org/node/978028 was fixed in core release 7.7. danielebarchiesi@0: if (version_compare(VERSION, '7.7', '<')) { danielebarchiesi@0: $account = user_load($file->uid); danielebarchiesi@0: $name = format_username($account); danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($name) : $name; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_token_info() on behalf of book.module. danielebarchiesi@0: */ danielebarchiesi@0: function book_token_info() { danielebarchiesi@0: $info['tokens']['node']['book'] = array( danielebarchiesi@0: 'name' => t('Book'), danielebarchiesi@0: 'description' => t('The book page associated with the node.'), danielebarchiesi@0: 'type' => 'menu-link', danielebarchiesi@0: ); danielebarchiesi@0: return $info; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_tokens() on behalf of book.module. danielebarchiesi@0: */ danielebarchiesi@0: function book_tokens($type, $tokens, array $data = array(), array $options = array()) { danielebarchiesi@0: $replacements = array(); danielebarchiesi@0: $sanitize = !empty($options['sanitize']); danielebarchiesi@0: danielebarchiesi@0: // Node tokens. danielebarchiesi@0: if ($type == 'node' && !empty($data['node'])) { danielebarchiesi@0: $node = $data['node']; danielebarchiesi@0: danielebarchiesi@0: if (!empty($node->book['mlid'])) { danielebarchiesi@0: $link = token_book_link_load($node->book['mlid']); danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'book': danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($link['title']) : $link['title']; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if ($book_tokens = token_find_with_prefix($tokens, 'book')) { danielebarchiesi@0: $replacements += token_generate('menu-link', $book_tokens, array('menu-link' => $link), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $replacements; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_token_info() on behalf of menu.module. danielebarchiesi@0: */ danielebarchiesi@0: function menu_token_info() { danielebarchiesi@0: // Menu tokens. danielebarchiesi@0: $info['types']['menu'] = array( danielebarchiesi@0: 'name' => t('Menus'), danielebarchiesi@0: 'description' => t('Tokens related to menus.'), danielebarchiesi@0: 'needs-data' => 'menu', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu']['name'] = array( danielebarchiesi@0: 'name' => t('Name'), danielebarchiesi@0: 'description' => t("The name of the menu."), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu']['machine-name'] = array( danielebarchiesi@0: 'name' => t('Machine-readable name'), danielebarchiesi@0: 'description' => t("The unique machine-readable name of the menu."), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu']['description'] = array( danielebarchiesi@0: 'name' => t('Description'), danielebarchiesi@0: 'description' => t('The optional description of the menu.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu']['menu-link-count'] = array( danielebarchiesi@0: 'name' => t('Menu link count'), danielebarchiesi@0: 'description' => t('The number of menu links belonging to the menu.'), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu']['edit-url'] = array( danielebarchiesi@0: 'name' => t('Edit URL'), danielebarchiesi@0: 'description' => t("The URL of the menu's edit page."), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $info['tokens']['menu-link']['menu'] = array( danielebarchiesi@0: 'name' => t('Menu'), danielebarchiesi@0: 'description' => t('The menu of the menu link.'), danielebarchiesi@0: 'type' => 'menu', danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['menu-link']['edit-url'] = array( danielebarchiesi@0: 'name' => t('Edit URL'), danielebarchiesi@0: 'description' => t("The URL of the menu link's edit page."), danielebarchiesi@0: ); danielebarchiesi@0: $info['tokens']['node']['menu-link'] = array( danielebarchiesi@0: 'name' => t('Menu link'), danielebarchiesi@0: 'description' => t("The menu link for this node."), danielebarchiesi@0: 'type' => 'menu-link', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return $info; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_tokens() on behalf of menu.module. danielebarchiesi@0: */ danielebarchiesi@0: function menu_tokens($type, $tokens, array $data = array(), array $options = array()) { danielebarchiesi@0: $replacements = array(); danielebarchiesi@0: danielebarchiesi@0: $url_options = array('absolute' => TRUE); danielebarchiesi@0: if (isset($options['language'])) { danielebarchiesi@0: $url_options['language'] = $options['language']; danielebarchiesi@0: $language_code = $options['language']->language; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $language_code = NULL; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $sanitize = !empty($options['sanitize']); danielebarchiesi@0: danielebarchiesi@0: // Node tokens. danielebarchiesi@0: if ($type == 'node' && !empty($data['node'])) { danielebarchiesi@0: $node = $data['node']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'menu-link': danielebarchiesi@0: if ($link = token_node_menu_link_load($node)) { danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($link['title']) : $link['title']; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if ($menu_tokens = token_find_with_prefix($tokens, 'menu-link')) { danielebarchiesi@0: if ($link = token_node_menu_link_load($node)) { danielebarchiesi@0: $replacements += token_generate('menu-link', $menu_tokens, array('menu-link' => $link), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Menu link tokens. danielebarchiesi@0: if ($type == 'menu-link' && !empty($data['menu-link'])) { danielebarchiesi@0: $link = (array) $data['menu-link']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'menu': danielebarchiesi@0: if ($menu = menu_load($link['menu_name'])) { danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($menu['title']) : $menu['title']; danielebarchiesi@0: } danielebarchiesi@0: break; danielebarchiesi@0: case 'edit-url': danielebarchiesi@0: $replacements[$original] = url("admin/structure/menu/item/{$link['mlid']}/edit", $url_options); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: if (($menu_tokens = token_find_with_prefix($tokens, 'menu')) && $menu = menu_load($link['menu_name'])) { danielebarchiesi@0: $replacements += token_generate('menu', $menu_tokens, array('menu' => $menu), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Menu tokens. danielebarchiesi@0: if ($type == 'menu' && !empty($data['menu'])) { danielebarchiesi@0: $menu = (array) $data['menu']; danielebarchiesi@0: danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: switch ($name) { danielebarchiesi@0: case 'name': danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($menu['title']) : $menu['title']; danielebarchiesi@0: break; danielebarchiesi@0: case 'machine-name': danielebarchiesi@0: // This is a machine name so does not ever need to be sanitized. danielebarchiesi@0: $replacements[$original] = $menu['menu_name']; danielebarchiesi@0: break; danielebarchiesi@0: case 'description': danielebarchiesi@0: $replacements[$original] = $sanitize ? filter_xss($menu['description']) : $menu['description']; danielebarchiesi@0: break; danielebarchiesi@0: case 'menu-link-count': danielebarchiesi@0: $query = db_select('menu_links'); danielebarchiesi@0: $query->condition('menu_name', $menu['menu_name']); danielebarchiesi@0: $query->addTag('menu_menu_link_count'); danielebarchiesi@0: $count = $query->countQuery()->execute()->fetchField(); danielebarchiesi@0: $replacements[$original] = (int) $count; danielebarchiesi@0: break; danielebarchiesi@0: case 'edit-url': danielebarchiesi@0: $replacements[$original] = url("admin/structure/menu/manage/" . $menu['menu_name'], $url_options); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $replacements; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_token_info() on behalf of profile.module. danielebarchiesi@0: */ danielebarchiesi@0: function profile_token_info() { danielebarchiesi@0: $info = array(); danielebarchiesi@0: danielebarchiesi@0: foreach (_token_profile_fields() as $field) { danielebarchiesi@0: $info['tokens']['user'][$field->token_name] = array( danielebarchiesi@0: 'name' => check_plain($field->title), danielebarchiesi@0: 'description' => t('@category @type field.', array('@category' => drupal_ucfirst($field->category), '@type' => $field->type)), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: switch ($field->type) { danielebarchiesi@0: case 'date': danielebarchiesi@0: $info['tokens']['user'][$field->token_name]['type'] = 'date'; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $info; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_tokens() on behalf of profile.module. danielebarchiesi@0: */ danielebarchiesi@0: function profile_tokens($type, $tokens, array $data = array(), array $options = array()) { danielebarchiesi@0: $replacements = array(); danielebarchiesi@0: $sanitize = !empty($options['sanitize']); danielebarchiesi@0: $language_code = isset($options['language']) ? $options['language']->language : NULL; danielebarchiesi@0: danielebarchiesi@0: if ($type == 'user' && !empty($data['user'])) { danielebarchiesi@0: $account = $data['user']; danielebarchiesi@0: danielebarchiesi@0: // Load profile fields if this is the global user account. danielebarchiesi@0: // @see http://drupal.org/node/361471 danielebarchiesi@0: // @see http://drupal.org/node/967330 danielebarchiesi@0: if ($account->uid == $GLOBALS['user']->uid && isset($account->timestamp)) { danielebarchiesi@0: $profile_users = array($account->uid => $account); danielebarchiesi@0: profile_user_load($profile_users); danielebarchiesi@0: $account = $profile_users[$account->uid]; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $profile_fields = _token_profile_fields(); danielebarchiesi@0: foreach ($tokens as $name => $original) { danielebarchiesi@0: if (isset($profile_fields[$name]) && !empty($account->{$profile_fields[$name]->name})) { danielebarchiesi@0: $value = $account->{$profile_fields[$name]->name}; danielebarchiesi@0: switch ($profile_fields[$name]->type) { danielebarchiesi@0: case 'textarea': danielebarchiesi@0: $replacements[$original] = $sanitize ? check_markup($value, filter_default_format($account), '', TRUE) : $value; danielebarchiesi@0: break; danielebarchiesi@0: case 'date': danielebarchiesi@0: $timestamp = gmmktime(0, 0, 0, $value['month'], $value['day'], $value['year']); danielebarchiesi@0: $replacements[$original] = format_date($timestamp, 'medium', '', NULL, $language_code); danielebarchiesi@0: break; danielebarchiesi@0: case 'url': danielebarchiesi@0: $replacements[$original] = $sanitize ? check_url($value) : $value; danielebarchiesi@0: break; danielebarchiesi@0: case 'checkbox': danielebarchiesi@0: // Checkbox field if checked should return the text. danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($profile_fields[$name]->title) : $profile_fields[$name]->title; danielebarchiesi@0: break; danielebarchiesi@0: case 'list': danielebarchiesi@0: $value = preg_split("/[,\n\r]/", $value); danielebarchiesi@0: $value = array_map('trim', $value); danielebarchiesi@0: $value = implode(', ', $value); danielebarchiesi@0: // Intentionally fall through to the default condition. danielebarchiesi@0: default: danielebarchiesi@0: $replacements[$original] = $sanitize ? check_plain($value) : $value; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Chained token relationships. danielebarchiesi@0: foreach ($profile_fields as $field) { danielebarchiesi@0: if ($field->type == 'date' && isset($account->{$field->name}) && $field_tokens = token_find_with_prefix($tokens, $field->token_name)) { danielebarchiesi@0: $date = $account->{$field->name}; danielebarchiesi@0: $replacements += token_generate('date', $field_tokens, array('date' => gmmktime(0, 0, 0, $date['month'], $date['day'], $date['year'])), $options); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $replacements; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Fetch an array of profile field objects, keyed by token name. danielebarchiesi@0: */ danielebarchiesi@0: function _token_profile_fields() { danielebarchiesi@0: $fields = &drupal_static(__FUNCTION__); danielebarchiesi@0: danielebarchiesi@0: if (!isset($fields)) { danielebarchiesi@0: $fields = array(); danielebarchiesi@0: $results = db_query("SELECT name, title, category, type FROM {profile_field}"); danielebarchiesi@0: foreach ($results as $field) { danielebarchiesi@0: $field->token_name = token_clean_token_name($field->name); danielebarchiesi@0: $fields[$field->token_name] = $field; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $fields; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Fetch an array of field data used for tokens. danielebarchiesi@0: */ danielebarchiesi@0: function _token_field_info($field_name = NULL) { danielebarchiesi@0: $info = &drupal_static(__FUNCTION__); danielebarchiesi@0: danielebarchiesi@0: if (!isset($fields)) { danielebarchiesi@0: if ($cached = cache_get('field:info', 'cache_token')) { danielebarchiesi@0: $info = $cached->data; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $info = array(); danielebarchiesi@0: danielebarchiesi@0: $fields = field_info_fields(); danielebarchiesi@0: $instances = field_info_instances(); danielebarchiesi@0: $type_info = field_info_field_types(); danielebarchiesi@0: $entity_info = entity_get_info(); danielebarchiesi@0: danielebarchiesi@0: foreach ($fields as $field) { danielebarchiesi@0: $key = $field['field_name']; danielebarchiesi@0: if (!empty($field['bundles'])) { danielebarchiesi@0: foreach (array_keys($field['bundles']) as $entity) { danielebarchiesi@0: // Make sure a token type exists for this entity. danielebarchiesi@0: $token_type = token_get_entity_mapping('entity', $entity); danielebarchiesi@0: if (empty($token_type)) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $info[$key]['token types'][] = $token_type; danielebarchiesi@0: $info[$key] += array('labels' => array(), 'bundles' => array()); danielebarchiesi@0: danielebarchiesi@0: // Find which label is most commonly used. danielebarchiesi@0: foreach ($field['bundles'][$entity] as $bundle) { danielebarchiesi@0: // Field information will included fields attached to disabled danielebarchiesi@0: // bundles, so check that the bundle exists before provided a danielebarchiesi@0: // token for it. danielebarchiesi@0: // @see http://drupal.org/node/1252566 danielebarchiesi@0: if (!isset($entity_info[$entity]['bundles'][$bundle])) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $info[$key]['labels'][] = $instances[$entity][$bundle][$key]['label']; danielebarchiesi@0: $info[$key]['bundles'][$token_type][$bundle] = $entity_info[$entity]['bundles'][$bundle]['label']; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (isset($info[$key])) { danielebarchiesi@0: $labels = array_count_values($info[$key]['labels']); danielebarchiesi@0: arsort($labels); danielebarchiesi@0: $info[$key]['label'] = check_plain(key($labels)); danielebarchiesi@0: danielebarchiesi@0: // Generate a description for the token. danielebarchiesi@0: $info[$key]['description'] = t('@type field.', array('@type' => $type_info[$field['type']]['label'])); danielebarchiesi@0: if ($also_known_as = array_unique(array_diff($info[$key]['labels'], array($info[$key]['label'])))) { danielebarchiesi@0: $info[$key]['description'] .= ' ' . t('Also known as %labels.', array('%labels' => implode(', ', $also_known_as))); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: drupal_alter('token_field_info', $info); danielebarchiesi@0: cache_set('field:info', $info, 'cache_token'); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (isset($field_name)) { danielebarchiesi@0: return isset($info[$field_name]) ? $info[$field_name] : FALSE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $info; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_token_info_alter() on behalf of field.module. danielebarchiesi@0: * danielebarchiesi@0: * We use hook_token_info_alter() rather than hook_token_info() as other danielebarchiesi@0: * modules may already have defined some field tokens. danielebarchiesi@0: */ danielebarchiesi@0: function field_token_info_alter(&$info) { danielebarchiesi@0: $fields = _token_field_info(); danielebarchiesi@0: danielebarchiesi@0: // Attach field tokens to their respecitve entity tokens. danielebarchiesi@0: foreach ($fields as $field_name => $field) { danielebarchiesi@0: foreach (array_keys($field['bundles']) as $token_type) { danielebarchiesi@0: // If a token already exists for this field, then don't add it. danielebarchiesi@0: if (isset($info['tokens'][$token_type][$field_name])) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Ensure the tokens exist. danielebarchiesi@0: if (!isset($info['types'][$token_type]) || !isset($info['tokens'][$token_type])) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if ($token_type == 'comment' && $field_name == 'comment_body') { danielebarchiesi@0: // Core provides the comment field as [comment:body]. danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $info['tokens'][$token_type][$field_name] = array( danielebarchiesi@0: // Note that label and description have already been sanitized by _token_field_info(). danielebarchiesi@0: 'name' => $field['label'], danielebarchiesi@0: 'description' => $field['description'], danielebarchiesi@0: 'module' => 'token', danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_tokens() on behalf of field.module. danielebarchiesi@0: */ danielebarchiesi@0: function field_tokens($type, $tokens, array $data = array(), array $options = array()) { danielebarchiesi@0: $replacements = array(); danielebarchiesi@0: $sanitize = !empty($options['sanitize']); danielebarchiesi@0: $langcode = isset($options['language']) ? $options['language']->language : NULL; danielebarchiesi@0: danielebarchiesi@0: // Entity tokens. danielebarchiesi@0: if ($type == 'entity' && !empty($data['entity_type']) && !empty($data['entity']) && !empty($data['token_type'])) { danielebarchiesi@0: $entity_type = $data['entity_type']; danielebarchiesi@0: danielebarchiesi@0: // The field API does weird stuff to the entity, so let's clone it. danielebarchiesi@0: $entity = clone $data['entity']; danielebarchiesi@0: danielebarchiesi@0: // Reset the prepared view flag in case token generation is called from danielebarchiesi@0: // inside field_attach_view(). danielebarchiesi@0: unset($entity->_field_view_prepared); danielebarchiesi@0: danielebarchiesi@0: list(, , $bundle) = entity_extract_ids($entity_type, $entity); danielebarchiesi@0: $fields = field_info_instances($entity_type, $bundle); danielebarchiesi@0: danielebarchiesi@0: foreach (array_keys($fields) as $field_name) { danielebarchiesi@0: // Do not continue if the field is empty. danielebarchiesi@0: if (empty($entity->{$field_name})) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Replace the [entity:field-name] token only if token module added this danielebarchiesi@0: // token. danielebarchiesi@0: if (isset($tokens[$field_name]) && _token_module($data['token_type'], $field_name) == 'token') { danielebarchiesi@0: $original = $tokens[$field_name]; danielebarchiesi@0: danielebarchiesi@0: $field_output = field_view_field($entity_type, $entity, $field_name, 'token', $langcode); danielebarchiesi@0: $field_output['#token_options'] = $options; danielebarchiesi@0: $field_output['#pre_render'][] = 'token_pre_render_field_token'; danielebarchiesi@0: $replacements[$original] = drupal_render($field_output); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Remove the cloned object from memory. danielebarchiesi@0: unset($entity); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $replacements; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Pre-render callback for field output used with tokens. danielebarchiesi@0: */ danielebarchiesi@0: function token_pre_render_field_token(&$elements) { danielebarchiesi@0: // Remove the field theme hook, attachments, and JavaScript states. danielebarchiesi@0: unset($elements['#theme']); danielebarchiesi@0: unset($elements['#states']); danielebarchiesi@0: unset($elements['#attached']); danielebarchiesi@0: danielebarchiesi@0: // Prevent multi-value fields from appearing smooshed together by appending danielebarchiesi@0: // a join suffix to all but the last value. danielebarchiesi@0: $deltas = element_get_visible_children($elements); danielebarchiesi@0: $count = count($deltas); danielebarchiesi@0: if ($count > 1) { danielebarchiesi@0: $join = isset($elements['#token_options']['join']) ? $elements['#token_options']['join'] : ", "; danielebarchiesi@0: foreach ($deltas as $index => $delta) { danielebarchiesi@0: // Do not add a suffix to the last item. danielebarchiesi@0: if ($index < ($count - 1)) { danielebarchiesi@0: $elements[$delta] += array('#suffix' => $join); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: return $elements; danielebarchiesi@0: }