danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Install, update and uninstall functions for the token module.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Implements hook_requirements().
|
danielebarchiesi@0
|
10 */
|
danielebarchiesi@0
|
11 function token_requirements($phase = 'runtime') {
|
danielebarchiesi@0
|
12 $requirements = array();
|
danielebarchiesi@0
|
13 $t = get_t();
|
danielebarchiesi@0
|
14
|
danielebarchiesi@0
|
15 if ($phase == 'runtime') {
|
danielebarchiesi@0
|
16 // Check for various token definition problems.
|
danielebarchiesi@0
|
17 $token_problems = token_get_token_problems();
|
danielebarchiesi@0
|
18 // Format and display each token problem.
|
danielebarchiesi@0
|
19 foreach ($token_problems as $problem_key => $problem) {
|
danielebarchiesi@0
|
20 if (!empty($problem['problems'])) {
|
danielebarchiesi@0
|
21 $problems = array_unique($problem['problems']);
|
danielebarchiesi@0
|
22 $problems = array_map('check_plain', $problems);
|
danielebarchiesi@0
|
23 $token_problems[$problem_key] = $problem['label'] . theme('item_list', array('items' => $problems));
|
danielebarchiesi@0
|
24 }
|
danielebarchiesi@0
|
25 else {
|
danielebarchiesi@0
|
26 unset($token_problems[$problem_key]);
|
danielebarchiesi@0
|
27 }
|
danielebarchiesi@0
|
28 }
|
danielebarchiesi@0
|
29 if (!empty($token_problems)) {
|
danielebarchiesi@0
|
30 $requirements['token_problems'] = array(
|
danielebarchiesi@0
|
31 'title' => $t('Tokens'),
|
danielebarchiesi@0
|
32 'value' => $t('Problems detected'),
|
danielebarchiesi@0
|
33 'severity' => REQUIREMENT_WARNING,
|
danielebarchiesi@0
|
34 'description' => '<p>' . implode('</p><p>', $token_problems) . '</p>', //theme('item_list', array('items' => $token_problems)),
|
danielebarchiesi@0
|
35 );
|
danielebarchiesi@0
|
36 }
|
danielebarchiesi@0
|
37 }
|
danielebarchiesi@0
|
38
|
danielebarchiesi@0
|
39 return $requirements;
|
danielebarchiesi@0
|
40 }
|
danielebarchiesi@0
|
41
|
danielebarchiesi@0
|
42 /**
|
danielebarchiesi@0
|
43 * Implements hook_schema().
|
danielebarchiesi@0
|
44 */
|
danielebarchiesi@0
|
45 function token_schema() {
|
danielebarchiesi@0
|
46 $schema['cache_token'] = drupal_get_schema_unprocessed('system', 'cache');
|
danielebarchiesi@0
|
47 $schema['cache_token']['description'] = 'Cache table for token information.';
|
danielebarchiesi@0
|
48 return $schema;
|
danielebarchiesi@0
|
49 }
|
danielebarchiesi@0
|
50
|
danielebarchiesi@0
|
51 /**
|
danielebarchiesi@0
|
52 * Add the cache_token table.
|
danielebarchiesi@0
|
53 */
|
danielebarchiesi@0
|
54 function token_update_7000() {
|
danielebarchiesi@0
|
55 if (!db_table_exists('cache_token')) {
|
danielebarchiesi@0
|
56 $schema = drupal_get_schema_unprocessed('system', 'cache');
|
danielebarchiesi@0
|
57 $schema['description'] = 'Cache table for token information.';
|
danielebarchiesi@0
|
58 db_create_table('cache_token', $schema);
|
danielebarchiesi@0
|
59 }
|
danielebarchiesi@0
|
60 }
|
danielebarchiesi@0
|
61
|
danielebarchiesi@0
|
62 /**
|
danielebarchiesi@0
|
63 * Deprecate and disable the token_actions module.
|
danielebarchiesi@0
|
64 */
|
danielebarchiesi@0
|
65 function token_update_7001() {
|
danielebarchiesi@0
|
66 module_disable(array('token_actions'));
|
danielebarchiesi@0
|
67 return 'The Token actions module has been deprecated by the updated system module actions that support tokens.';
|
danielebarchiesi@0
|
68 }
|
danielebarchiesi@0
|
69
|
danielebarchiesi@0
|
70 /**
|
danielebarchiesi@0
|
71 * Migrate old token_actions module actions to system actions.
|
danielebarchiesi@0
|
72 */
|
danielebarchiesi@0
|
73 //function token_update_700X() {
|
danielebarchiesi@0
|
74 // $actions = db_query("SELECT aid, type, callback, parameters, label FROM {actions} WHERE type = 'system' AND callback IN ('token_actions_message_action', 'token_actions_send_email_action', 'token_actions_goto_action')")->fetchAll();
|
danielebarchiesi@0
|
75 // foreach ($actions as $action) {
|
danielebarchiesi@0
|
76 // $action->parameters = unserialize($action->parameters);
|
danielebarchiesi@0
|
77 // foreach ($action->parameters as $key => $value) {
|
danielebarchiesi@0
|
78 // if (is_string($value)) {
|
danielebarchiesi@0
|
79 // $action->parameters[$key] = token_update_token_text($value);
|
danielebarchiesi@0
|
80 // }
|
danielebarchiesi@0
|
81 // }
|
danielebarchiesi@0
|
82 // $action->callback = str_replace('token_actions_', '', $action->callback);
|
danielebarchiesi@0
|
83 // actions_save($action->callback, $action->type, $action->parameters, $action->label, $action->aid);
|
danielebarchiesi@0
|
84 // }
|
danielebarchiesi@0
|
85 // return 'Token actions module actions migrated to system module actions. You may still want to verify that the actions were upgraded correctly.';
|
danielebarchiesi@0
|
86 //}
|
danielebarchiesi@0
|
87
|
danielebarchiesi@0
|
88 /**
|
danielebarchiesi@0
|
89 * Build a list of Drupal 6 tokens and their Drupal 7 token names.
|
danielebarchiesi@0
|
90 */
|
danielebarchiesi@0
|
91 function _token_upgrade_token_list() {
|
danielebarchiesi@0
|
92 $tokens = array(
|
danielebarchiesi@0
|
93 // Global tokens
|
danielebarchiesi@0
|
94 'user-name' => 'current-user:name',
|
danielebarchiesi@0
|
95 'user-id' => 'current-user:id',
|
danielebarchiesi@0
|
96 'user-mail' => 'current-user:mail',
|
danielebarchiesi@0
|
97 'site-url' => 'site:url',
|
danielebarchiesi@0
|
98 'site-name' => 'site:name',
|
danielebarchiesi@0
|
99 'site-slogan' => 'site:slogan',
|
danielebarchiesi@0
|
100 'site-mission' => 'site:mission',
|
danielebarchiesi@0
|
101 'site-mail' => 'site:mail',
|
danielebarchiesi@0
|
102 'site-date' => 'date:short',
|
danielebarchiesi@0
|
103 //'site-date-' => '', // Date tokens expanded below
|
danielebarchiesi@0
|
104 'current-page-path' => 'current-page:path',
|
danielebarchiesi@0
|
105 'current-page-url' => 'current-page:url',
|
danielebarchiesi@0
|
106 'page-number' => 'current-page:page-number',
|
danielebarchiesi@0
|
107
|
danielebarchiesi@0
|
108 // Comment tokens
|
danielebarchiesi@0
|
109 'comment-cid' => 'comment:cid',
|
danielebarchiesi@0
|
110 'comment-nid' => 'comment:node:nid',
|
danielebarchiesi@0
|
111 'comment-title' => 'comment:title',
|
danielebarchiesi@0
|
112 'comment-body' => 'comment:body',
|
danielebarchiesi@0
|
113 'comment-author-name' => 'comment:author:name',
|
danielebarchiesi@0
|
114 'comment-author-mail' => 'comment:author:mail',
|
danielebarchiesi@0
|
115 //'comment-body-format' => '',
|
danielebarchiesi@0
|
116 //'comment-' => '', // Date tokens expanded below
|
danielebarchiesi@0
|
117 'comment-node-title' => 'comment:node',
|
danielebarchiesi@0
|
118
|
danielebarchiesi@0
|
119 // Node tokens
|
danielebarchiesi@0
|
120 'nid' => 'node:nid',
|
danielebarchiesi@0
|
121 'type' => 'node:type',
|
danielebarchiesi@0
|
122 'type-name' => 'node:type-name',
|
danielebarchiesi@0
|
123 'language' => 'node:language',
|
danielebarchiesi@0
|
124 'title' => 'node:title',
|
danielebarchiesi@0
|
125 'author-uid' => 'node:author:uid',
|
danielebarchiesi@0
|
126 'author-name' => 'node:author:name',
|
danielebarchiesi@0
|
127 'author-mail' => 'node:author:mail',
|
danielebarchiesi@0
|
128 'node_comment_count' => 'node:comment-count',
|
danielebarchiesi@0
|
129 'unread_comment_count' => 'node:comment-count-new',
|
danielebarchiesi@0
|
130 'log' => 'node:log',
|
danielebarchiesi@0
|
131 //'' => '', // Date tokens expanded below
|
danielebarchiesi@0
|
132 //'mod-' => '', // Date tokens expanded below
|
danielebarchiesi@0
|
133 'menupath' => 'node:menu-link:parent:path][node:menu-link',
|
danielebarchiesi@0
|
134 'menu' => 'node:menu-link:menu-name',
|
danielebarchiesi@0
|
135 'menu-link-title' => 'node:menu-link',
|
danielebarchiesi@0
|
136 'menu-link-mlid' => 'node:menu-link:mlid',
|
danielebarchiesi@0
|
137 'menu-link-plid' => 'node:menu-link:parent:mlid',
|
danielebarchiesi@0
|
138 //'term' => 'node:term',
|
danielebarchiesi@0
|
139 //'term-id' => 'node:term:tid',
|
danielebarchiesi@0
|
140 //'vocab' => 'node:term:vocabulary',
|
danielebarchiesi@0
|
141 //'vocab-id' => 'node:term:vocabulary:vid',
|
danielebarchiesi@0
|
142
|
danielebarchiesi@0
|
143 // Book tokens
|
danielebarchiesi@0
|
144 //'book' => 'node:book',
|
danielebarchiesi@0
|
145 //'book_id' => 'node:book:bid',
|
danielebarchiesi@0
|
146 //'bookpath' => 'node:book:path',
|
danielebarchiesi@0
|
147
|
danielebarchiesi@0
|
148 // Taxonomy tokens
|
danielebarchiesi@0
|
149 'tid' => 'term:tid',
|
danielebarchiesi@0
|
150 'cat' => 'term:name',
|
danielebarchiesi@0
|
151 'cat-description' => 'term:description',
|
danielebarchiesi@0
|
152 'vid' => 'term:vocabulary:vid',
|
danielebarchiesi@0
|
153 'vocab' => 'term:vocabulary',
|
danielebarchiesi@0
|
154 'vocab-description' => 'term:vocabulary:description',
|
danielebarchiesi@0
|
155
|
danielebarchiesi@0
|
156 // User tokens
|
danielebarchiesi@0
|
157 'user' => 'user:name',
|
danielebarchiesi@0
|
158 'uid' => 'user:uid',
|
danielebarchiesi@0
|
159 'mail' => 'user:mail',
|
danielebarchiesi@0
|
160 'reg-date' => 'user:created',
|
danielebarchiesi@0
|
161 'reg-since' => 'user:created:since',
|
danielebarchiesi@0
|
162 //'user-created' => '', // Date tokens expanded below
|
danielebarchiesi@0
|
163 'log-date' => 'user:last-login',
|
danielebarchiesi@0
|
164 'log-since' => 'user:last-login:since',
|
danielebarchiesi@0
|
165 //'user-last-login' => '', // Date tokens expanded below
|
danielebarchiesi@0
|
166 //'date-in-tz' => '',
|
danielebarchiesi@0
|
167 'account-url' => 'user:url',
|
danielebarchiesi@0
|
168 'account-edit' => 'user:edit-url',
|
danielebarchiesi@0
|
169 );
|
danielebarchiesi@0
|
170
|
danielebarchiesi@0
|
171 // Account for date tokens which need to be expanded.
|
danielebarchiesi@0
|
172 $tokens += _token_upgrade_token_date_list('site-', 'site:date');
|
danielebarchiesi@0
|
173 $tokens += _token_upgrade_token_date_list('', 'node:created');
|
danielebarchiesi@0
|
174 $tokens += _token_upgrade_token_date_list('mod-', 'node:changed');
|
danielebarchiesi@0
|
175 //$tokens += _token_upgrade_token_date_list('node-revision-', 'node:changed');
|
danielebarchiesi@0
|
176 $tokens += _token_upgrade_token_date_list('comment-', 'comment:created');
|
danielebarchiesi@0
|
177 $tokens += _token_upgrade_token_date_list('user-register-', 'user:created');
|
danielebarchiesi@0
|
178 $tokens += _token_upgrade_token_date_list('user-last-login-', 'user:last-login');
|
danielebarchiesi@0
|
179
|
danielebarchiesi@0
|
180 return $tokens;
|
danielebarchiesi@0
|
181 }
|
danielebarchiesi@0
|
182
|
danielebarchiesi@0
|
183 /**
|
danielebarchiesi@0
|
184 * Build a list of Drupal 6 date tokens and their Drupal 7 token names.
|
danielebarchiesi@0
|
185 */
|
danielebarchiesi@0
|
186 function _token_upgrade_token_date_list($old_token, $new_token) {
|
danielebarchiesi@0
|
187 $tokens = array();
|
danielebarchiesi@0
|
188 $formats = array(
|
danielebarchiesi@0
|
189 'yyyy' => 'Y',
|
danielebarchiesi@0
|
190 'yy' => 'y',
|
danielebarchiesi@0
|
191 'month' => 'F',
|
danielebarchiesi@0
|
192 'mon' => 'M',
|
danielebarchiesi@0
|
193 'mm' => 'm',
|
danielebarchiesi@0
|
194 'm' => 'n',
|
danielebarchiesi@0
|
195 'ww' => 'W',
|
danielebarchiesi@0
|
196 'date' => 'N',
|
danielebarchiesi@0
|
197 'day' => 'l',
|
danielebarchiesi@0
|
198 'ddd' => 'D',
|
danielebarchiesi@0
|
199 'dd' => 'd',
|
danielebarchiesi@0
|
200 'd' => 'j',
|
danielebarchiesi@0
|
201 );
|
danielebarchiesi@0
|
202 foreach ($formats as $token_format => $date_format) {
|
danielebarchiesi@0
|
203 $tokens[$old_token . $token_format] = "$new_token:custom:$date_format";
|
danielebarchiesi@0
|
204 }
|
danielebarchiesi@0
|
205 $tokens[$old_token . 'raw'] = "$new_token:raw";
|
danielebarchiesi@0
|
206 $tokens[$old_token . 'since'] = "$new_token:since";
|
danielebarchiesi@0
|
207 return $tokens;
|
danielebarchiesi@0
|
208 }
|
danielebarchiesi@0
|
209
|
danielebarchiesi@0
|
210 /**
|
danielebarchiesi@0
|
211 * Update a string containing Drupal 6 style tokens to Drupal 7 style tokens.
|
danielebarchiesi@0
|
212 *
|
danielebarchiesi@0
|
213 * @param $text
|
danielebarchiesi@0
|
214 * A string containing tokens.
|
danielebarchiesi@0
|
215 * @param $updates
|
danielebarchiesi@0
|
216 * An optional array of Drupal 7 tokens keyed by their Drupal 6 token name.
|
danielebarchiesi@0
|
217 * The default tokens will be merged into this array. Note neither the old
|
danielebarchiesi@0
|
218 * or new token names should include the surrounding bracket ([ and ])
|
danielebarchiesi@0
|
219 * characters.
|
danielebarchiesi@0
|
220 * @return
|
danielebarchiesi@0
|
221 * A string with the tokens upgraded
|
danielebarchiesi@0
|
222 *
|
danielebarchiesi@0
|
223 * @see _token_upgrade_token_list()
|
danielebarchiesi@0
|
224 */
|
danielebarchiesi@0
|
225 function token_update_token_text($text, $updates = array(), $leading = '[', $trailing = ']') {
|
danielebarchiesi@0
|
226 $updates += _token_upgrade_token_list();
|
danielebarchiesi@0
|
227 $regex = '/' . preg_quote($leading, '/') . '([^\s]*)' . preg_quote($trailing, '/') . '/';
|
danielebarchiesi@0
|
228 preg_match_all($regex, $text, $matches);
|
danielebarchiesi@0
|
229
|
danielebarchiesi@0
|
230 foreach ($matches[1] as $index => $old_token) {
|
danielebarchiesi@0
|
231 if (isset($updates[$old_token])) {
|
danielebarchiesi@0
|
232 $new_token = $updates[$old_token];
|
danielebarchiesi@0
|
233 $text = str_replace("{$leading}{$old_token}{$trailing}", "[$new_token]", $text);
|
danielebarchiesi@0
|
234 // Also replace any tokens that have a -raw suffix.
|
danielebarchiesi@0
|
235 $text = str_replace("{$leading}{$old_token}-raw{$trailing}", "[$new_token]", $text);
|
danielebarchiesi@0
|
236 }
|
danielebarchiesi@0
|
237 }
|
danielebarchiesi@0
|
238
|
danielebarchiesi@0
|
239 return $text;
|
danielebarchiesi@0
|
240 }
|
danielebarchiesi@0
|
241
|
danielebarchiesi@0
|
242 /**
|
danielebarchiesi@0
|
243 * Get token problems.
|
danielebarchiesi@0
|
244 */
|
danielebarchiesi@0
|
245 function token_get_token_problems() {
|
danielebarchiesi@0
|
246 // @todo Improve the duplicate checking to report which modules are the offenders.
|
danielebarchiesi@0
|
247 //$token_info = array();
|
danielebarchiesi@0
|
248 //foreach (module_implements('token_info') as $module) {
|
danielebarchiesi@0
|
249 // $module_token_info = module_invoke($module, 'token_info');
|
danielebarchiesi@0
|
250 // if (in_array($module, _token_core_supported_modules())) {
|
danielebarchiesi@0
|
251 // $module .= '/token';
|
danielebarchiesi@0
|
252 // }
|
danielebarchiesi@0
|
253 // if (isset($module_token_info['types'])) {
|
danielebarchiesi@0
|
254 // if (is_array($module_token_info['types'])) {
|
danielebarchiesi@0
|
255 // foreach (array_keys($module_token_info['types']) as $type) {
|
danielebarchiesi@0
|
256 // if (is_array($module_token_info['types'][$type])) {
|
danielebarchiesi@0
|
257 // $module_token_info['types'][$type] += array('module' => $module);
|
danielebarchiesi@0
|
258 // }
|
danielebarchiesi@0
|
259 // }
|
danielebarchiesi@0
|
260 // }
|
danielebarchiesi@0
|
261 // }
|
danielebarchiesi@0
|
262 // if (isset($module_token_info['tokens'])) {
|
danielebarchiesi@0
|
263 // if (is_array($module_token_info['tokens'])) {
|
danielebarchiesi@0
|
264 //
|
danielebarchiesi@0
|
265 // }
|
danielebarchiesi@0
|
266 // }
|
danielebarchiesi@0
|
267 // if (is_array($module_token_info)) {
|
danielebarchiesi@0
|
268 // $token_info = array_merge_recursive($token_info, $module_token_info);
|
danielebarchiesi@0
|
269 // }
|
danielebarchiesi@0
|
270 //}
|
danielebarchiesi@0
|
271
|
danielebarchiesi@0
|
272 $token_info = token_info();
|
danielebarchiesi@0
|
273 $token_problems = array(
|
danielebarchiesi@0
|
274 'not-array' => array(
|
danielebarchiesi@0
|
275 'label' => t('The following tokens or token types are not defined as arrays:'),
|
danielebarchiesi@0
|
276 ),
|
danielebarchiesi@0
|
277 'missing-info' => array(
|
danielebarchiesi@0
|
278 'label' => t('The following tokens or token types are missing required name and/or description information:'),
|
danielebarchiesi@0
|
279 ),
|
danielebarchiesi@0
|
280 'type-no-tokens' => array(
|
danielebarchiesi@0
|
281 'label' => t('The following token types do not have any tokens defined:'),
|
danielebarchiesi@0
|
282 ),
|
danielebarchiesi@0
|
283 'tokens-no-type' => array(
|
danielebarchiesi@0
|
284 'label' => t('The following token types are not defined but have tokens:'),
|
danielebarchiesi@0
|
285 ),
|
danielebarchiesi@0
|
286 'duplicate' => array(
|
danielebarchiesi@0
|
287 'label' => t('The following token or token types are defined by multiple modules:')
|
danielebarchiesi@0
|
288 ),
|
danielebarchiesi@0
|
289 );
|
danielebarchiesi@0
|
290
|
danielebarchiesi@0
|
291 // Check token types for problems.
|
danielebarchiesi@0
|
292 foreach ($token_info['types'] as $type => $type_info) {
|
danielebarchiesi@0
|
293 $real_type = !empty($type_info['type']) ? $type_info['type'] : $type;
|
danielebarchiesi@0
|
294 if (!is_array($type_info)) {
|
danielebarchiesi@0
|
295 $token_problems['not-array']['problems'][] = "\$info['types']['$type']";
|
danielebarchiesi@0
|
296 continue;
|
danielebarchiesi@0
|
297 }
|
danielebarchiesi@0
|
298 elseif (!isset($type_info['name']) || !isset($type_info['description'])) {
|
danielebarchiesi@0
|
299 $token_problems['missing-info']['problems'][] = "\$info['types']['$type']";
|
danielebarchiesi@0
|
300 }
|
danielebarchiesi@0
|
301 elseif (empty($token_info['tokens'][$real_type])) {
|
danielebarchiesi@0
|
302 $token_problems['type-no-tokens']['problems'][] = "\$info['tokens']['$real_type']";
|
danielebarchiesi@0
|
303 }
|
danielebarchiesi@0
|
304 }
|
danielebarchiesi@0
|
305
|
danielebarchiesi@0
|
306 // Check tokens for problems.
|
danielebarchiesi@0
|
307 foreach ($token_info['tokens'] as $type => $tokens) {
|
danielebarchiesi@0
|
308 if (!is_array($tokens)) {
|
danielebarchiesi@0
|
309 $token_problems['not-array']['problems'][] = "\$info['tokens']['$type']";
|
danielebarchiesi@0
|
310 continue;
|
danielebarchiesi@0
|
311 }
|
danielebarchiesi@0
|
312 else {
|
danielebarchiesi@0
|
313 foreach (array_keys($tokens) as $token) {
|
danielebarchiesi@0
|
314 if (!is_array($tokens[$token])) {
|
danielebarchiesi@0
|
315 $token_problems['not-array']['problems'][] = "\$info['tokens']['$type']['$token']";
|
danielebarchiesi@0
|
316 continue;
|
danielebarchiesi@0
|
317 }
|
danielebarchiesi@0
|
318 elseif (!isset($tokens[$token]['name']) || !isset($tokens[$token]['description'])) {
|
danielebarchiesi@0
|
319 $token_problems['missing-info']['problems'][] = "\$info['tokens']['$type']['$token']";
|
danielebarchiesi@0
|
320 }
|
danielebarchiesi@0
|
321 elseif (is_array($tokens[$token]['name']) || is_array($tokens[$token]['description'])) {
|
danielebarchiesi@0
|
322 $token_problems['duplicate']['problems'][] = "\$info['tokens']['$type']['$token']";
|
danielebarchiesi@0
|
323 }
|
danielebarchiesi@0
|
324 }
|
danielebarchiesi@0
|
325 }
|
danielebarchiesi@0
|
326 if (!isset($token_info['types'][$type])) {
|
danielebarchiesi@0
|
327 $token_problems['tokens-no-type']['problems'][] = "\$info['types']['$type']";
|
danielebarchiesi@0
|
328 }
|
danielebarchiesi@0
|
329 }
|
danielebarchiesi@0
|
330
|
danielebarchiesi@0
|
331 return $token_problems;
|
danielebarchiesi@0
|
332 }
|