1 | <?php |
---|
2 | |
---|
3 | /** |
---|
4 | * @file |
---|
5 | * Implementations of token module hooks for the core node and book modules. |
---|
6 | * |
---|
7 | * The token module requires specific hooks to be added to modules |
---|
8 | * so that those modules can return data about their objects to the |
---|
9 | * token API. Until and unless token becomes a part of core, the |
---|
10 | * implementations of the token hooks for core modules are provided |
---|
11 | * in the token module itself. |
---|
12 | * |
---|
13 | * @ingroup token |
---|
14 | */ |
---|
15 | |
---|
16 | /** |
---|
17 | * Implementation of hook_token_values(). |
---|
18 | */ |
---|
19 | function node_token_values($type, $object = NULL, $options = array()) { |
---|
20 | $values = array(); |
---|
21 | switch ($type) { |
---|
22 | case 'node': |
---|
23 | $node = $object; |
---|
24 | $account = db_fetch_object(db_query("SELECT name, mail FROM {users} WHERE uid = %d", $node->uid)); |
---|
25 | |
---|
26 | // Adjust for the anonymous user name. |
---|
27 | if (!$node->uid && !$account->name) { |
---|
28 | $account->name = variable_get('anonymous', t('Anonymous')); |
---|
29 | } |
---|
30 | |
---|
31 | $values['nid'] = $node->nid; |
---|
32 | $values['type'] = $node->type; |
---|
33 | $values['type-name'] = node_get_types('name', $node->type); |
---|
34 | $values['language'] = check_plain($node->language); |
---|
35 | $values['title'] = check_plain($node->title); |
---|
36 | $values['title-raw'] = $node->title; |
---|
37 | $values['node-path-raw'] = drupal_get_path_alias('node/'. $node->nid); |
---|
38 | $values['node-path'] = check_plain($values['node-path-raw']); |
---|
39 | $values['node-url'] = url('node/' . $node->nid, array('absolute' => TRUE)); |
---|
40 | $values['author-uid'] = $node->uid; |
---|
41 | $values['author-name'] = check_plain($account->name); |
---|
42 | $values['author-name-raw'] = $account->name; |
---|
43 | $values['author-mail'] = check_plain($account->mail); |
---|
44 | $values['author-mail-raw'] = $account->mail; |
---|
45 | |
---|
46 | $values['log-raw'] = isset($node->log) ? $node->log : ''; |
---|
47 | $values['log'] = filter_xss($values['log-raw']); |
---|
48 | |
---|
49 | if (module_exists('comment')) { |
---|
50 | $values['node_comment_count'] = isset($node->comment_count) ? $node->comment_count : 0; |
---|
51 | $values['unread_comment_count'] = comment_num_new($node->nid); |
---|
52 | } |
---|
53 | else { |
---|
54 | $values['node_comment_count'] = 0; |
---|
55 | $values['unread_comment_count'] = 0; |
---|
56 | } |
---|
57 | |
---|
58 | if (isset($node->created)) { |
---|
59 | $values += token_get_date_token_values($node->created, ''); |
---|
60 | } |
---|
61 | |
---|
62 | if (isset($node->changed)) { |
---|
63 | $values += token_get_date_token_values($node->changed, 'mod-'); |
---|
64 | } |
---|
65 | |
---|
66 | // And now taxonomy, which is a bit more work. This code is adapted from |
---|
67 | // pathauto's handling code; it's intended for compatibility with it. |
---|
68 | if (module_exists('taxonomy') && !empty($node->taxonomy) && is_array($node->taxonomy)) { |
---|
69 | foreach ($node->taxonomy as $term) { |
---|
70 | $original_term = $term; |
---|
71 | if ((object)$term) { |
---|
72 | // With free-tagging it's somewhat hard to get the tid, vid, name values |
---|
73 | // Rather than duplicating taxonomy.module code here you should make sure your calling module |
---|
74 | // has a weight of at least 1 which will run after taxonomy has saved the data which allows us to |
---|
75 | // pull it out of the db here. |
---|
76 | if (!isset($term->name) || !isset($term->tid)) { |
---|
77 | $vid = db_result(db_query_range("SELECT t.vid FROM {term_node} r INNER JOIN {term_data} t ON r.tid = t.tid INNER JOIN {vocabulary} v ON t.vid = v.vid WHERE r.nid = %d ORDER BY v.weight, t.weight, t.name", $object->nid, 0, 1)); |
---|
78 | if (!$vid) { |
---|
79 | continue; |
---|
80 | } |
---|
81 | $term = db_fetch_object(db_query_range("SELECT t.tid, t.name FROM {term_data} t INNER JOIN {term_node} r ON r.tid = t.tid WHERE t.vid = %d AND r.vid = %d ORDER BY t.weight", $vid, $object->vid, 0, 1)); |
---|
82 | $term->vid = $vid; |
---|
83 | } |
---|
84 | |
---|
85 | // Ok, if we still don't have a term name maybe this is a pre-taxonomy submit node |
---|
86 | // So if it's a number we can get data from it |
---|
87 | if (!isset($term->name) && is_array($original_term)) { |
---|
88 | $tid = array_shift($original_term); |
---|
89 | if (is_numeric($tid)) { |
---|
90 | $term = taxonomy_get_term($tid); |
---|
91 | } |
---|
92 | } |
---|
93 | $values['term'] = check_plain($term->name); |
---|
94 | $values['term-raw'] = $term->name; |
---|
95 | $values['term-id'] = $term->tid; |
---|
96 | $vid = $term->vid; |
---|
97 | |
---|
98 | if (!empty($vid)) { |
---|
99 | $vocabulary = taxonomy_vocabulary_load($vid); |
---|
100 | $values['vocab'] = check_plain($vocabulary->name); |
---|
101 | $values['vocab-raw'] = $vocabulary->name; |
---|
102 | $values['vocab-id'] = $vocabulary->vid; |
---|
103 | } |
---|
104 | |
---|
105 | // The 'catpath' (and 'cat') tokens have been removed, as they caused quite a bit of confusion, |
---|
106 | // and the catpath was a relatively expensive query when the taxonomy tree was deep. |
---|
107 | // |
---|
108 | // It existed only to provide forward-compatability with pathauto module, and |
---|
109 | // for most uses of token.module, it was a relatively useless token -- it exposed |
---|
110 | // a list of term names formatted as a URL/path string. Once pathauto supports |
---|
111 | // tokens, *it* should handle this catpath alias as it's the primary consumer. |
---|
112 | break; |
---|
113 | } |
---|
114 | } |
---|
115 | } |
---|
116 | // It's possible to leave that block and still not have good data. |
---|
117 | // So, we test for these and if not set, set them. |
---|
118 | if (!isset($values['term'])) { |
---|
119 | $values['term'] = ''; |
---|
120 | $values['term-raw'] = ''; |
---|
121 | $values['term-id'] = ''; |
---|
122 | $values['vocab'] = ''; |
---|
123 | $values['vocab-raw'] = ''; |
---|
124 | $values['vocab-id'] = ''; |
---|
125 | } |
---|
126 | |
---|
127 | break; |
---|
128 | } |
---|
129 | |
---|
130 | return $values; |
---|
131 | } |
---|
132 | |
---|
133 | /** |
---|
134 | * Implementation of hook_token_list(). |
---|
135 | */ |
---|
136 | function node_token_list($type = 'all') { |
---|
137 | if ($type == 'node' || $type == 'all') { |
---|
138 | $tokens['node']['nid'] = t('The unique ID of the content item, or "node".'); |
---|
139 | $tokens['node']['type'] = t('The type of the node.'); |
---|
140 | $tokens['node']['type-name'] = t('The human-readable name of the node type.'); |
---|
141 | $tokens['node']['language'] = t('The language the node is written in.'); |
---|
142 | $tokens['node']['title'] = t('The title of the node.'); |
---|
143 | $tokens['node']['title-raw'] = t('The title of the node.'); |
---|
144 | $tokens['node']['node-path'] = t('The URL alias of the node.'); |
---|
145 | $tokens['node']['node-path-raw'] = t('The URL alias of the node.'); |
---|
146 | $tokens['node']['node-url'] = t('The URL of the node.'); |
---|
147 | |
---|
148 | $tokens['node']['author-uid'] = t("The unique ID of the author of the node."); |
---|
149 | $tokens['node']['author-name'] = t("The login name of the author of the node."); |
---|
150 | $tokens['node']['author-name-raw'] = t("The login name of the author of the node."); |
---|
151 | $tokens['node']['author-mail'] = t("The email address of the author of the node."); |
---|
152 | $tokens['node']['author-mail-raw'] = t("The email address of the author of the node."); |
---|
153 | |
---|
154 | $tokens['node']['log'] = t('The explanation of the most recent changes made to the node.'); |
---|
155 | $tokens['node']['log-raw'] = t('The explanation of the most recent changes made to the node.'); |
---|
156 | |
---|
157 | $tokens['node'] += token_get_date_token_info(t('Node creation')); |
---|
158 | $tokens['node'] += token_get_date_token_info(t('Node modification'), 'mod-'); |
---|
159 | |
---|
160 | if (module_exists('comment')) { |
---|
161 | $tokens['node']['node_comment_count'] = t("The number of comments posted on a node."); |
---|
162 | $tokens['node']['unread_comment_count'] = t("The number of comments posted on a node since the reader last viewed it."); |
---|
163 | } |
---|
164 | |
---|
165 | if (module_exists('taxonomy')) { |
---|
166 | $tokens['node']['term'] = t("Name of top taxonomy term"); |
---|
167 | $tokens['node']['term-raw'] = t("Unfiltered name of top taxonomy term."); |
---|
168 | $tokens['node']['term-id'] = t("ID of top taxonomy term"); |
---|
169 | $tokens['node']['vocab'] = t("Name of top term's vocabulary"); |
---|
170 | $tokens['node']['vocab-raw'] = t("Unfiltered name of top term's vocabulary."); |
---|
171 | $tokens['node']['vocab-id'] = t("ID of top term's vocabulary"); |
---|
172 | // Temporarily disabled -- see notes in node_token_values. |
---|
173 | // $tokens['node']['catpath'] = t("Full taxonomy tree for the topmost term"); |
---|
174 | } |
---|
175 | |
---|
176 | return $tokens; |
---|
177 | } |
---|
178 | } |
---|
179 | |
---|
180 | /** |
---|
181 | * Implements hook_token_list() on behalf of menu.module. |
---|
182 | */ |
---|
183 | function menu_token_list($type = 'all') { |
---|
184 | $tokens = array(); |
---|
185 | |
---|
186 | if ($type == 'node' || $type == 'all') { |
---|
187 | $tokens['node']['menu'] = t("The name of the menu the node belongs to."); |
---|
188 | $tokens['node']['menu-raw'] = t("The name of the menu the node belongs to."); |
---|
189 | $tokens['node']['menupath'] = t("The menu path (as reflected in the breadcrumb), not including Home or [menu]. Separated by /."); |
---|
190 | $tokens['node']['menupath-raw'] = t("The unfiltered menu path (as reflected in the breadcrumb), not including Home or [menu]. Separated by /."); |
---|
191 | $tokens['node']['menu-link-title'] = t("The text used in the menu as link text for this item."); |
---|
192 | $tokens['node']['menu-link-title-raw'] = t("The unfiltered text used in the menu as link text for this item."); |
---|
193 | $tokens['node']['menu-link-mlid'] = t("The unique ID of the node's menu link."); |
---|
194 | $tokens['node']['menu-link-plid'] = t("The unique ID of the node's menu link parent."); |
---|
195 | $tokens['node']['menu-link-parent-path'] = t('The URL alias of the parent menu link of the node.'); |
---|
196 | $tokens['node']['menu-link-parent-path-raw'] = t('The URL alias of the parent menu link of the node.'); |
---|
197 | } |
---|
198 | |
---|
199 | return $tokens; |
---|
200 | } |
---|
201 | |
---|
202 | /** |
---|
203 | * Implements hook_token_values() on behalf of menu.module. |
---|
204 | */ |
---|
205 | function menu_token_values($type, $object = NULL, $options = array()) { |
---|
206 | static $menus; |
---|
207 | |
---|
208 | $values = array(); |
---|
209 | |
---|
210 | // Statically cache menu_get_menus() since this causes a database query |
---|
211 | // every time it is called, and is not likely to change in the same page |
---|
212 | // request. |
---|
213 | if (!isset($menus)) { |
---|
214 | $menus = menu_get_menus(); |
---|
215 | } |
---|
216 | |
---|
217 | if ($type == 'node' && !empty($object)) { |
---|
218 | $node = $object; |
---|
219 | |
---|
220 | // Initialize tokens to empty strings. |
---|
221 | $values['menu'] = ''; |
---|
222 | $values['menu-raw'] = ''; |
---|
223 | $values['menupath'] = ''; |
---|
224 | $values['menupath-raw'] = ''; |
---|
225 | $values['menu-link-title'] = ''; |
---|
226 | $values['menu-link-title-raw'] = ''; |
---|
227 | $values['menu-link-mlid'] = ''; |
---|
228 | $values['menu-link-plid'] = ''; |
---|
229 | $values['menu-link-parent-path'] = ''; |
---|
230 | $values['menu-link-parent-path-raw'] = ''; |
---|
231 | |
---|
232 | if (!isset($node->menu)) { |
---|
233 | // Nodes do not have their menu links loaded via menu_nodeapi($node, 'load'). |
---|
234 | menu_nodeapi($node, 'prepare'); |
---|
235 | } |
---|
236 | |
---|
237 | // Now get the menu related information. |
---|
238 | if (!empty($node->menu['mlid'])) { |
---|
239 | $link = token_menu_link_load($node->menu['mlid']); |
---|
240 | |
---|
241 | if (isset($menus[$link['menu_name']])) { |
---|
242 | $values['menu-raw'] = $menus[$link['menu_name']]; |
---|
243 | $values['menu'] = check_plain($values['menu-raw']); |
---|
244 | } |
---|
245 | |
---|
246 | $parents = token_menu_link_get_parents_all($link['mlid']); |
---|
247 | $trail_raw = array(); |
---|
248 | foreach ($parents as $parent) { |
---|
249 | $trail_raw[] = $parent['title']; |
---|
250 | } |
---|
251 | $trail = array_map('check_plain', $trail_raw); |
---|
252 | |
---|
253 | $values['menupath'] = !empty($options['pathauto']) ? $trail : implode('/', $trail); |
---|
254 | $values['menupath-raw'] = !empty($options['pathauto']) ? $trail_raw : implode('/', $trail_raw); |
---|
255 | $values['menu-link-title'] = check_plain($link['title']); |
---|
256 | $values['menu-link-title-raw'] = $link['title']; |
---|
257 | $values['menu-link-mlid'] = $link['mlid']; |
---|
258 | |
---|
259 | if (!empty($link['plid']) && $parent = token_menu_link_load($link['plid'])) { |
---|
260 | $values['menu-link-plid'] = $parent['mlid']; |
---|
261 | $values['menu-link-parent-path-raw'] = drupal_get_path_alias($parent['href']); |
---|
262 | $values['menu-link-parent-path'] = check_plain($values['menu-link-parent-path-raw']); |
---|
263 | } |
---|
264 | } |
---|
265 | } |
---|
266 | |
---|
267 | return $values; |
---|
268 | } |
---|
269 | |
---|
270 | /** |
---|
271 | * Implements hook_token_list() on behalf of book.module. |
---|
272 | */ |
---|
273 | function book_token_list($type) { |
---|
274 | $tokens = array(); |
---|
275 | |
---|
276 | if ($type == 'node' || $type == 'all') { |
---|
277 | $tokens['book']['book'] = t("The title of the node's book parent."); |
---|
278 | $tokens['book']['book-raw'] = t("The title of the node's book parent."); |
---|
279 | $tokens['book']['book_id'] = t("The id of the node's book parent."); |
---|
280 | $tokens['book']['bookpath'] = t("The titles of all parents in the node's book hierarchy."); |
---|
281 | $tokens['book']['bookpath-raw'] = t("The titles of all parents in the node's book hierarchy."); |
---|
282 | } |
---|
283 | |
---|
284 | return $tokens; |
---|
285 | } |
---|
286 | |
---|
287 | /** |
---|
288 | * Implements hook_token_values() on behalf of book.module. |
---|
289 | */ |
---|
290 | function book_token_values($type, $object = NULL, $options = array()) { |
---|
291 | $values = array(); |
---|
292 | |
---|
293 | if ($type == 'node' && !empty($object)) { |
---|
294 | $node = $object; |
---|
295 | |
---|
296 | // Initialize tokens to empty strings. |
---|
297 | $values['book'] = ''; |
---|
298 | $values['book-raw'] = ''; |
---|
299 | $values['book_id'] = ''; |
---|
300 | $values['bookpath'] = ''; |
---|
301 | $values['bookpath-raw'] = ''; |
---|
302 | |
---|
303 | if (!empty($node->book['mlid'])) { |
---|
304 | // Exclude the current node's title from the book path trail (start with |
---|
305 | // the book link's plid rather than mlid). |
---|
306 | $parents = token_menu_link_get_parents_all($node->book['plid']); |
---|
307 | $trail_raw = array(); |
---|
308 | foreach ($parents as $parent) { |
---|
309 | $trail_raw[] = $parent['title']; |
---|
310 | } |
---|
311 | $trail = array_map('check_plain', $trail_raw); |
---|
312 | |
---|
313 | // Load the root book page. |
---|
314 | $root = token_menu_link_load($node->book['p1']); |
---|
315 | |
---|
316 | $values['book'] = check_plain($root['title']); |
---|
317 | $values['book-raw'] = $root['title']; |
---|
318 | $values['book_id'] = $node->book['bid']; |
---|
319 | $values['bookpath'] = !empty($options['pathauto']) ? $trail : implode('/', $trail); |
---|
320 | $values['bookpath-raw'] = !empty($options['pathauto']) ? $trail_raw : implode('/', $trail_raw); |
---|
321 | } |
---|
322 | } |
---|
323 | |
---|
324 | return $values; |
---|
325 | } |
---|