t("Site information"), 'description' => t("Tokens for site-wide settings and other global information."), ); $types['date'] = array( 'name' => t("Dates"), 'description' => t("Tokens related to times and dates."), ); // Site-wide global tokens. $site['name'] = array( 'name' => t("Name"), 'description' => t("The name of the site."), ); $site['slogan'] = array( 'name' => t("Slogan"), 'description' => t("The slogan of the site."), ); $site['mail'] = array( 'name' => t("Email"), 'description' => t("The administrative email address for the site."), ); $site['url'] = array( 'name' => t("URL"), 'description' => t("The URL of the site's front page."), ); $site['url-brief'] = array( 'name' => t("URL (brief)"), 'description' => t("The URL of the site's front page without the protocol."), ); $site['login-url'] = array( 'name' => t("Login page"), 'description' => t("The URL of the site's login page."), ); // Date related tokens. $date['short'] = array( 'name' => t("Short format"), 'description' => t("A date in 'short' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'short'))), ); $date['medium'] = array( 'name' => t("Medium format"), 'description' => t("A date in 'medium' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'medium'))), ); $date['long'] = array( 'name' => t("Long format"), 'description' => t("A date in 'long' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'long'))), ); $date['custom'] = array( 'name' => t("Custom format"), 'description' => t('A date in a custom format. See the PHP documentation for details.'), ); $date['since'] = array( 'name' => t("Time-since"), 'description' => t("A date in 'time-since' format. (%date)", array('%date' => \Drupal::service('date.formatter')->formatTimeDiffSince(REQUEST_TIME - 360))), ); $date['raw'] = array( 'name' => t("Raw timestamp"), 'description' => t("A date in UNIX timestamp format (%date)", array('%date' => REQUEST_TIME)), ); return array( 'types' => $types, 'tokens' => array( 'site' => $site, 'date' => $date, ), ); } /** * Implements hook_tokens(). */ function system_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) { $token_service = \Drupal::token(); $url_options = array('absolute' => TRUE); if (isset($options['langcode'])) { $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']); $langcode = $options['langcode']; } else { $langcode = NULL; } $sanitize = !empty($options['sanitize']); $replacements = array(); if ($type == 'site') { foreach ($tokens as $name => $original) { switch ($name) { case 'name': $config = \Drupal::config('system.site'); $bubbleable_metadata->addCacheableDependency($config); $site_name = $config->get('name'); $replacements[$original] = $sanitize ? SafeMarkup::checkPlain($site_name) : $site_name; break; case 'slogan': $config = \Drupal::config('system.site'); $bubbleable_metadata->addCacheableDependency($config); $slogan = $config->get('slogan'); $replacements[$original] = $sanitize ? Xss::filterAdmin($slogan) : $slogan; break; case 'mail': $config = \Drupal::config('system.site'); $bubbleable_metadata->addCacheableDependency($config); $replacements[$original] = $config->get('mail'); break; case 'url': /** @var \Drupal\Core\GeneratedUrl $result */ $result = \Drupal::url('', array(), $url_options, TRUE); $bubbleable_metadata->addCacheableDependency($result); $replacements[$original] = $result->getGeneratedUrl(); break; case 'url-brief': /** @var \Drupal\Core\GeneratedUrl $result */ $result = \Drupal::url('', array(), $url_options, TRUE); $bubbleable_metadata->addCacheableDependency($result); $replacements[$original] = preg_replace(array('!^https?://!', '!/$!'), '', $result->getGeneratedUrl()); break; case 'login-url': /** @var \Drupal\Core\GeneratedUrl $result */ $result = \Drupal::url('user.page', [], $url_options, TRUE); $bubbleable_metadata->addCacheableDependency($result); $replacements[$original] = $result->getGeneratedUrl(); break; } } } elseif ($type == 'date') { if (empty($data['date'])) { $date = REQUEST_TIME; // We depend on the current request time, so the tokens are not cacheable // at all. $bubbleable_metadata->setCacheMaxAge(0); } else { $date = $data['date']; } foreach ($tokens as $name => $original) { switch ($name) { case 'short': $date_format = DateFormat::load('short'); $bubbleable_metadata->addCacheableDependency($date_format); $replacements[$original] = format_date($date, 'short', '', NULL, $langcode); break; case 'medium': $date_format = DateFormat::load('medium'); $bubbleable_metadata->addCacheableDependency($date_format); $replacements[$original] = format_date($date, 'medium', '', NULL, $langcode); break; case 'long': $date_format = DateFormat::load('long'); $bubbleable_metadata->addCacheableDependency($date_format); $replacements[$original] = format_date($date, 'long', '', NULL, $langcode); break; case 'since': $replacements[$original] = \Drupal::service('date.formatter')->formatTimeDiffSince($date, array('langcode' => $langcode)); $bubbleable_metadata->setCacheMaxAge(0); break; case 'raw': $replacements[$original] = $sanitize ? SafeMarkup::checkPlain($date) : $date; break; } } if ($created_tokens = $token_service->findWithPrefix($tokens, 'custom')) { foreach ($created_tokens as $name => $original) { $replacements[$original] = format_date($date, 'custom', $name, NULL, $langcode); } } } return $replacements; }