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 }
|