annotate core/modules/node/node.tokens.inc @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /**
Chris@0 4 * @file
Chris@0 5 * Builds placeholder replacement tokens for node-related data.
Chris@0 6 */
Chris@0 7
Chris@0 8 use Drupal\Core\Datetime\Entity\DateFormat;
Chris@0 9 use Drupal\Core\Language\LanguageInterface;
Chris@0 10 use Drupal\Core\Render\BubbleableMetadata;
Chris@0 11 use Drupal\user\Entity\User;
Chris@0 12
Chris@0 13 /**
Chris@0 14 * Implements hook_token_info().
Chris@0 15 */
Chris@0 16 function node_token_info() {
Chris@0 17 $type = [
Chris@0 18 'name' => t('Nodes'),
Chris@0 19 'description' => t('Tokens related to individual content items, or "nodes".'),
Chris@0 20 'needs-data' => 'node',
Chris@0 21 ];
Chris@0 22
Chris@0 23 // Core tokens for nodes.
Chris@0 24 $node['nid'] = [
Chris@0 25 'name' => t("Content ID"),
Chris@0 26 'description' => t('The unique ID of the content item, or "node".'),
Chris@0 27 ];
Chris@0 28 $node['vid'] = [
Chris@0 29 'name' => t("Revision ID"),
Chris@0 30 'description' => t("The unique ID of the node's latest revision."),
Chris@0 31 ];
Chris@0 32 $node['type'] = [
Chris@0 33 'name' => t("Content type"),
Chris@0 34 ];
Chris@0 35 $node['type-name'] = [
Chris@0 36 'name' => t("Content type name"),
Chris@0 37 'description' => t("The human-readable name of the node type."),
Chris@0 38 ];
Chris@0 39 $node['title'] = [
Chris@0 40 'name' => t("Title"),
Chris@0 41 ];
Chris@0 42 $node['body'] = [
Chris@0 43 'name' => t("Body"),
Chris@0 44 'description' => t("The main body text of the node."),
Chris@0 45 ];
Chris@0 46 $node['summary'] = [
Chris@0 47 'name' => t("Summary"),
Chris@0 48 'description' => t("The summary of the node's main body text."),
Chris@0 49 ];
Chris@0 50 $node['langcode'] = [
Chris@0 51 'name' => t('Language code'),
Chris@0 52 'description' => t('The language code of the language the node is written in.'),
Chris@0 53 ];
Chris@0 54 $node['url'] = [
Chris@0 55 'name' => t("URL"),
Chris@0 56 'description' => t("The URL of the node."),
Chris@0 57 ];
Chris@0 58 $node['edit-url'] = [
Chris@0 59 'name' => t("Edit URL"),
Chris@0 60 'description' => t("The URL of the node's edit page."),
Chris@0 61 ];
Chris@0 62
Chris@0 63 // Chained tokens for nodes.
Chris@0 64 $node['created'] = [
Chris@0 65 'name' => t("Date created"),
Chris@0 66 'type' => 'date',
Chris@0 67 ];
Chris@0 68 $node['changed'] = [
Chris@0 69 'name' => t("Date changed"),
Chris@0 70 'description' => t("The date the node was most recently updated."),
Chris@0 71 'type' => 'date',
Chris@0 72 ];
Chris@0 73 $node['author'] = [
Chris@0 74 'name' => t("Author"),
Chris@0 75 'type' => 'user',
Chris@0 76 ];
Chris@0 77
Chris@0 78 return [
Chris@0 79 'types' => ['node' => $type],
Chris@0 80 'tokens' => ['node' => $node],
Chris@0 81 ];
Chris@0 82 }
Chris@0 83
Chris@0 84 /**
Chris@0 85 * Implements hook_tokens().
Chris@0 86 */
Chris@0 87 function node_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
Chris@0 88 $token_service = \Drupal::token();
Chris@0 89
Chris@0 90 $url_options = ['absolute' => TRUE];
Chris@0 91 if (isset($options['langcode'])) {
Chris@0 92 $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']);
Chris@0 93 $langcode = $options['langcode'];
Chris@0 94 }
Chris@0 95 else {
Chris@0 96 $langcode = LanguageInterface::LANGCODE_DEFAULT;
Chris@0 97 }
Chris@0 98 $replacements = [];
Chris@0 99
Chris@0 100 if ($type == 'node' && !empty($data['node'])) {
Chris@0 101 /** @var \Drupal\node\NodeInterface $node */
Chris@0 102 $node = $data['node'];
Chris@0 103
Chris@0 104 foreach ($tokens as $name => $original) {
Chris@0 105 switch ($name) {
Chris@0 106 // Simple key values on the node.
Chris@0 107 case 'nid':
Chris@0 108 $replacements[$original] = $node->id();
Chris@0 109 break;
Chris@0 110
Chris@0 111 case 'vid':
Chris@0 112 $replacements[$original] = $node->getRevisionId();
Chris@0 113 break;
Chris@0 114
Chris@0 115 case 'type':
Chris@0 116 $replacements[$original] = $node->getType();
Chris@0 117 break;
Chris@0 118
Chris@0 119 case 'type-name':
Chris@0 120 $type_name = node_get_type_label($node);
Chris@0 121 $replacements[$original] = $type_name;
Chris@0 122 break;
Chris@0 123
Chris@0 124 case 'title':
Chris@0 125 $replacements[$original] = $node->getTitle();
Chris@0 126 break;
Chris@0 127
Chris@0 128 case 'body':
Chris@0 129 case 'summary':
Chris@18 130 $translation = \Drupal::service('entity.repository')->getTranslationFromContext($node, $langcode, ['operation' => 'node_tokens']);
Chris@0 131 if ($translation->hasField('body') && ($items = $translation->get('body')) && !$items->isEmpty()) {
Chris@0 132 $item = $items[0];
Chris@0 133 // If the summary was requested and is not empty, use it.
Chris@0 134 if ($name == 'summary' && !empty($item->summary)) {
Chris@0 135 $output = $item->summary_processed;
Chris@0 136 }
Chris@0 137 // Attempt to provide a suitable version of the 'body' field.
Chris@0 138 else {
Chris@0 139 $output = $item->processed;
Chris@0 140 // A summary was requested.
Chris@0 141 if ($name == 'summary') {
Chris@0 142 // Generate an optionally trimmed summary of the body field.
Chris@0 143
Chris@0 144 // Get the 'trim_length' size used for the 'teaser' mode, if
Chris@0 145 // present, or use the default trim_length size.
Chris@0 146 $display_options = entity_get_display('node', $node->getType(), 'teaser')->getComponent('body');
Chris@0 147 if (isset($display_options['settings']['trim_length'])) {
Chris@0 148 $length = $display_options['settings']['trim_length'];
Chris@0 149 }
Chris@0 150 else {
Chris@0 151 $settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('text_summary_or_trimmed');
Chris@0 152 $length = $settings['trim_length'];
Chris@0 153 }
Chris@0 154
Chris@0 155 $output = text_summary($output, $item->format, $length);
Chris@0 156 }
Chris@0 157 }
Chris@0 158 // "processed" returns a \Drupal\Component\Render\MarkupInterface
Chris@0 159 // via check_markup().
Chris@0 160 $replacements[$original] = $output;
Chris@0 161 }
Chris@0 162 break;
Chris@0 163
Chris@0 164 case 'langcode':
Chris@0 165 $replacements[$original] = $node->language()->getId();
Chris@0 166 break;
Chris@0 167
Chris@0 168 case 'url':
Chris@18 169 $replacements[$original] = $node->toUrl('canonical', $url_options)->toString();
Chris@0 170 break;
Chris@0 171
Chris@0 172 case 'edit-url':
Chris@18 173 $replacements[$original] = $node->toUrl('edit-form', $url_options)->toString();
Chris@0 174 break;
Chris@0 175
Chris@0 176 // Default values for the chained tokens handled below.
Chris@0 177 case 'author':
Chris@0 178 $account = $node->getOwner() ? $node->getOwner() : User::load(0);
Chris@0 179 $bubbleable_metadata->addCacheableDependency($account);
Chris@0 180 $replacements[$original] = $account->label();
Chris@0 181 break;
Chris@0 182
Chris@0 183 case 'created':
Chris@0 184 $date_format = DateFormat::load('medium');
Chris@0 185 $bubbleable_metadata->addCacheableDependency($date_format);
Chris@18 186 $replacements[$original] = \Drupal::service('date.formatter')->format($node->getCreatedTime(), 'medium', '', NULL, $langcode);
Chris@0 187 break;
Chris@0 188
Chris@0 189 case 'changed':
Chris@0 190 $date_format = DateFormat::load('medium');
Chris@0 191 $bubbleable_metadata->addCacheableDependency($date_format);
Chris@18 192 $replacements[$original] = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'medium', '', NULL, $langcode);
Chris@0 193 break;
Chris@0 194 }
Chris@0 195 }
Chris@0 196
Chris@0 197 if ($author_tokens = $token_service->findWithPrefix($tokens, 'author')) {
Chris@0 198 $replacements += $token_service->generate('user', $author_tokens, ['user' => $node->getOwner()], $options, $bubbleable_metadata);
Chris@0 199 }
Chris@0 200
Chris@0 201 if ($created_tokens = $token_service->findWithPrefix($tokens, 'created')) {
Chris@0 202 $replacements += $token_service->generate('date', $created_tokens, ['date' => $node->getCreatedTime()], $options, $bubbleable_metadata);
Chris@0 203 }
Chris@0 204
Chris@0 205 if ($changed_tokens = $token_service->findWithPrefix($tokens, 'changed')) {
Chris@0 206 $replacements += $token_service->generate('date', $changed_tokens, ['date' => $node->getChangedTime()], $options, $bubbleable_metadata);
Chris@0 207 }
Chris@0 208 }
Chris@0 209
Chris@0 210 return $replacements;
Chris@0 211 }