annotate sites/all/modules/token/token.tokens.inc @ 9:830c812b520f

added smtp module
author root <root@paio.local>
date Mon, 28 Oct 2013 15:34:27 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Token callbacks for the token module.
danielebarchiesi@0 6 */
danielebarchiesi@0 7
danielebarchiesi@0 8 /**
danielebarchiesi@0 9 * Implements hook_token_info_alter().
danielebarchiesi@0 10 */
danielebarchiesi@0 11 function token_token_info_alter(&$info) {
danielebarchiesi@0 12 // Force 'date' type tokens to require input and add a 'current-date' type.
danielebarchiesi@0 13 // @todo Remove when http://drupal.org/node/943028 is fixed.
danielebarchiesi@0 14 $info['types']['date']['needs-data'] = 'date';
danielebarchiesi@0 15 $info['types']['current-date'] = array(
danielebarchiesi@0 16 'name' => t('Current date'),
danielebarchiesi@0 17 'description' => t('Tokens related to the current date and time.'),
danielebarchiesi@0 18 'type' => 'date',
danielebarchiesi@0 19 );
danielebarchiesi@0 20
danielebarchiesi@0 21 // Add a 'dynamic' key to any tokens that have chained but dynamic tokens.
danielebarchiesi@0 22 $info['tokens']['date']['custom']['dynamic'] = TRUE;
danielebarchiesi@0 23
danielebarchiesi@0 24 // The [file:size] may not always return in kilobytes.
danielebarchiesi@0 25 // @todo Remove when http://drupal.org/node/1193044 is fixed.
danielebarchiesi@0 26 $info['tokens']['file']['size']['description'] = t('The size of the file.');
danielebarchiesi@0 27
danielebarchiesi@0 28 // Remove deprecated tokens from being listed.
danielebarchiesi@0 29 unset($info['tokens']['node']['tnid']);
danielebarchiesi@0 30 unset($info['tokens']['node']['type']);
danielebarchiesi@0 31 unset($info['tokens']['node']['type-name']);
danielebarchiesi@0 32
danielebarchiesi@0 33 // Support 'url' type tokens for core tokens.
danielebarchiesi@0 34 if (isset($info['tokens']['comment']['url']) && module_exists('comment')) {
danielebarchiesi@0 35 $info['tokens']['comment']['url']['type'] = 'url';
danielebarchiesi@0 36 }
danielebarchiesi@0 37 $info['tokens']['node']['url']['type'] = 'url';
danielebarchiesi@0 38 if (isset($info['tokens']['term']['url']) && module_exists('taxonomy')) {
danielebarchiesi@0 39 $info['tokens']['term']['url']['type'] = 'url';
danielebarchiesi@0 40 }
danielebarchiesi@0 41 $info['tokens']['user']['url']['type'] = 'url';
danielebarchiesi@0 42
danielebarchiesi@0 43 // Add [token:url] tokens for any URI-able entities.
danielebarchiesi@0 44 $entities = entity_get_info();
danielebarchiesi@0 45 foreach ($entities as $entity => $entity_info) {
danielebarchiesi@0 46 if (!isset($entity_info['token type'])) {
danielebarchiesi@0 47 continue;
danielebarchiesi@0 48 }
danielebarchiesi@0 49
danielebarchiesi@0 50 $token_type = $entity_info['token type'];
danielebarchiesi@0 51 if (!isset($info['types'][$token_type]) || !isset($info['tokens'][$token_type])) {
danielebarchiesi@0 52 continue;
danielebarchiesi@0 53 }
danielebarchiesi@0 54
danielebarchiesi@0 55 // Add [entity:url] tokens if they do not already exist.
danielebarchiesi@0 56 // @todo Support entity:label
danielebarchiesi@0 57 if (!isset($info['tokens'][$token_type]['url']) && !empty($entity_info['uri callback'])) {
danielebarchiesi@0 58 $info['tokens'][$token_type]['url'] = array(
danielebarchiesi@0 59 'name' => t('URL'),
danielebarchiesi@0 60 'description' => t('The URL of the @entity.', array('@entity' => drupal_strtolower($entity_info['label']))),
danielebarchiesi@0 61 'module' => 'token',
danielebarchiesi@0 62 'type' => 'url',
danielebarchiesi@0 63 );
danielebarchiesi@0 64 }
danielebarchiesi@0 65
danielebarchiesi@0 66 // Add [entity:original] tokens if they do not already exist.
danielebarchiesi@0 67 if (!isset($info['tokens'][$token_type]['original'])) {
danielebarchiesi@0 68 $info['tokens'][$token_type]['original'] = array(
danielebarchiesi@0 69 'name' => t('Original @entity', array('@entity' => drupal_strtolower($entity_info['label']))),
danielebarchiesi@0 70 'description' => t('The original @entity data if the @entity is being updated or saved.', array('@entity' => drupal_strtolower($entity_info['label']))),
danielebarchiesi@0 71 'module' => 'token',
danielebarchiesi@0 72 'type' => $token_type,
danielebarchiesi@0 73 );
danielebarchiesi@0 74 }
danielebarchiesi@0 75 }
danielebarchiesi@0 76
danielebarchiesi@0 77 // Add support for custom date formats.
danielebarchiesi@0 78 // @todo Remove when http://drupal.org/node/1173706 is fixed.
danielebarchiesi@0 79 $date_format_types = system_get_date_types();
danielebarchiesi@0 80 foreach ($date_format_types as $date_format_type => $date_format_type_info) {
danielebarchiesi@0 81 if (!isset($info['tokens']['date'][$date_format_type])) {
danielebarchiesi@0 82 $info['tokens']['date'][$date_format_type] = array(
danielebarchiesi@0 83 'name' => check_plain($date_format_type_info['title']),
danielebarchiesi@0 84 'description' => t("A date in '@type' format. (%date)", array('@type' => $date_format_type, '%date' => format_date(REQUEST_TIME, $date_format_type))),
danielebarchiesi@0 85 'module' => 'token',
danielebarchiesi@0 86 );
danielebarchiesi@0 87 }
danielebarchiesi@0 88 }
danielebarchiesi@0 89 }
danielebarchiesi@0 90
danielebarchiesi@0 91 /**
danielebarchiesi@0 92 * Implements hook_token_info().
danielebarchiesi@0 93 */
danielebarchiesi@0 94 function token_token_info() {
danielebarchiesi@0 95 // Node tokens.
danielebarchiesi@0 96 $info['tokens']['node']['source'] = array(
danielebarchiesi@0 97 'name' => t('Translation source node'),
danielebarchiesi@0 98 'description' => t("The source node for this current node's translation set."),
danielebarchiesi@0 99 'type' => 'node',
danielebarchiesi@0 100 );
danielebarchiesi@0 101 $info['tokens']['node']['log'] = array(
danielebarchiesi@0 102 'name' => t('Revision log message'),
danielebarchiesi@0 103 'description' => t('The explanation of the most recent changes made to the node.'),
danielebarchiesi@0 104 );
danielebarchiesi@0 105 $info['tokens']['node']['content-type'] = array(
danielebarchiesi@0 106 'name' => t('Content type'),
danielebarchiesi@0 107 'description' => t('The content type of the node.'),
danielebarchiesi@0 108 'type' => 'content-type',
danielebarchiesi@0 109 );
danielebarchiesi@0 110
danielebarchiesi@0 111 // Content type tokens.
danielebarchiesi@0 112 $info['types']['content-type'] = array(
danielebarchiesi@0 113 'name' => t('Content types'),
danielebarchiesi@0 114 'description' => t('Tokens related to content types.'),
danielebarchiesi@0 115 'needs-data' => 'node_type',
danielebarchiesi@0 116 );
danielebarchiesi@0 117 $info['tokens']['content-type']['name'] = array(
danielebarchiesi@0 118 'name' => t('Name'),
danielebarchiesi@0 119 'description' => t('The name of the content type.'),
danielebarchiesi@0 120 );
danielebarchiesi@0 121 $info['tokens']['content-type']['machine-name'] = array(
danielebarchiesi@0 122 'name' => t('Machine-readable name'),
danielebarchiesi@0 123 'description' => t('The unique machine-readable name of the content type.'),
danielebarchiesi@0 124 );
danielebarchiesi@0 125 $info['tokens']['content-type']['description'] = array(
danielebarchiesi@0 126 'name' => t('Description'),
danielebarchiesi@0 127 'description' => t('The optional description of the content type.'),
danielebarchiesi@0 128 );
danielebarchiesi@0 129 $info['tokens']['content-type']['node-count'] = array(
danielebarchiesi@0 130 'name' => t('Node count'),
danielebarchiesi@0 131 'description' => t('The number of nodes belonging to the content type.'),
danielebarchiesi@0 132 );
danielebarchiesi@0 133 $info['tokens']['content-type']['edit-url'] = array(
danielebarchiesi@0 134 'name' => t('Edit URL'),
danielebarchiesi@0 135 'description' => t("The URL of the content type's edit page."),
danielebarchiesi@0 136 // 'type' => 'url',
danielebarchiesi@0 137 );
danielebarchiesi@0 138
danielebarchiesi@0 139 // Taxonomy term and vocabulary tokens.
danielebarchiesi@0 140 if (module_exists('taxonomy')) {
danielebarchiesi@0 141 $info['tokens']['term']['edit-url'] = array(
danielebarchiesi@0 142 'name' => t('Edit URL'),
danielebarchiesi@0 143 'description' => t("The URL of the taxonomy term's edit page."),
danielebarchiesi@0 144 // 'type' => 'url',
danielebarchiesi@0 145 );
danielebarchiesi@0 146 $info['tokens']['term']['parents'] = array(
danielebarchiesi@0 147 'name' => t('Parents'),
danielebarchiesi@0 148 'description' => t("An array of all the term's parents, starting with the root."),
danielebarchiesi@0 149 'type' => 'array',
danielebarchiesi@0 150 );
danielebarchiesi@0 151 $info['tokens']['term']['root'] = array(
danielebarchiesi@0 152 'name' => t('Root term'),
danielebarchiesi@0 153 'description' => t("The root term of the taxonomy term."),
danielebarchiesi@0 154 'type' => 'term',
danielebarchiesi@0 155 );
danielebarchiesi@0 156
danielebarchiesi@0 157 $info['tokens']['vocabulary']['machine-name'] = array(
danielebarchiesi@0 158 'name' => t('Machine-readable name'),
danielebarchiesi@0 159 'description' => t('The unique machine-readable name of the vocabulary.'),
danielebarchiesi@0 160 );
danielebarchiesi@0 161 $info['tokens']['vocabulary']['edit-url'] = array(
danielebarchiesi@0 162 'name' => t('Edit URL'),
danielebarchiesi@0 163 'description' => t("The URL of the vocabulary's edit page."),
danielebarchiesi@0 164 // 'type' => 'url',
danielebarchiesi@0 165 );
danielebarchiesi@0 166 }
danielebarchiesi@0 167
danielebarchiesi@0 168 // File tokens.
danielebarchiesi@0 169 $info['tokens']['file']['basename'] = array(
danielebarchiesi@0 170 'name' => t('Base name'),
danielebarchiesi@0 171 'description' => t('The base name of the file.'),
danielebarchiesi@0 172 );
danielebarchiesi@0 173 $info['tokens']['file']['extension'] = array(
danielebarchiesi@0 174 'name' => t('Extension'),
danielebarchiesi@0 175 'description' => t('The extension of the file.'),
danielebarchiesi@0 176 );
danielebarchiesi@0 177 $info['tokens']['file']['size-raw'] = array(
danielebarchiesi@0 178 'name' => t('File byte size'),
danielebarchiesi@0 179 'description' => t('The size of the file, in bytes.'),
danielebarchiesi@0 180 );
danielebarchiesi@0 181
danielebarchiesi@0 182 // User tokens.
danielebarchiesi@0 183 // Add information on the restricted user tokens.
danielebarchiesi@0 184 $info['tokens']['user']['cancel-url'] = array(
danielebarchiesi@0 185 'name' => t('Account cancellation URL'),
danielebarchiesi@0 186 'description' => t('The URL of the confirm delete page for the user account.'),
danielebarchiesi@0 187 'restricted' => TRUE,
danielebarchiesi@0 188 // 'type' => 'url',
danielebarchiesi@0 189 );
danielebarchiesi@0 190 $info['tokens']['user']['one-time-login-url'] = array(
danielebarchiesi@0 191 'name' => t('One-time login URL'),
danielebarchiesi@0 192 'description' => t('The URL of the one-time login page for the user account.'),
danielebarchiesi@0 193 'restricted' => TRUE,
danielebarchiesi@0 194 // 'type' => 'url',
danielebarchiesi@0 195 );
danielebarchiesi@0 196 if (variable_get('user_pictures', 0)) {
danielebarchiesi@0 197 $info['tokens']['user']['picture'] = array(
danielebarchiesi@0 198 'name' => t('Picture'),
danielebarchiesi@0 199 'description' => t('The picture of the user.'),
danielebarchiesi@0 200 'type' => 'file',
danielebarchiesi@0 201 );
danielebarchiesi@0 202 }
danielebarchiesi@0 203 $info['tokens']['user']['roles'] = array(
danielebarchiesi@0 204 'name' => t('Roles'),
danielebarchiesi@0 205 'description' => t('The user roles associated with the user account.'),
danielebarchiesi@0 206 'type' => 'array',
danielebarchiesi@0 207 );
danielebarchiesi@0 208
danielebarchiesi@0 209 // Current user tokens.
danielebarchiesi@0 210 $info['tokens']['current-user']['ip-address'] = array(
danielebarchiesi@0 211 'name' => t('IP address'),
danielebarchiesi@0 212 'description' => 'The IP address of the current user.',
danielebarchiesi@0 213 );
danielebarchiesi@0 214
danielebarchiesi@0 215 // Menu link tokens (work regardless if menu module is enabled or not).
danielebarchiesi@0 216 $info['types']['menu-link'] = array(
danielebarchiesi@0 217 'name' => t('Menu links'),
danielebarchiesi@0 218 'description' => t('Tokens related to menu links.'),
danielebarchiesi@0 219 'needs-data' => 'menu-link',
danielebarchiesi@0 220 );
danielebarchiesi@0 221 $info['tokens']['menu-link']['mlid'] = array(
danielebarchiesi@0 222 'name' => t('Link ID'),
danielebarchiesi@0 223 'description' => t('The unique ID of the menu link.'),
danielebarchiesi@0 224 );
danielebarchiesi@0 225 $info['tokens']['menu-link']['title'] = array(
danielebarchiesi@0 226 'name' => t('Title'),
danielebarchiesi@0 227 'description' => t('The title of the menu link.'),
danielebarchiesi@0 228 );
danielebarchiesi@0 229 $info['tokens']['menu-link']['url'] = array(
danielebarchiesi@0 230 'name' => t('URL'),
danielebarchiesi@0 231 'description' => t('The URL of the menu link.'),
danielebarchiesi@0 232 'type' => 'url',
danielebarchiesi@0 233 );
danielebarchiesi@0 234 $info['tokens']['menu-link']['parent'] = array(
danielebarchiesi@0 235 'name' => t('Parent'),
danielebarchiesi@0 236 'description' => t("The menu link's parent."),
danielebarchiesi@0 237 'type' => 'menu-link',
danielebarchiesi@0 238 );
danielebarchiesi@0 239 $info['tokens']['menu-link']['parents'] = array(
danielebarchiesi@0 240 'name' => t('Parents'),
danielebarchiesi@0 241 'description' => t("An array of all the menu link's parents, starting with the root."),
danielebarchiesi@0 242 'type' => 'array',
danielebarchiesi@0 243 );
danielebarchiesi@0 244 $info['tokens']['menu-link']['root'] = array(
danielebarchiesi@0 245 'name' => t('Root'),
danielebarchiesi@0 246 'description' => t("The menu link's root."),
danielebarchiesi@0 247 'type' => 'menu-link',
danielebarchiesi@0 248 );
danielebarchiesi@0 249
danielebarchiesi@0 250 // Current page tokens.
danielebarchiesi@0 251 $info['types']['current-page'] = array(
danielebarchiesi@0 252 'name' => t('Current page'),
danielebarchiesi@0 253 'description' => t('Tokens related to the current page request.'),
danielebarchiesi@0 254 );
danielebarchiesi@0 255 $info['tokens']['current-page']['title'] = array(
danielebarchiesi@0 256 'name' => t('Title'),
danielebarchiesi@0 257 'description' => t('The title of the current page.'),
danielebarchiesi@0 258 );
danielebarchiesi@0 259 $info['tokens']['current-page']['url'] = array(
danielebarchiesi@0 260 'name' => t('URL'),
danielebarchiesi@0 261 'description' => t('The URL of the current page.'),
danielebarchiesi@0 262 'type' => 'url',
danielebarchiesi@0 263 );
danielebarchiesi@0 264 $info['tokens']['current-page']['page-number'] = array(
danielebarchiesi@0 265 'name' => t('Page number'),
danielebarchiesi@0 266 'description' => t('The page number of the current page when viewing paged lists.'),
danielebarchiesi@0 267 );
danielebarchiesi@0 268 $info['tokens']['current-page']['query'] = array(
danielebarchiesi@0 269 'name' => t('Query string value'),
danielebarchiesi@0 270 'description' => t('The value of a specific query string field of the current page.'),
danielebarchiesi@0 271 'dynamic' => TRUE,
danielebarchiesi@0 272 );
danielebarchiesi@0 273
danielebarchiesi@0 274 // URL tokens.
danielebarchiesi@0 275 $info['types']['url'] = array(
danielebarchiesi@0 276 'name' => t('URL'),
danielebarchiesi@0 277 'description' => t('Tokens related to URLs.'),
danielebarchiesi@0 278 'needs-data' => 'path',
danielebarchiesi@0 279 );
danielebarchiesi@0 280 $info['tokens']['url']['path'] = array(
danielebarchiesi@0 281 'name' => t('Path'),
danielebarchiesi@0 282 'description' => t('The path component of the URL.'),
danielebarchiesi@0 283 );
danielebarchiesi@0 284 $info['tokens']['url']['relative'] = array(
danielebarchiesi@0 285 'name' => t('Relative URL'),
danielebarchiesi@0 286 'description' => t('The relative URL.'),
danielebarchiesi@0 287 );
danielebarchiesi@0 288 $info['tokens']['url']['absolute'] = array(
danielebarchiesi@0 289 'name' => t('Absolute URL'),
danielebarchiesi@0 290 'description' => t('The absolute URL.'),
danielebarchiesi@0 291 );
danielebarchiesi@0 292 $info['tokens']['url']['brief'] = array(
danielebarchiesi@0 293 'name' => t('Brief URL'),
danielebarchiesi@0 294 'description' => t('The URL without the protocol and trailing backslash.'),
danielebarchiesi@0 295 );
danielebarchiesi@0 296 $info['tokens']['url']['unaliased'] = array(
danielebarchiesi@0 297 'name' => t('Unaliased URL'),
danielebarchiesi@0 298 'description' => t('The unaliased URL.'),
danielebarchiesi@0 299 'type' => 'url',
danielebarchiesi@0 300 );
danielebarchiesi@0 301 $info['tokens']['url']['args'] = array(
danielebarchiesi@0 302 'name' => t('Arguments'),
danielebarchiesi@0 303 'description' => t("The specific argument of the current page (e.g. 'arg:1' on the page 'node/1' returns '1')."),
danielebarchiesi@0 304 'type' => 'array',
danielebarchiesi@0 305 );
danielebarchiesi@0 306
danielebarchiesi@0 307 // Array tokens.
danielebarchiesi@0 308 $info['types']['array'] = array(
danielebarchiesi@0 309 'name' => t('Array'),
danielebarchiesi@0 310 'description' => t('Tokens related to arrays of strings.'),
danielebarchiesi@0 311 'needs-data' => 'array',
danielebarchiesi@0 312 );
danielebarchiesi@0 313 $info['tokens']['array']['first'] = array(
danielebarchiesi@0 314 'name' => t('First'),
danielebarchiesi@0 315 'description' => t('The first element of the array.'),
danielebarchiesi@0 316 );
danielebarchiesi@0 317 $info['tokens']['array']['last'] = array(
danielebarchiesi@0 318 'name' => t('Last'),
danielebarchiesi@0 319 'description' => t('The last element of the array.'),
danielebarchiesi@0 320 );
danielebarchiesi@0 321 $info['tokens']['array']['count'] = array(
danielebarchiesi@0 322 'name' => t('Count'),
danielebarchiesi@0 323 'description' => t('The number of elements in the array.'),
danielebarchiesi@0 324 );
danielebarchiesi@0 325 $info['tokens']['array']['reversed'] = array(
danielebarchiesi@0 326 'name' => t('Reversed'),
danielebarchiesi@0 327 'description' => t('The array reversed.'),
danielebarchiesi@0 328 'type' => 'array',
danielebarchiesi@0 329 );
danielebarchiesi@0 330 $info['tokens']['array']['keys'] = array(
danielebarchiesi@0 331 'name' => t('Keys'),
danielebarchiesi@0 332 'description' => t('The array of keys of the array.'),
danielebarchiesi@0 333 'type' => 'array',
danielebarchiesi@0 334 );
danielebarchiesi@0 335 $info['tokens']['array']['join'] = array(
danielebarchiesi@0 336 'name' => t('Imploded'),
danielebarchiesi@0 337 'description' => t('The values of the array joined together with a custom string in-between each value.'),
danielebarchiesi@0 338 'dynamic' => TRUE,
danielebarchiesi@0 339 );
danielebarchiesi@0 340 $info['tokens']['array']['value'] = array(
danielebarchiesi@0 341 'name' => t('Value'),
danielebarchiesi@0 342 'description' => t('The specific value of the array.'),
danielebarchiesi@0 343 'dynamic' => TRUE,
danielebarchiesi@0 344 );
danielebarchiesi@0 345
danielebarchiesi@0 346 // Random tokens.
danielebarchiesi@0 347 $info['types']['random'] = array(
danielebarchiesi@0 348 'name' => t('Random'),
danielebarchiesi@0 349 'description' => ('Tokens related to random data.'),
danielebarchiesi@0 350 );
danielebarchiesi@0 351 $info['tokens']['random']['number'] = array(
danielebarchiesi@0 352 'name' => t('Number'),
danielebarchiesi@0 353 'description' => t('A random number from 0 to @max.', array('@max' => mt_getrandmax())),
danielebarchiesi@0 354 );
danielebarchiesi@0 355 $info['tokens']['random']['hash'] = array(
danielebarchiesi@0 356 'name' => t('Hash'),
danielebarchiesi@0 357 'description' => t('A random hash. The possible hashing algorithms are: @hash-algos.', array('@hash-algos' => implode(', ', hash_algos()))),
danielebarchiesi@0 358 'dynamic' => TRUE,
danielebarchiesi@0 359 );
danielebarchiesi@0 360
danielebarchiesi@0 361 return $info;
danielebarchiesi@0 362 }
danielebarchiesi@0 363
danielebarchiesi@0 364 /**
danielebarchiesi@0 365 * Implements hook_tokens().
danielebarchiesi@0 366 */
danielebarchiesi@0 367 function token_tokens($type, $tokens, array $data = array(), array $options = array()) {
danielebarchiesi@0 368 $replacements = array();
danielebarchiesi@0 369
danielebarchiesi@0 370 $url_options = array('absolute' => TRUE);
danielebarchiesi@0 371 if (isset($options['language'])) {
danielebarchiesi@0 372 $url_options['language'] = $options['language'];
danielebarchiesi@0 373 $language_code = $options['language']->language;
danielebarchiesi@0 374 }
danielebarchiesi@0 375 else {
danielebarchiesi@0 376 $language_code = NULL;
danielebarchiesi@0 377 }
danielebarchiesi@0 378
danielebarchiesi@0 379 $sanitize = !empty($options['sanitize']);
danielebarchiesi@0 380
danielebarchiesi@0 381 // Date tokens.
danielebarchiesi@0 382 if ($type == 'date') {
danielebarchiesi@0 383 $date = !empty($data['date']) ? $data['date'] : REQUEST_TIME;
danielebarchiesi@0 384
danielebarchiesi@0 385 // @todo Remove when http://drupal.org/node/1173706 is fixed.
danielebarchiesi@0 386 $date_format_types = system_get_date_types();
danielebarchiesi@0 387 foreach ($tokens as $name => $original) {
danielebarchiesi@0 388 if (isset($date_format_types[$name]) && _token_module('date', $name) == 'token') {
danielebarchiesi@0 389 $replacements[$original] = format_date($date, $name, '', NULL, $language_code);
danielebarchiesi@0 390 }
danielebarchiesi@0 391 }
danielebarchiesi@0 392 }
danielebarchiesi@0 393
danielebarchiesi@0 394 // Current date tokens.
danielebarchiesi@0 395 // @todo Remove when http://drupal.org/node/943028 is fixed.
danielebarchiesi@0 396 if ($type == 'current-date') {
danielebarchiesi@0 397 $replacements += token_generate('date', $tokens, array('date' => REQUEST_TIME), $options);
danielebarchiesi@0 398 }
danielebarchiesi@0 399
danielebarchiesi@0 400 // Comment tokens.
danielebarchiesi@0 401 if ($type == 'comment' && !empty($data['comment'])) {
danielebarchiesi@0 402 $comment = $data['comment'];
danielebarchiesi@0 403
danielebarchiesi@0 404 // Chained token relationships.
danielebarchiesi@0 405 if (($url_tokens = token_find_with_prefix($tokens, 'url'))) {
danielebarchiesi@0 406 $replacements += token_generate('url', $url_tokens, entity_uri('comment', $comment), $options);
danielebarchiesi@0 407 }
danielebarchiesi@0 408 }
danielebarchiesi@0 409
danielebarchiesi@0 410 // Node tokens.
danielebarchiesi@0 411 if ($type == 'node' && !empty($data['node'])) {
danielebarchiesi@0 412 $node = $data['node'];
danielebarchiesi@0 413
danielebarchiesi@0 414 foreach ($tokens as $name => $original) {
danielebarchiesi@0 415 switch ($name) {
danielebarchiesi@0 416 case 'source':
danielebarchiesi@0 417 if (!empty($node->tnid) && $source_node = node_load($node->tnid)) {
danielebarchiesi@0 418 $title = $source_node->title;
danielebarchiesi@0 419 $replacements[$original] = $sanitize ? filter_xss($title) : $title;
danielebarchiesi@0 420 }
danielebarchiesi@0 421 break;
danielebarchiesi@0 422 case 'log':
danielebarchiesi@0 423 $replacements[$original] = $sanitize ? filter_xss($node->log) : $node->log;
danielebarchiesi@0 424 break;
danielebarchiesi@0 425 case 'content-type':
danielebarchiesi@0 426 $type_name = node_type_get_name($node);
danielebarchiesi@0 427 $replacements[$original] = $sanitize ? check_plain($type_name) : $type_name;
danielebarchiesi@0 428 break;
danielebarchiesi@0 429 }
danielebarchiesi@0 430 }
danielebarchiesi@0 431
danielebarchiesi@0 432 // Chained token relationships.
danielebarchiesi@0 433 if (!empty($node->tnid) && ($source_tokens = token_find_with_prefix($tokens, 'source')) && $source_node = node_load($node->tnid)) {
danielebarchiesi@0 434 $replacements += token_generate('node', $source_tokens, array('node' => $source_node), $options);
danielebarchiesi@0 435 }
danielebarchiesi@0 436 if (($node_type_tokens = token_find_with_prefix($tokens, 'content-type')) && $node_type = node_type_load($node->type)) {
danielebarchiesi@0 437 $replacements += token_generate('content-type', $node_type_tokens, array('node_type' => $node_type), $options);
danielebarchiesi@0 438 }
danielebarchiesi@0 439 if (($url_tokens = token_find_with_prefix($tokens, 'url'))) {
danielebarchiesi@0 440 $replacements += token_generate('url', $url_tokens, entity_uri('node', $node), $options);
danielebarchiesi@0 441 }
danielebarchiesi@0 442 }
danielebarchiesi@0 443
danielebarchiesi@0 444 // Content type tokens.
danielebarchiesi@0 445 if ($type == 'content-type' && !empty($data['node_type'])) {
danielebarchiesi@0 446 $node_type = $data['node_type'];
danielebarchiesi@0 447
danielebarchiesi@0 448 foreach ($tokens as $name => $original) {
danielebarchiesi@0 449 switch ($name) {
danielebarchiesi@0 450 case 'name':
danielebarchiesi@0 451 $replacements[$original] = $sanitize ? check_plain($node_type->name) : $node_type->name;
danielebarchiesi@0 452 break;
danielebarchiesi@0 453 case 'machine-name':
danielebarchiesi@0 454 // This is a machine name so does not ever need to be sanitized.
danielebarchiesi@0 455 $replacements[$original] = $node_type->type;
danielebarchiesi@0 456 break;
danielebarchiesi@0 457 case 'description':
danielebarchiesi@0 458 $replacements[$original] = $sanitize ? filter_xss($node_type->description) : $node_type->description;
danielebarchiesi@0 459 break;
danielebarchiesi@0 460 case 'node-count':
danielebarchiesi@0 461 $query = db_select('node');
danielebarchiesi@0 462 $query->condition('type', $node_type->type);
danielebarchiesi@0 463 $query->addTag('node_type_node_count');
danielebarchiesi@0 464 $count = $query->countQuery()->execute()->fetchField();
danielebarchiesi@0 465 $replacements[$original] = (int) $count;
danielebarchiesi@0 466 break;
danielebarchiesi@0 467 case 'edit-url':
danielebarchiesi@0 468 $replacements[$original] = url("admin/structure/types/manage/{$node_type->type}", $url_options);
danielebarchiesi@0 469 break;
danielebarchiesi@0 470 }
danielebarchiesi@0 471 }
danielebarchiesi@0 472 }
danielebarchiesi@0 473
danielebarchiesi@0 474 // Taxonomy term tokens.
danielebarchiesi@0 475 if ($type == 'term' && !empty($data['term'])) {
danielebarchiesi@0 476 $term = $data['term'];
danielebarchiesi@0 477
danielebarchiesi@0 478 foreach ($tokens as $name => $original) {
danielebarchiesi@0 479 switch ($name) {
danielebarchiesi@0 480 case 'edit-url':
danielebarchiesi@0 481 $replacements[$original] = url("taxonomy/term/{$term->tid}/edit", $url_options);
danielebarchiesi@0 482 break;
danielebarchiesi@0 483
danielebarchiesi@0 484 case 'parents':
danielebarchiesi@0 485 if ($parents = token_taxonomy_term_load_all_parents($term->tid)) {
danielebarchiesi@0 486 $replacements[$original] = token_render_array($parents, $options);
danielebarchiesi@0 487 }
danielebarchiesi@0 488 break;
danielebarchiesi@0 489
danielebarchiesi@0 490 case 'root':
danielebarchiesi@0 491 $parents = taxonomy_get_parents_all($term->tid);
danielebarchiesi@0 492 $root_term = end($parents);
danielebarchiesi@0 493 if ($root_term->tid != $term->tid) {
danielebarchiesi@0 494 $replacements[$original] = $sanitize ? check_plain($root_term->name) : $root_term->name;
danielebarchiesi@0 495 }
danielebarchiesi@0 496 break;
danielebarchiesi@0 497 }
danielebarchiesi@0 498 }
danielebarchiesi@0 499
danielebarchiesi@0 500 // Chained token relationships.
danielebarchiesi@0 501 if (($url_tokens = token_find_with_prefix($tokens, 'url'))) {
danielebarchiesi@0 502 $replacements += token_generate('url', $url_tokens, entity_uri('taxonomy_term', $term), $options);
danielebarchiesi@0 503 }
danielebarchiesi@0 504 // [term:parents:*] chained tokens.
danielebarchiesi@0 505 if ($parents_tokens = token_find_with_prefix($tokens, 'parents')) {
danielebarchiesi@0 506 if ($parents = token_taxonomy_term_load_all_parents($term->tid)) {
danielebarchiesi@0 507 $replacements += token_generate('array', $parents_tokens, array('array' => $parents), $options);
danielebarchiesi@0 508 }
danielebarchiesi@0 509 }
danielebarchiesi@0 510 if ($root_tokens = token_find_with_prefix($tokens, 'root')) {
danielebarchiesi@0 511 $parents = taxonomy_get_parents_all($term->tid);
danielebarchiesi@0 512 $root_term = end($parents);
danielebarchiesi@0 513 if ($root_term->tid != $term->tid) {
danielebarchiesi@0 514 $replacements += token_generate('term', $root_tokens, array('term' => $root_term), $options);
danielebarchiesi@0 515 }
danielebarchiesi@0 516 }
danielebarchiesi@0 517 }
danielebarchiesi@0 518
danielebarchiesi@0 519 // Vocabulary tokens.
danielebarchiesi@0 520 if ($type == 'vocabulary' && !empty($data['vocabulary'])) {
danielebarchiesi@0 521 $vocabulary = $data['vocabulary'];
danielebarchiesi@0 522
danielebarchiesi@0 523 foreach ($tokens as $name => $original) {
danielebarchiesi@0 524 switch ($name) {
danielebarchiesi@0 525 case 'machine-name':
danielebarchiesi@0 526 // This is a machine name so does not ever need to be sanitized.
danielebarchiesi@0 527 $replacements[$original] = $vocabulary->machine_name;
danielebarchiesi@0 528 break;
danielebarchiesi@0 529 case 'edit-url':
danielebarchiesi@0 530 $replacements[$original] = url("admin/structure/taxonomy/{$vocabulary->machine_name}/edit", $url_options);
danielebarchiesi@0 531 break;
danielebarchiesi@0 532 }
danielebarchiesi@0 533 }
danielebarchiesi@0 534 }
danielebarchiesi@0 535
danielebarchiesi@0 536 // File tokens.
danielebarchiesi@0 537 if ($type == 'file' && !empty($data['file'])) {
danielebarchiesi@0 538 $file = $data['file'];
danielebarchiesi@0 539
danielebarchiesi@0 540 foreach ($tokens as $name => $original) {
danielebarchiesi@0 541 switch ($name) {
danielebarchiesi@0 542 case 'basename':
danielebarchiesi@0 543 $basename = pathinfo($file->uri, PATHINFO_BASENAME);
danielebarchiesi@0 544 $replacements[$original] = $sanitize ? check_plain($basename) : $basename;
danielebarchiesi@0 545 break;
danielebarchiesi@0 546 case 'extension':
danielebarchiesi@0 547 $extension = pathinfo($file->uri, PATHINFO_EXTENSION);
danielebarchiesi@0 548 $replacements[$original] = $sanitize ? check_plain($extension) : $extension;
danielebarchiesi@0 549 break;
danielebarchiesi@0 550 case 'size-raw':
danielebarchiesi@0 551 $replacements[$original] = (int) $file->filesize;
danielebarchiesi@0 552 break;
danielebarchiesi@0 553 }
danielebarchiesi@0 554 }
danielebarchiesi@0 555 }
danielebarchiesi@0 556
danielebarchiesi@0 557 // User tokens.
danielebarchiesi@0 558 if ($type == 'user' && !empty($data['user'])) {
danielebarchiesi@0 559 $account = $data['user'];
danielebarchiesi@0 560
danielebarchiesi@0 561 foreach ($tokens as $name => $original) {
danielebarchiesi@0 562 switch ($name) {
danielebarchiesi@0 563 case 'picture':
danielebarchiesi@0 564 if (variable_get('user_pictures', 0)) {
danielebarchiesi@0 565 $replacements[$original] = theme('user_picture', array('account' => $account));
danielebarchiesi@0 566 }
danielebarchiesi@0 567 break;
danielebarchiesi@0 568 case 'roles':
danielebarchiesi@0 569 // The roles array may be set from checkbox values so ensure it always
danielebarchiesi@0 570 // has 'proper' data with the role names.
danielebarchiesi@0 571 $roles = array_intersect_key(user_roles(), $account->roles);
danielebarchiesi@0 572 $replacements[$original] = token_render_array($roles, $options);
danielebarchiesi@0 573 break;
danielebarchiesi@0 574 }
danielebarchiesi@0 575 }
danielebarchiesi@0 576
danielebarchiesi@0 577 // Chained token relationships.
danielebarchiesi@0 578 if (variable_get('user_pictures', 0) && !empty($account->picture) && ($picture_tokens = token_find_with_prefix($tokens, 'picture'))) {
danielebarchiesi@0 579 // @todo Remove when core bug http://drupal.org/node/978028 is fixed.
danielebarchiesi@0 580 $account->picture->description = '';
danielebarchiesi@0 581 $replacements += token_generate('file', $picture_tokens, array('file' => $account->picture), $options);
danielebarchiesi@0 582 }
danielebarchiesi@0 583 if ($url_tokens = token_find_with_prefix($tokens, 'url')) {
danielebarchiesi@0 584 $replacements += token_generate('url', $url_tokens, entity_uri('user', $account), $options);
danielebarchiesi@0 585 }
danielebarchiesi@0 586 if ($role_tokens = token_find_with_prefix($tokens, 'roles')) {
danielebarchiesi@0 587 // The roles array may be set from checkbox values so ensure it always
danielebarchiesi@0 588 // has 'proper' data with the role names.
danielebarchiesi@0 589 $roles = array_intersect_key(user_roles(), $account->roles);
danielebarchiesi@0 590 $replacements += token_generate('array', $role_tokens, array('array' => $roles), $options);
danielebarchiesi@0 591 }
danielebarchiesi@0 592 }
danielebarchiesi@0 593
danielebarchiesi@0 594 // Current user tokens.
danielebarchiesi@0 595 if ($type == 'current-user') {
danielebarchiesi@0 596 foreach ($tokens as $name => $original) {
danielebarchiesi@0 597 switch ($name) {
danielebarchiesi@0 598 case 'ip-address':
danielebarchiesi@0 599 $ip = ip_address();
danielebarchiesi@0 600 $replacements[$original] = $sanitize ? check_plain($ip) : $ip;
danielebarchiesi@0 601 break;
danielebarchiesi@0 602 }
danielebarchiesi@0 603 }
danielebarchiesi@0 604 }
danielebarchiesi@0 605
danielebarchiesi@0 606 // Menu link tokens.
danielebarchiesi@0 607 if ($type == 'menu-link' && !empty($data['menu-link'])) {
danielebarchiesi@0 608 $link = (array) $data['menu-link'];
danielebarchiesi@0 609
danielebarchiesi@0 610 if (!isset($link['title'])) {
danielebarchiesi@0 611 // Re-load the link if it was not loaded via token_menu_link_load().
danielebarchiesi@0 612 $link = token_menu_link_load($link['mlid']);
danielebarchiesi@0 613 }
danielebarchiesi@0 614
danielebarchiesi@0 615 foreach ($tokens as $name => $original) {
danielebarchiesi@0 616 switch ($name) {
danielebarchiesi@0 617 case 'mlid':
danielebarchiesi@0 618 $replacements[$original] = $link['mlid'];
danielebarchiesi@0 619 break;
danielebarchiesi@0 620 case 'title':
danielebarchiesi@0 621 $replacements[$original] = $sanitize ? check_plain($link['title']) : $link['title'];
danielebarchiesi@0 622 break;
danielebarchiesi@0 623 case 'url':
danielebarchiesi@0 624 $replacements[$original] = url($link['href'], $url_options);
danielebarchiesi@0 625 break;
danielebarchiesi@0 626 case 'parent':
danielebarchiesi@0 627 if (!empty($link['plid']) && $parent = token_menu_link_load($link['plid'])) {
danielebarchiesi@0 628 $replacements[$original] = $sanitize ? check_plain($parent['title']) : $parent['title'];
danielebarchiesi@0 629 }
danielebarchiesi@0 630 break;
danielebarchiesi@0 631 case 'parents':
danielebarchiesi@0 632 if ($parents = token_menu_link_load_all_parents($link['mlid'])) {
danielebarchiesi@0 633 $replacements[$original] = token_render_array($parents, $options);
danielebarchiesi@0 634 }
danielebarchiesi@0 635 break;
danielebarchiesi@0 636 case 'root';
danielebarchiesi@0 637 if (!empty($link['p1']) && $link['p1'] != $link['mlid'] && $root = token_menu_link_load($link['p1'])) {
danielebarchiesi@0 638 $replacements[$original] = $sanitize ? check_plain($root['title']) : $root['title'];
danielebarchiesi@0 639 }
danielebarchiesi@0 640 break;
danielebarchiesi@0 641 }
danielebarchiesi@0 642 }
danielebarchiesi@0 643
danielebarchiesi@0 644 // Chained token relationships.
danielebarchiesi@0 645 if (!empty($link['plid']) && ($source_tokens = token_find_with_prefix($tokens, 'parent')) && $parent = token_menu_link_load($link['plid'])) {
danielebarchiesi@0 646 $replacements += token_generate('menu-link', $source_tokens, array('menu-link' => $parent), $options);
danielebarchiesi@0 647 }
danielebarchiesi@0 648 // [menu-link:parents:*] chained tokens.
danielebarchiesi@0 649 if ($parents_tokens = token_find_with_prefix($tokens, 'parents')) {
danielebarchiesi@0 650 if ($parents = token_menu_link_load_all_parents($link['mlid'])) {
danielebarchiesi@0 651 $replacements += token_generate('array', $parents_tokens, array('array' => $parents), $options);
danielebarchiesi@0 652 }
danielebarchiesi@0 653 }
danielebarchiesi@0 654 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 655 $replacements += token_generate('menu-link', $root_tokens, array('menu-link' => $root), $options);
danielebarchiesi@0 656 }
danielebarchiesi@0 657 if ($url_tokens = token_find_with_prefix($tokens, 'url')) {
danielebarchiesi@0 658 $replacements += token_generate('url', $url_tokens, array('path' => $link['href']), $options);
danielebarchiesi@0 659 }
danielebarchiesi@0 660 }
danielebarchiesi@0 661
danielebarchiesi@0 662 // Current page tokens.
danielebarchiesi@0 663 if ($type == 'current-page') {
danielebarchiesi@0 664 $current_path = current_path();
danielebarchiesi@0 665
danielebarchiesi@0 666 foreach ($tokens as $name => $original) {
danielebarchiesi@0 667 switch ($name) {
danielebarchiesi@0 668 case 'title':
danielebarchiesi@0 669 $title = drupal_get_title();
danielebarchiesi@0 670 $replacements[$original] = $sanitize ? $title : decode_entities($title);
danielebarchiesi@0 671 break;
danielebarchiesi@0 672 case 'url':
danielebarchiesi@0 673 $replacements[$original] = url($current_path, $url_options);
danielebarchiesi@0 674 break;
danielebarchiesi@0 675 case 'page-number':
danielebarchiesi@0 676 if ($page = filter_input(INPUT_GET, 'page')) {
danielebarchiesi@0 677 // @see PagerDefault::execute()
danielebarchiesi@0 678 $pager_page_array = explode(',', $page);
danielebarchiesi@0 679 $page = $pager_page_array[0];
danielebarchiesi@0 680 }
danielebarchiesi@0 681 $replacements[$original] = (int) $page + 1;
danielebarchiesi@0 682 break;
danielebarchiesi@0 683 }
danielebarchiesi@0 684 }
danielebarchiesi@0 685
danielebarchiesi@0 686 // @deprecated
danielebarchiesi@0 687 // [current-page:arg] dynamic tokens.
danielebarchiesi@0 688 if ($arg_tokens = token_find_with_prefix($tokens, 'arg')) {
danielebarchiesi@0 689 foreach ($arg_tokens as $name => $original) {
danielebarchiesi@0 690 if (is_numeric($name) && ($arg = arg($name)) && isset($arg)) {
danielebarchiesi@0 691 $replacements[$original] = $sanitize ? check_plain($arg) : $arg;
danielebarchiesi@0 692 }
danielebarchiesi@0 693 }
danielebarchiesi@0 694 }
danielebarchiesi@0 695
danielebarchiesi@0 696 // [current-page:query] dynamic tokens.
danielebarchiesi@0 697 if ($query_tokens = token_find_with_prefix($tokens, 'query')) {
danielebarchiesi@0 698 foreach ($query_tokens as $name => $original) {
danielebarchiesi@0 699 // @todo Should this use filter_input()?
danielebarchiesi@0 700 if (isset($_GET[$name])) {
danielebarchiesi@0 701 $replacements[$original] = $sanitize ? check_plain($_GET[$name]) : $_GET[$name];
danielebarchiesi@0 702 }
danielebarchiesi@0 703 }
danielebarchiesi@0 704 }
danielebarchiesi@0 705
danielebarchiesi@0 706 // Chained token relationships.
danielebarchiesi@0 707 if ($url_tokens = token_find_with_prefix($tokens, 'url')) {
danielebarchiesi@0 708 $replacements += token_generate('url', $url_tokens, array('path' => $current_path), $options);
danielebarchiesi@0 709 }
danielebarchiesi@0 710 }
danielebarchiesi@0 711
danielebarchiesi@0 712 // URL tokens.
danielebarchiesi@0 713 if ($type == 'url' && !empty($data['path'])) {
danielebarchiesi@0 714 $path = $data['path'];
danielebarchiesi@0 715
danielebarchiesi@0 716 if (isset($data['options'])) {
danielebarchiesi@0 717 // Merge in the URL options if available.
danielebarchiesi@0 718 $url_options = $data['options'] + $url_options;
danielebarchiesi@0 719 }
danielebarchiesi@0 720
danielebarchiesi@0 721 foreach ($tokens as $name => $original) {
danielebarchiesi@0 722 switch ($name) {
danielebarchiesi@0 723 case 'path':
danielebarchiesi@0 724 $value = empty($url_options['alias']) ? drupal_get_path_alias($path, $language_code) : $path;
danielebarchiesi@0 725 $replacements[$original] = $sanitize ? check_plain($value) : $value;
danielebarchiesi@0 726 break;
danielebarchiesi@0 727 case 'alias':
danielebarchiesi@0 728 // @deprecated
danielebarchiesi@0 729 $alias = drupal_get_path_alias($path, $language_code);
danielebarchiesi@0 730 $replacements[$original] = $sanitize ? check_plain($alias) : $alias;
danielebarchiesi@0 731 break;
danielebarchiesi@0 732 case 'absolute':
danielebarchiesi@0 733 $replacements[$original] = url($path, $url_options);
danielebarchiesi@0 734 break;
danielebarchiesi@0 735 case 'relative':
danielebarchiesi@0 736 $replacements[$original] = url($path, array('absolute' => FALSE) + $url_options);
danielebarchiesi@0 737 break;
danielebarchiesi@0 738 case 'brief':
danielebarchiesi@0 739 $replacements[$original] = preg_replace(array('!^https?://!', '!/$!'), '', url($path, $url_options));
danielebarchiesi@0 740 break;
danielebarchiesi@0 741 case 'unaliased':
danielebarchiesi@0 742 $replacements[$original] = url($path, array('alias' => TRUE) + $url_options);
danielebarchiesi@0 743 break;
danielebarchiesi@0 744 case 'args':
danielebarchiesi@0 745 $value = empty($url_options['alias']) ? drupal_get_path_alias($path, $language_code) : $path;
danielebarchiesi@0 746 $replacements[$original] = token_render_array(arg(NULL, $value), $options);
danielebarchiesi@0 747 break;
danielebarchiesi@0 748 }
danielebarchiesi@0 749 }
danielebarchiesi@0 750
danielebarchiesi@0 751 // [url:arg:*] chained tokens.
danielebarchiesi@0 752 if ($arg_tokens = token_find_with_prefix($tokens, 'args')) {
danielebarchiesi@0 753 $value = empty($url_options['alias']) ? drupal_get_path_alias($path, $language_code) : $path;
danielebarchiesi@0 754 $replacements += token_generate('array', $arg_tokens, array('array' => arg(NULL, $value)), $options);
danielebarchiesi@0 755 }
danielebarchiesi@0 756
danielebarchiesi@0 757 // [url:unaliased:*] chained tokens.
danielebarchiesi@0 758 if ($unaliased_tokens = token_find_with_prefix($tokens, 'unaliased')) {
danielebarchiesi@0 759 $unaliased_token_data['path'] = $path;
danielebarchiesi@0 760 $unaliased_token_data['options'] = isset($data['options']) ? $data['options'] : array();
danielebarchiesi@0 761 $unaliased_token_data['options']['alias'] = TRUE;
danielebarchiesi@0 762 $replacements += token_generate('url', $unaliased_tokens, $unaliased_token_data, $options);
danielebarchiesi@0 763 }
danielebarchiesi@0 764 }
danielebarchiesi@0 765
danielebarchiesi@0 766 // Entity tokens.
danielebarchiesi@0 767 if (!empty($data[$type]) && $entity_type = token_get_entity_mapping('token', $type)) {
danielebarchiesi@0 768 $entity = $data[$type];
danielebarchiesi@0 769
danielebarchiesi@0 770 // Sometimes taxonomy terms are not properly loaded.
danielebarchiesi@0 771 // @see http://drupal.org/node/870528
danielebarchiesi@0 772 if ($entity_type == 'taxonomy_term' && !isset($entity->vocabulary_machine_name)) {
danielebarchiesi@0 773 $entity->vocabulary_machine_name = db_query("SELECT machine_name FROM {taxonomy_vocabulary} WHERE vid = :vid", array(':vid' => $entity->vid))->fetchField();
danielebarchiesi@0 774 }
danielebarchiesi@0 775
danielebarchiesi@0 776 foreach ($tokens as $name => $original) {
danielebarchiesi@0 777 switch ($name) {
danielebarchiesi@0 778 case 'url':
danielebarchiesi@0 779 if (_token_module($type, 'url') == 'token' && $uri = entity_uri($entity_type, $entity)) {
danielebarchiesi@0 780 $replacements[$original] = url($uri['path'], $uri['options']);
danielebarchiesi@0 781 }
danielebarchiesi@0 782 break;
danielebarchiesi@0 783
danielebarchiesi@0 784 case 'original':
danielebarchiesi@0 785 if (_token_module($type, 'original') == 'token' && !empty($entity->original)) {
danielebarchiesi@0 786 $label = entity_label($entity_type, $entity->original);
danielebarchiesi@0 787 $replacements[$original] = $sanitize ? check_plain($label) : $label;
danielebarchiesi@0 788 }
danielebarchiesi@0 789 break;
danielebarchiesi@0 790 }
danielebarchiesi@0 791 }
danielebarchiesi@0 792
danielebarchiesi@0 793 // [entity:url:*] chained tokens.
danielebarchiesi@0 794 if (($url_tokens = token_find_with_prefix($tokens, 'url')) && _token_module($type, 'url') == 'token') {
danielebarchiesi@0 795 $replacements += token_generate('url', $url_tokens, entity_uri($entity_type, $entity), $options);
danielebarchiesi@0 796 }
danielebarchiesi@0 797
danielebarchiesi@0 798 // [entity:original:*] chained tokens.
danielebarchiesi@0 799 if (($original_tokens = token_find_with_prefix($tokens, 'original')) && _token_module($type, 'original') == 'token' && !empty($entity->original)) {
danielebarchiesi@0 800 $replacements += token_generate($type, $original_tokens, array($type => $entity->original), $options);
danielebarchiesi@0 801 }
danielebarchiesi@0 802
danielebarchiesi@0 803 // Pass through to an generic 'entity' token type generation.
danielebarchiesi@0 804 $entity_data = array(
danielebarchiesi@0 805 'entity_type' => $entity_type,
danielebarchiesi@0 806 'entity' => $entity,
danielebarchiesi@0 807 'token_type' => $type,
danielebarchiesi@0 808 );
danielebarchiesi@0 809 // @todo Investigate passing through more data like everything from entity_extract_ids().
danielebarchiesi@0 810 $replacements += token_generate('entity', $tokens, $entity_data, $options);
danielebarchiesi@0 811 }
danielebarchiesi@0 812
danielebarchiesi@0 813 // Array tokens.
danielebarchiesi@0 814 if ($type == 'array' && !empty($data['array']) && is_array($data['array'])) {
danielebarchiesi@0 815 $array = $data['array'];
danielebarchiesi@0 816
danielebarchiesi@0 817 $sort = isset($options['array sort']) ? $options['array sort'] : TRUE;
danielebarchiesi@0 818 $keys = element_children($array, $sort);
danielebarchiesi@0 819
danielebarchiesi@0 820 foreach ($tokens as $name => $original) {
danielebarchiesi@0 821 switch ($name) {
danielebarchiesi@0 822 case 'first':
danielebarchiesi@0 823 $value = $array[$keys[0]];
danielebarchiesi@0 824 $value = is_array($value) ? render($value) : (string) $value;
danielebarchiesi@0 825 $replacements[$original] = $sanitize ? check_plain($value) : $value;
danielebarchiesi@0 826 break;
danielebarchiesi@0 827 case 'last':
danielebarchiesi@0 828 $value = $array[$keys[count($keys) - 1]];
danielebarchiesi@0 829 $value = is_array($value) ? render($value) : (string) $value;
danielebarchiesi@0 830 $replacements[$original] = $sanitize ? check_plain($value) : $value;
danielebarchiesi@0 831 break;
danielebarchiesi@0 832 case 'count':
danielebarchiesi@0 833 $replacements[$original] = count($keys);
danielebarchiesi@0 834 break;
danielebarchiesi@0 835 case 'keys':
danielebarchiesi@0 836 $replacements[$original] = token_render_array($keys, $options);
danielebarchiesi@0 837 break;
danielebarchiesi@0 838 case 'reversed':
danielebarchiesi@0 839 $reversed = array_reverse($array, TRUE);
danielebarchiesi@0 840 $replacements[$original] = token_render_array($reversed, $options);
danielebarchiesi@0 841 break;
danielebarchiesi@0 842 case 'join':
danielebarchiesi@0 843 $replacements[$original] = token_render_array($array, array('join' => '') + $options);
danielebarchiesi@0 844 break;
danielebarchiesi@0 845 }
danielebarchiesi@0 846 }
danielebarchiesi@0 847
danielebarchiesi@0 848 // [array:value:*] dynamic tokens.
danielebarchiesi@0 849 if ($value_tokens = token_find_with_prefix($tokens, 'value')) {
danielebarchiesi@0 850 foreach ($value_tokens as $key => $original) {
danielebarchiesi@0 851 if ($key[0] !== '#' && isset($array[$key])) {
danielebarchiesi@0 852 $replacements[$original] = token_render_array_value($array[$key], $options);
danielebarchiesi@0 853 }
danielebarchiesi@0 854 }
danielebarchiesi@0 855 }
danielebarchiesi@0 856
danielebarchiesi@0 857 // [array:join:*] dynamic tokens.
danielebarchiesi@0 858 if ($join_tokens = token_find_with_prefix($tokens, 'join')) {
danielebarchiesi@0 859 foreach ($join_tokens as $join => $original) {
danielebarchiesi@0 860 $replacements[$original] = token_render_array($array, array('join' => $join) + $options);
danielebarchiesi@0 861 }
danielebarchiesi@0 862 }
danielebarchiesi@0 863
danielebarchiesi@0 864 // [array:keys:*] chained tokens.
danielebarchiesi@0 865 if ($key_tokens = token_find_with_prefix($tokens, 'keys')) {
danielebarchiesi@0 866 $replacements += token_generate('array', $key_tokens, array('array' => $keys), $options);
danielebarchiesi@0 867 }
danielebarchiesi@0 868
danielebarchiesi@0 869 // [array:reversed:*] chained tokens.
danielebarchiesi@0 870 if ($reversed_tokens = token_find_with_prefix($tokens, 'reversed')) {
danielebarchiesi@0 871 $replacements += token_generate('array', $reversed_tokens, array('array' => array_reverse($array, TRUE)), array('array sort' => FALSE) + $options);
danielebarchiesi@0 872 }
danielebarchiesi@0 873
danielebarchiesi@0 874 // @todo Handle if the array values are not strings and could be chained.
danielebarchiesi@0 875 }
danielebarchiesi@0 876
danielebarchiesi@0 877 // Random tokens.
danielebarchiesi@0 878 if ($type == 'random') {
danielebarchiesi@0 879 foreach ($tokens as $name => $original) {
danielebarchiesi@0 880 switch ($name) {
danielebarchiesi@0 881 case 'number':
danielebarchiesi@0 882 $replacements[$original] = mt_rand();
danielebarchiesi@0 883 break;
danielebarchiesi@0 884 }
danielebarchiesi@0 885 }
danielebarchiesi@0 886
danielebarchiesi@0 887 // [custom:hash:*] dynamic token.
danielebarchiesi@0 888 if ($hash_tokens = token_find_with_prefix($tokens, 'hash')) {
danielebarchiesi@0 889 $algos = hash_algos();
danielebarchiesi@0 890 foreach ($hash_tokens as $name => $original) {
danielebarchiesi@0 891 if (in_array($name, $algos)) {
danielebarchiesi@0 892 $replacements[$original] = hash($name, drupal_random_bytes(55));
danielebarchiesi@0 893 }
danielebarchiesi@0 894 }
danielebarchiesi@0 895 }
danielebarchiesi@0 896 }
danielebarchiesi@0 897
danielebarchiesi@0 898 // If $type is a token type, $data[$type] is empty but $data[$entity_type] is
danielebarchiesi@0 899 // not, re-run token replacements.
danielebarchiesi@0 900 if (empty($data[$type]) && ($entity_type = token_get_entity_mapping('token', $type)) && $entity_type != $type && !empty($data[$entity_type]) && empty($options['recursive'])) {
danielebarchiesi@0 901 $data[$type] = $data[$entity_type];
danielebarchiesi@0 902 $options['recursive'] = TRUE;
danielebarchiesi@0 903 $replacements += module_invoke_all('tokens', $type, $tokens, $data, $options);
danielebarchiesi@0 904 }
danielebarchiesi@0 905
danielebarchiesi@0 906 // If the token type specifics a 'needs-data' value, and the value is not
danielebarchiesi@0 907 // present in $data, then throw an error.
danielebarchiesi@0 908 if (!empty($GLOBALS['drupal_test_info']['test_run_id'])) {
danielebarchiesi@0 909 // Only check when tests are running.
danielebarchiesi@0 910 $type_info = token_get_info($type);
danielebarchiesi@0 911 if (!empty($type_info['needs-data']) && !isset($data[$type_info['needs-data']])) {
danielebarchiesi@0 912 trigger_error(t('Attempting to perform token replacement for token type %type without required data', array('%type' => $type)), E_USER_WARNING);
danielebarchiesi@0 913 }
danielebarchiesi@0 914 }
danielebarchiesi@0 915
danielebarchiesi@0 916 return $replacements;
danielebarchiesi@0 917 }
danielebarchiesi@0 918
danielebarchiesi@0 919 /**
danielebarchiesi@0 920 * Implements hook_tokens_alter().
danielebarchiesi@0 921 *
danielebarchiesi@0 922 * Fix existing core tokens that do not work correctly.
danielebarchiesi@0 923 */
danielebarchiesi@0 924 function token_tokens_alter(array &$replacements, array $context) {
danielebarchiesi@0 925 $options = $context['options'];
danielebarchiesi@0 926
danielebarchiesi@0 927 $sanitize = !empty($options['sanitize']);
danielebarchiesi@0 928 $langcode = !empty($options['language']->language) ? $options['language']->language : NULL;
danielebarchiesi@0 929
danielebarchiesi@0 930 // Comment token fixes.
danielebarchiesi@0 931 if ($context['type'] == 'comment' && !empty($context['data']['comment'])) {
danielebarchiesi@0 932 $comment = $context['data']['comment'];
danielebarchiesi@0 933
danielebarchiesi@0 934 foreach ($context['tokens'] as $name => $original) {
danielebarchiesi@0 935 switch ($name) {
danielebarchiesi@0 936 case 'name':
danielebarchiesi@0 937 case 'author':
danielebarchiesi@0 938 // @todo Remove when http://drupal.org/node/920056 is fixed.
danielebarchiesi@0 939 if (!empty($comment->uid)) {
danielebarchiesi@0 940 $account = user_load($comment->uid);
danielebarchiesi@0 941 }
danielebarchiesi@0 942 else {
danielebarchiesi@0 943 $account = drupal_anonymous_user();
danielebarchiesi@0 944 $account->name = $comment->name;
danielebarchiesi@0 945 }
danielebarchiesi@0 946 $name = format_username($account);
danielebarchiesi@0 947 $replacements[$original] = $sanitize ? check_plain($name) : $name;
danielebarchiesi@0 948 break;
danielebarchiesi@0 949 }
danielebarchiesi@0 950 }
danielebarchiesi@0 951 }
danielebarchiesi@0 952
danielebarchiesi@0 953 // Node token fixes.
danielebarchiesi@0 954 if ($context['type'] == 'node' && !empty($context['data']['node'])) {
danielebarchiesi@0 955 $node = $context['data']['node'];
danielebarchiesi@0 956
danielebarchiesi@0 957 foreach ($context['tokens'] as $name => $original) {
danielebarchiesi@0 958 switch ($name) {
danielebarchiesi@0 959 case 'author':
danielebarchiesi@0 960 // http://drupal.org/node/1185842 was fixed in core release 7.9.
danielebarchiesi@0 961 if (version_compare(VERSION, '7.9', '<')) {
danielebarchiesi@0 962 $account = user_load($node->uid);
danielebarchiesi@0 963 $name = format_username($account);
danielebarchiesi@0 964 $replacements[$original] = $sanitize ? check_plain($name) : $name;
danielebarchiesi@0 965 }
danielebarchiesi@0 966 break;
danielebarchiesi@0 967 }
danielebarchiesi@0 968 }
danielebarchiesi@0 969 }
danielebarchiesi@0 970
danielebarchiesi@0 971 // File token fixes.
danielebarchiesi@0 972 if ($context['type'] == 'file' && !empty($context['data']['file'])) {
danielebarchiesi@0 973 $file = $context['data']['file'];
danielebarchiesi@0 974
danielebarchiesi@0 975 foreach ($context['tokens'] as $name => $original) {
danielebarchiesi@0 976 switch ($name) {
danielebarchiesi@0 977 case 'owner':
danielebarchiesi@0 978 // http://drupal.org/node/978028 was fixed in core release 7.7.
danielebarchiesi@0 979 if (version_compare(VERSION, '7.7', '<')) {
danielebarchiesi@0 980 $account = user_load($file->uid);
danielebarchiesi@0 981 $name = format_username($account);
danielebarchiesi@0 982 $replacements[$original] = $sanitize ? check_plain($name) : $name;
danielebarchiesi@0 983 }
danielebarchiesi@0 984 break;
danielebarchiesi@0 985 }
danielebarchiesi@0 986 }
danielebarchiesi@0 987 }
danielebarchiesi@0 988 }
danielebarchiesi@0 989
danielebarchiesi@0 990 /**
danielebarchiesi@0 991 * Implements hook_token_info() on behalf of book.module.
danielebarchiesi@0 992 */
danielebarchiesi@0 993 function book_token_info() {
danielebarchiesi@0 994 $info['tokens']['node']['book'] = array(
danielebarchiesi@0 995 'name' => t('Book'),
danielebarchiesi@0 996 'description' => t('The book page associated with the node.'),
danielebarchiesi@0 997 'type' => 'menu-link',
danielebarchiesi@0 998 );
danielebarchiesi@0 999 return $info;
danielebarchiesi@0 1000 }
danielebarchiesi@0 1001
danielebarchiesi@0 1002 /**
danielebarchiesi@0 1003 * Implements hook_tokens() on behalf of book.module.
danielebarchiesi@0 1004 */
danielebarchiesi@0 1005 function book_tokens($type, $tokens, array $data = array(), array $options = array()) {
danielebarchiesi@0 1006 $replacements = array();
danielebarchiesi@0 1007 $sanitize = !empty($options['sanitize']);
danielebarchiesi@0 1008
danielebarchiesi@0 1009 // Node tokens.
danielebarchiesi@0 1010 if ($type == 'node' && !empty($data['node'])) {
danielebarchiesi@0 1011 $node = $data['node'];
danielebarchiesi@0 1012
danielebarchiesi@0 1013 if (!empty($node->book['mlid'])) {
danielebarchiesi@0 1014 $link = token_book_link_load($node->book['mlid']);
danielebarchiesi@0 1015
danielebarchiesi@0 1016 foreach ($tokens as $name => $original) {
danielebarchiesi@0 1017 switch ($name) {
danielebarchiesi@0 1018 case 'book':
danielebarchiesi@0 1019 $replacements[$original] = $sanitize ? check_plain($link['title']) : $link['title'];
danielebarchiesi@0 1020 break;
danielebarchiesi@0 1021 }
danielebarchiesi@0 1022 }
danielebarchiesi@0 1023
danielebarchiesi@0 1024 // Chained token relationships.
danielebarchiesi@0 1025 if ($book_tokens = token_find_with_prefix($tokens, 'book')) {
danielebarchiesi@0 1026 $replacements += token_generate('menu-link', $book_tokens, array('menu-link' => $link), $options);
danielebarchiesi@0 1027 }
danielebarchiesi@0 1028 }
danielebarchiesi@0 1029 }
danielebarchiesi@0 1030
danielebarchiesi@0 1031 return $replacements;
danielebarchiesi@0 1032 }
danielebarchiesi@0 1033
danielebarchiesi@0 1034 /**
danielebarchiesi@0 1035 * Implements hook_token_info() on behalf of menu.module.
danielebarchiesi@0 1036 */
danielebarchiesi@0 1037 function menu_token_info() {
danielebarchiesi@0 1038 // Menu tokens.
danielebarchiesi@0 1039 $info['types']['menu'] = array(
danielebarchiesi@0 1040 'name' => t('Menus'),
danielebarchiesi@0 1041 'description' => t('Tokens related to menus.'),
danielebarchiesi@0 1042 'needs-data' => 'menu',
danielebarchiesi@0 1043 );
danielebarchiesi@0 1044 $info['tokens']['menu']['name'] = array(
danielebarchiesi@0 1045 'name' => t('Name'),
danielebarchiesi@0 1046 'description' => t("The name of the menu."),
danielebarchiesi@0 1047 );
danielebarchiesi@0 1048 $info['tokens']['menu']['machine-name'] = array(
danielebarchiesi@0 1049 'name' => t('Machine-readable name'),
danielebarchiesi@0 1050 'description' => t("The unique machine-readable name of the menu."),
danielebarchiesi@0 1051 );
danielebarchiesi@0 1052 $info['tokens']['menu']['description'] = array(
danielebarchiesi@0 1053 'name' => t('Description'),
danielebarchiesi@0 1054 'description' => t('The optional description of the menu.'),
danielebarchiesi@0 1055 );
danielebarchiesi@0 1056 $info['tokens']['menu']['menu-link-count'] = array(
danielebarchiesi@0 1057 'name' => t('Menu link count'),
danielebarchiesi@0 1058 'description' => t('The number of menu links belonging to the menu.'),
danielebarchiesi@0 1059 );
danielebarchiesi@0 1060 $info['tokens']['menu']['edit-url'] = array(
danielebarchiesi@0 1061 'name' => t('Edit URL'),
danielebarchiesi@0 1062 'description' => t("The URL of the menu's edit page."),
danielebarchiesi@0 1063 );
danielebarchiesi@0 1064
danielebarchiesi@0 1065 $info['tokens']['menu-link']['menu'] = array(
danielebarchiesi@0 1066 'name' => t('Menu'),
danielebarchiesi@0 1067 'description' => t('The menu of the menu link.'),
danielebarchiesi@0 1068 'type' => 'menu',
danielebarchiesi@0 1069 );
danielebarchiesi@0 1070 $info['tokens']['menu-link']['edit-url'] = array(
danielebarchiesi@0 1071 'name' => t('Edit URL'),
danielebarchiesi@0 1072 'description' => t("The URL of the menu link's edit page."),
danielebarchiesi@0 1073 );
danielebarchiesi@0 1074 $info['tokens']['node']['menu-link'] = array(
danielebarchiesi@0 1075 'name' => t('Menu link'),
danielebarchiesi@0 1076 'description' => t("The menu link for this node."),
danielebarchiesi@0 1077 'type' => 'menu-link',
danielebarchiesi@0 1078 );
danielebarchiesi@0 1079
danielebarchiesi@0 1080 return $info;
danielebarchiesi@0 1081 }
danielebarchiesi@0 1082
danielebarchiesi@0 1083 /**
danielebarchiesi@0 1084 * Implements hook_tokens() on behalf of menu.module.
danielebarchiesi@0 1085 */
danielebarchiesi@0 1086 function menu_tokens($type, $tokens, array $data = array(), array $options = array()) {
danielebarchiesi@0 1087 $replacements = array();
danielebarchiesi@0 1088
danielebarchiesi@0 1089 $url_options = array('absolute' => TRUE);
danielebarchiesi@0 1090 if (isset($options['language'])) {
danielebarchiesi@0 1091 $url_options['language'] = $options['language'];
danielebarchiesi@0 1092 $language_code = $options['language']->language;
danielebarchiesi@0 1093 }
danielebarchiesi@0 1094 else {
danielebarchiesi@0 1095 $language_code = NULL;
danielebarchiesi@0 1096 }
danielebarchiesi@0 1097
danielebarchiesi@0 1098 $sanitize = !empty($options['sanitize']);
danielebarchiesi@0 1099
danielebarchiesi@0 1100 // Node tokens.
danielebarchiesi@0 1101 if ($type == 'node' && !empty($data['node'])) {
danielebarchiesi@0 1102 $node = $data['node'];
danielebarchiesi@0 1103
danielebarchiesi@0 1104 foreach ($tokens as $name => $original) {
danielebarchiesi@0 1105 switch ($name) {
danielebarchiesi@0 1106 case 'menu-link':
danielebarchiesi@0 1107 if ($link = token_node_menu_link_load($node)) {
danielebarchiesi@0 1108 $replacements[$original] = $sanitize ? check_plain($link['title']) : $link['title'];
danielebarchiesi@0 1109 }
danielebarchiesi@0 1110 break;
danielebarchiesi@0 1111 }
danielebarchiesi@0 1112
danielebarchiesi@0 1113 // Chained token relationships.
danielebarchiesi@0 1114 if ($menu_tokens = token_find_with_prefix($tokens, 'menu-link')) {
danielebarchiesi@0 1115 if ($link = token_node_menu_link_load($node)) {
danielebarchiesi@0 1116 $replacements += token_generate('menu-link', $menu_tokens, array('menu-link' => $link), $options);
danielebarchiesi@0 1117 }
danielebarchiesi@0 1118 }
danielebarchiesi@0 1119 }
danielebarchiesi@0 1120 }
danielebarchiesi@0 1121
danielebarchiesi@0 1122 // Menu link tokens.
danielebarchiesi@0 1123 if ($type == 'menu-link' && !empty($data['menu-link'])) {
danielebarchiesi@0 1124 $link = (array) $data['menu-link'];
danielebarchiesi@0 1125
danielebarchiesi@0 1126 foreach ($tokens as $name => $original) {
danielebarchiesi@0 1127 switch ($name) {
danielebarchiesi@0 1128 case 'menu':
danielebarchiesi@0 1129 if ($menu = menu_load($link['menu_name'])) {
danielebarchiesi@0 1130 $replacements[$original] = $sanitize ? check_plain($menu['title']) : $menu['title'];
danielebarchiesi@0 1131 }
danielebarchiesi@0 1132 break;
danielebarchiesi@0 1133 case 'edit-url':
danielebarchiesi@0 1134 $replacements[$original] = url("admin/structure/menu/item/{$link['mlid']}/edit", $url_options);
danielebarchiesi@0 1135 break;
danielebarchiesi@0 1136 }
danielebarchiesi@0 1137 }
danielebarchiesi@0 1138
danielebarchiesi@0 1139 // Chained token relationships.
danielebarchiesi@0 1140 if (($menu_tokens = token_find_with_prefix($tokens, 'menu')) && $menu = menu_load($link['menu_name'])) {
danielebarchiesi@0 1141 $replacements += token_generate('menu', $menu_tokens, array('menu' => $menu), $options);
danielebarchiesi@0 1142 }
danielebarchiesi@0 1143 }
danielebarchiesi@0 1144
danielebarchiesi@0 1145 // Menu tokens.
danielebarchiesi@0 1146 if ($type == 'menu' && !empty($data['menu'])) {
danielebarchiesi@0 1147 $menu = (array) $data['menu'];
danielebarchiesi@0 1148
danielebarchiesi@0 1149 foreach ($tokens as $name => $original) {
danielebarchiesi@0 1150 switch ($name) {
danielebarchiesi@0 1151 case 'name':
danielebarchiesi@0 1152 $replacements[$original] = $sanitize ? check_plain($menu['title']) : $menu['title'];
danielebarchiesi@0 1153 break;
danielebarchiesi@0 1154 case 'machine-name':
danielebarchiesi@0 1155 // This is a machine name so does not ever need to be sanitized.
danielebarchiesi@0 1156 $replacements[$original] = $menu['menu_name'];
danielebarchiesi@0 1157 break;
danielebarchiesi@0 1158 case 'description':
danielebarchiesi@0 1159 $replacements[$original] = $sanitize ? filter_xss($menu['description']) : $menu['description'];
danielebarchiesi@0 1160 break;
danielebarchiesi@0 1161 case 'menu-link-count':
danielebarchiesi@0 1162 $query = db_select('menu_links');
danielebarchiesi@0 1163 $query->condition('menu_name', $menu['menu_name']);
danielebarchiesi@0 1164 $query->addTag('menu_menu_link_count');
danielebarchiesi@0 1165 $count = $query->countQuery()->execute()->fetchField();
danielebarchiesi@0 1166 $replacements[$original] = (int) $count;
danielebarchiesi@0 1167 break;
danielebarchiesi@0 1168 case 'edit-url':
danielebarchiesi@0 1169 $replacements[$original] = url("admin/structure/menu/manage/" . $menu['menu_name'], $url_options);
danielebarchiesi@0 1170 break;
danielebarchiesi@0 1171 }
danielebarchiesi@0 1172 }
danielebarchiesi@0 1173 }
danielebarchiesi@0 1174
danielebarchiesi@0 1175 return $replacements;
danielebarchiesi@0 1176 }
danielebarchiesi@0 1177
danielebarchiesi@0 1178 /**
danielebarchiesi@0 1179 * Implements hook_token_info() on behalf of profile.module.
danielebarchiesi@0 1180 */
danielebarchiesi@0 1181 function profile_token_info() {
danielebarchiesi@0 1182 $info = array();
danielebarchiesi@0 1183
danielebarchiesi@0 1184 foreach (_token_profile_fields() as $field) {
danielebarchiesi@0 1185 $info['tokens']['user'][$field->token_name] = array(
danielebarchiesi@0 1186 'name' => check_plain($field->title),
danielebarchiesi@0 1187 'description' => t('@category @type field.', array('@category' => drupal_ucfirst($field->category), '@type' => $field->type)),
danielebarchiesi@0 1188 );
danielebarchiesi@0 1189
danielebarchiesi@0 1190 switch ($field->type) {
danielebarchiesi@0 1191 case 'date':
danielebarchiesi@0 1192 $info['tokens']['user'][$field->token_name]['type'] = 'date';
danielebarchiesi@0 1193 break;
danielebarchiesi@0 1194 }
danielebarchiesi@0 1195 }
danielebarchiesi@0 1196
danielebarchiesi@0 1197 return $info;
danielebarchiesi@0 1198 }
danielebarchiesi@0 1199
danielebarchiesi@0 1200 /**
danielebarchiesi@0 1201 * Implements hook_tokens() on behalf of profile.module.
danielebarchiesi@0 1202 */
danielebarchiesi@0 1203 function profile_tokens($type, $tokens, array $data = array(), array $options = array()) {
danielebarchiesi@0 1204 $replacements = array();
danielebarchiesi@0 1205 $sanitize = !empty($options['sanitize']);
danielebarchiesi@0 1206 $language_code = isset($options['language']) ? $options['language']->language : NULL;
danielebarchiesi@0 1207
danielebarchiesi@0 1208 if ($type == 'user' && !empty($data['user'])) {
danielebarchiesi@0 1209 $account = $data['user'];
danielebarchiesi@0 1210
danielebarchiesi@0 1211 // Load profile fields if this is the global user account.
danielebarchiesi@0 1212 // @see http://drupal.org/node/361471
danielebarchiesi@0 1213 // @see http://drupal.org/node/967330
danielebarchiesi@0 1214 if ($account->uid == $GLOBALS['user']->uid && isset($account->timestamp)) {
danielebarchiesi@0 1215 $profile_users = array($account->uid => $account);
danielebarchiesi@0 1216 profile_user_load($profile_users);
danielebarchiesi@0 1217 $account = $profile_users[$account->uid];
danielebarchiesi@0 1218 }
danielebarchiesi@0 1219
danielebarchiesi@0 1220 $profile_fields = _token_profile_fields();
danielebarchiesi@0 1221 foreach ($tokens as $name => $original) {
danielebarchiesi@0 1222 if (isset($profile_fields[$name]) && !empty($account->{$profile_fields[$name]->name})) {
danielebarchiesi@0 1223 $value = $account->{$profile_fields[$name]->name};
danielebarchiesi@0 1224 switch ($profile_fields[$name]->type) {
danielebarchiesi@0 1225 case 'textarea':
danielebarchiesi@0 1226 $replacements[$original] = $sanitize ? check_markup($value, filter_default_format($account), '', TRUE) : $value;
danielebarchiesi@0 1227 break;
danielebarchiesi@0 1228 case 'date':
danielebarchiesi@0 1229 $timestamp = gmmktime(0, 0, 0, $value['month'], $value['day'], $value['year']);
danielebarchiesi@0 1230 $replacements[$original] = format_date($timestamp, 'medium', '', NULL, $language_code);
danielebarchiesi@0 1231 break;
danielebarchiesi@0 1232 case 'url':
danielebarchiesi@0 1233 $replacements[$original] = $sanitize ? check_url($value) : $value;
danielebarchiesi@0 1234 break;
danielebarchiesi@0 1235 case 'checkbox':
danielebarchiesi@0 1236 // Checkbox field if checked should return the text.
danielebarchiesi@0 1237 $replacements[$original] = $sanitize ? check_plain($profile_fields[$name]->title) : $profile_fields[$name]->title;
danielebarchiesi@0 1238 break;
danielebarchiesi@0 1239 case 'list':
danielebarchiesi@0 1240 $value = preg_split("/[,\n\r]/", $value);
danielebarchiesi@0 1241 $value = array_map('trim', $value);
danielebarchiesi@0 1242 $value = implode(', ', $value);
danielebarchiesi@0 1243 // Intentionally fall through to the default condition.
danielebarchiesi@0 1244 default:
danielebarchiesi@0 1245 $replacements[$original] = $sanitize ? check_plain($value) : $value;
danielebarchiesi@0 1246 break;
danielebarchiesi@0 1247 }
danielebarchiesi@0 1248 }
danielebarchiesi@0 1249 }
danielebarchiesi@0 1250
danielebarchiesi@0 1251 // Chained token relationships.
danielebarchiesi@0 1252 foreach ($profile_fields as $field) {
danielebarchiesi@0 1253 if ($field->type == 'date' && isset($account->{$field->name}) && $field_tokens = token_find_with_prefix($tokens, $field->token_name)) {
danielebarchiesi@0 1254 $date = $account->{$field->name};
danielebarchiesi@0 1255 $replacements += token_generate('date', $field_tokens, array('date' => gmmktime(0, 0, 0, $date['month'], $date['day'], $date['year'])), $options);
danielebarchiesi@0 1256 }
danielebarchiesi@0 1257 }
danielebarchiesi@0 1258 }
danielebarchiesi@0 1259
danielebarchiesi@0 1260 return $replacements;
danielebarchiesi@0 1261 }
danielebarchiesi@0 1262
danielebarchiesi@0 1263 /**
danielebarchiesi@0 1264 * Fetch an array of profile field objects, keyed by token name.
danielebarchiesi@0 1265 */
danielebarchiesi@0 1266 function _token_profile_fields() {
danielebarchiesi@0 1267 $fields = &drupal_static(__FUNCTION__);
danielebarchiesi@0 1268
danielebarchiesi@0 1269 if (!isset($fields)) {
danielebarchiesi@0 1270 $fields = array();
danielebarchiesi@0 1271 $results = db_query("SELECT name, title, category, type FROM {profile_field}");
danielebarchiesi@0 1272 foreach ($results as $field) {
danielebarchiesi@0 1273 $field->token_name = token_clean_token_name($field->name);
danielebarchiesi@0 1274 $fields[$field->token_name] = $field;
danielebarchiesi@0 1275 }
danielebarchiesi@0 1276 }
danielebarchiesi@0 1277
danielebarchiesi@0 1278 return $fields;
danielebarchiesi@0 1279 }
danielebarchiesi@0 1280
danielebarchiesi@0 1281 /**
danielebarchiesi@0 1282 * Fetch an array of field data used for tokens.
danielebarchiesi@0 1283 */
danielebarchiesi@0 1284 function _token_field_info($field_name = NULL) {
danielebarchiesi@0 1285 $info = &drupal_static(__FUNCTION__);
danielebarchiesi@0 1286
danielebarchiesi@0 1287 if (!isset($fields)) {
danielebarchiesi@0 1288 if ($cached = cache_get('field:info', 'cache_token')) {
danielebarchiesi@0 1289 $info = $cached->data;
danielebarchiesi@0 1290 }
danielebarchiesi@0 1291 else {
danielebarchiesi@0 1292 $info = array();
danielebarchiesi@0 1293
danielebarchiesi@0 1294 $fields = field_info_fields();
danielebarchiesi@0 1295 $instances = field_info_instances();
danielebarchiesi@0 1296 $type_info = field_info_field_types();
danielebarchiesi@0 1297 $entity_info = entity_get_info();
danielebarchiesi@0 1298
danielebarchiesi@0 1299 foreach ($fields as $field) {
danielebarchiesi@0 1300 $key = $field['field_name'];
danielebarchiesi@0 1301 if (!empty($field['bundles'])) {
danielebarchiesi@0 1302 foreach (array_keys($field['bundles']) as $entity) {
danielebarchiesi@0 1303 // Make sure a token type exists for this entity.
danielebarchiesi@0 1304 $token_type = token_get_entity_mapping('entity', $entity);
danielebarchiesi@0 1305 if (empty($token_type)) {
danielebarchiesi@0 1306 continue;
danielebarchiesi@0 1307 }
danielebarchiesi@0 1308
danielebarchiesi@0 1309 $info[$key]['token types'][] = $token_type;
danielebarchiesi@0 1310 $info[$key] += array('labels' => array(), 'bundles' => array());
danielebarchiesi@0 1311
danielebarchiesi@0 1312 // Find which label is most commonly used.
danielebarchiesi@0 1313 foreach ($field['bundles'][$entity] as $bundle) {
danielebarchiesi@0 1314 // Field information will included fields attached to disabled
danielebarchiesi@0 1315 // bundles, so check that the bundle exists before provided a
danielebarchiesi@0 1316 // token for it.
danielebarchiesi@0 1317 // @see http://drupal.org/node/1252566
danielebarchiesi@0 1318 if (!isset($entity_info[$entity]['bundles'][$bundle])) {
danielebarchiesi@0 1319 continue;
danielebarchiesi@0 1320 }
danielebarchiesi@0 1321
danielebarchiesi@0 1322 $info[$key]['labels'][] = $instances[$entity][$bundle][$key]['label'];
danielebarchiesi@0 1323 $info[$key]['bundles'][$token_type][$bundle] = $entity_info[$entity]['bundles'][$bundle]['label'];
danielebarchiesi@0 1324 }
danielebarchiesi@0 1325 }
danielebarchiesi@0 1326 }
danielebarchiesi@0 1327
danielebarchiesi@0 1328 if (isset($info[$key])) {
danielebarchiesi@0 1329 $labels = array_count_values($info[$key]['labels']);
danielebarchiesi@0 1330 arsort($labels);
danielebarchiesi@0 1331 $info[$key]['label'] = check_plain(key($labels));
danielebarchiesi@0 1332
danielebarchiesi@0 1333 // Generate a description for the token.
danielebarchiesi@0 1334 $info[$key]['description'] = t('@type field.', array('@type' => $type_info[$field['type']]['label']));
danielebarchiesi@0 1335 if ($also_known_as = array_unique(array_diff($info[$key]['labels'], array($info[$key]['label'])))) {
danielebarchiesi@0 1336 $info[$key]['description'] .= ' ' . t('Also known as %labels.', array('%labels' => implode(', ', $also_known_as)));
danielebarchiesi@0 1337 }
danielebarchiesi@0 1338 }
danielebarchiesi@0 1339 }
danielebarchiesi@0 1340
danielebarchiesi@0 1341 drupal_alter('token_field_info', $info);
danielebarchiesi@0 1342 cache_set('field:info', $info, 'cache_token');
danielebarchiesi@0 1343 }
danielebarchiesi@0 1344 }
danielebarchiesi@0 1345
danielebarchiesi@0 1346 if (isset($field_name)) {
danielebarchiesi@0 1347 return isset($info[$field_name]) ? $info[$field_name] : FALSE;
danielebarchiesi@0 1348 }
danielebarchiesi@0 1349
danielebarchiesi@0 1350 return $info;
danielebarchiesi@0 1351 }
danielebarchiesi@0 1352
danielebarchiesi@0 1353 /**
danielebarchiesi@0 1354 * Implements hook_token_info_alter() on behalf of field.module.
danielebarchiesi@0 1355 *
danielebarchiesi@0 1356 * We use hook_token_info_alter() rather than hook_token_info() as other
danielebarchiesi@0 1357 * modules may already have defined some field tokens.
danielebarchiesi@0 1358 */
danielebarchiesi@0 1359 function field_token_info_alter(&$info) {
danielebarchiesi@0 1360 $fields = _token_field_info();
danielebarchiesi@0 1361
danielebarchiesi@0 1362 // Attach field tokens to their respecitve entity tokens.
danielebarchiesi@0 1363 foreach ($fields as $field_name => $field) {
danielebarchiesi@0 1364 foreach (array_keys($field['bundles']) as $token_type) {
danielebarchiesi@0 1365 // If a token already exists for this field, then don't add it.
danielebarchiesi@0 1366 if (isset($info['tokens'][$token_type][$field_name])) {
danielebarchiesi@0 1367 continue;
danielebarchiesi@0 1368 }
danielebarchiesi@0 1369
danielebarchiesi@0 1370 // Ensure the tokens exist.
danielebarchiesi@0 1371 if (!isset($info['types'][$token_type]) || !isset($info['tokens'][$token_type])) {
danielebarchiesi@0 1372 continue;
danielebarchiesi@0 1373 }
danielebarchiesi@0 1374
danielebarchiesi@0 1375 if ($token_type == 'comment' && $field_name == 'comment_body') {
danielebarchiesi@0 1376 // Core provides the comment field as [comment:body].
danielebarchiesi@0 1377 continue;
danielebarchiesi@0 1378 }
danielebarchiesi@0 1379
danielebarchiesi@0 1380 $info['tokens'][$token_type][$field_name] = array(
danielebarchiesi@0 1381 // Note that label and description have already been sanitized by _token_field_info().
danielebarchiesi@0 1382 'name' => $field['label'],
danielebarchiesi@0 1383 'description' => $field['description'],
danielebarchiesi@0 1384 'module' => 'token',
danielebarchiesi@0 1385 );
danielebarchiesi@0 1386 }
danielebarchiesi@0 1387 }
danielebarchiesi@0 1388 }
danielebarchiesi@0 1389
danielebarchiesi@0 1390 /**
danielebarchiesi@0 1391 * Implements hook_tokens() on behalf of field.module.
danielebarchiesi@0 1392 */
danielebarchiesi@0 1393 function field_tokens($type, $tokens, array $data = array(), array $options = array()) {
danielebarchiesi@0 1394 $replacements = array();
danielebarchiesi@0 1395 $sanitize = !empty($options['sanitize']);
danielebarchiesi@0 1396 $langcode = isset($options['language']) ? $options['language']->language : NULL;
danielebarchiesi@0 1397
danielebarchiesi@0 1398 // Entity tokens.
danielebarchiesi@0 1399 if ($type == 'entity' && !empty($data['entity_type']) && !empty($data['entity']) && !empty($data['token_type'])) {
danielebarchiesi@0 1400 $entity_type = $data['entity_type'];
danielebarchiesi@0 1401
danielebarchiesi@0 1402 // The field API does weird stuff to the entity, so let's clone it.
danielebarchiesi@0 1403 $entity = clone $data['entity'];
danielebarchiesi@0 1404
danielebarchiesi@0 1405 // Reset the prepared view flag in case token generation is called from
danielebarchiesi@0 1406 // inside field_attach_view().
danielebarchiesi@0 1407 unset($entity->_field_view_prepared);
danielebarchiesi@0 1408
danielebarchiesi@0 1409 list(, , $bundle) = entity_extract_ids($entity_type, $entity);
danielebarchiesi@0 1410 $fields = field_info_instances($entity_type, $bundle);
danielebarchiesi@0 1411
danielebarchiesi@0 1412 foreach (array_keys($fields) as $field_name) {
danielebarchiesi@0 1413 // Do not continue if the field is empty.
danielebarchiesi@0 1414 if (empty($entity->{$field_name})) {
danielebarchiesi@0 1415 continue;
danielebarchiesi@0 1416 }
danielebarchiesi@0 1417
danielebarchiesi@0 1418 // Replace the [entity:field-name] token only if token module added this
danielebarchiesi@0 1419 // token.
danielebarchiesi@0 1420 if (isset($tokens[$field_name]) && _token_module($data['token_type'], $field_name) == 'token') {
danielebarchiesi@0 1421 $original = $tokens[$field_name];
danielebarchiesi@0 1422
danielebarchiesi@0 1423 $field_output = field_view_field($entity_type, $entity, $field_name, 'token', $langcode);
danielebarchiesi@0 1424 $field_output['#token_options'] = $options;
danielebarchiesi@0 1425 $field_output['#pre_render'][] = 'token_pre_render_field_token';
danielebarchiesi@0 1426 $replacements[$original] = drupal_render($field_output);
danielebarchiesi@0 1427 }
danielebarchiesi@0 1428 }
danielebarchiesi@0 1429
danielebarchiesi@0 1430 // Remove the cloned object from memory.
danielebarchiesi@0 1431 unset($entity);
danielebarchiesi@0 1432 }
danielebarchiesi@0 1433
danielebarchiesi@0 1434 return $replacements;
danielebarchiesi@0 1435 }
danielebarchiesi@0 1436
danielebarchiesi@0 1437 /**
danielebarchiesi@0 1438 * Pre-render callback for field output used with tokens.
danielebarchiesi@0 1439 */
danielebarchiesi@0 1440 function token_pre_render_field_token(&$elements) {
danielebarchiesi@0 1441 // Remove the field theme hook, attachments, and JavaScript states.
danielebarchiesi@0 1442 unset($elements['#theme']);
danielebarchiesi@0 1443 unset($elements['#states']);
danielebarchiesi@0 1444 unset($elements['#attached']);
danielebarchiesi@0 1445
danielebarchiesi@0 1446 // Prevent multi-value fields from appearing smooshed together by appending
danielebarchiesi@0 1447 // a join suffix to all but the last value.
danielebarchiesi@0 1448 $deltas = element_get_visible_children($elements);
danielebarchiesi@0 1449 $count = count($deltas);
danielebarchiesi@0 1450 if ($count > 1) {
danielebarchiesi@0 1451 $join = isset($elements['#token_options']['join']) ? $elements['#token_options']['join'] : ", ";
danielebarchiesi@0 1452 foreach ($deltas as $index => $delta) {
danielebarchiesi@0 1453 // Do not add a suffix to the last item.
danielebarchiesi@0 1454 if ($index < ($count - 1)) {
danielebarchiesi@0 1455 $elements[$delta] += array('#suffix' => $join);
danielebarchiesi@0 1456 }
danielebarchiesi@0 1457 }
danielebarchiesi@0 1458 }
danielebarchiesi@0 1459 return $elements;
danielebarchiesi@0 1460 }