|
1 <?php |
|
2 |
|
3 /** |
|
4 * @file |
|
5 * Install, update and uninstall functions for the comment module. |
|
6 */ |
|
7 |
|
8 /** |
|
9 * Implements hook_uninstall(). |
|
10 */ |
|
11 function comment_uninstall() { |
|
12 // Delete comment_body field. |
|
13 field_delete_field('comment_body'); |
|
14 |
|
15 // Remove variables. |
|
16 variable_del('comment_block_count'); |
|
17 $node_types = array_keys(node_type_get_types()); |
|
18 foreach ($node_types as $node_type) { |
|
19 field_attach_delete_bundle('comment', 'comment_node_' . $node_type); |
|
20 variable_del('comment_' . $node_type); |
|
21 variable_del('comment_anonymous_' . $node_type); |
|
22 variable_del('comment_controls_' . $node_type); |
|
23 variable_del('comment_default_mode_' . $node_type); |
|
24 variable_del('comment_default_order_' . $node_type); |
|
25 variable_del('comment_default_per_page_' . $node_type); |
|
26 variable_del('comment_form_location_' . $node_type); |
|
27 variable_del('comment_preview_' . $node_type); |
|
28 variable_del('comment_subject_field_' . $node_type); |
|
29 } |
|
30 } |
|
31 |
|
32 /** |
|
33 * Implements hook_enable(). |
|
34 */ |
|
35 function comment_enable() { |
|
36 // Insert records into the node_comment_statistics for nodes that are missing. |
|
37 $query = db_select('node', 'n'); |
|
38 $query->leftJoin('node_comment_statistics', 'ncs', 'ncs.nid = n.nid'); |
|
39 $query->addField('n', 'created', 'last_comment_timestamp'); |
|
40 $query->addField('n', 'uid', 'last_comment_uid'); |
|
41 $query->addField('n', 'nid'); |
|
42 $query->addExpression('0', 'comment_count'); |
|
43 $query->addExpression('NULL', 'last_comment_name'); |
|
44 $query->isNull('ncs.comment_count'); |
|
45 |
|
46 db_insert('node_comment_statistics') |
|
47 ->from($query) |
|
48 ->execute(); |
|
49 } |
|
50 |
|
51 /** |
|
52 * Implements hook_modules_enabled(). |
|
53 * |
|
54 * Creates comment body fields for node types existing before the comment module |
|
55 * is enabled. We use hook_modules_enabled() rather than hook_enable() so we can |
|
56 * react to node types of existing modules, and those of modules being enabled |
|
57 * both before and after comment module in the loop of module_enable(). |
|
58 * |
|
59 * There is a separate comment bundle for each node type to allow for |
|
60 * per-node-type customization of comment fields. Each one of these bundles |
|
61 * needs a comment body field instance. A comment bundle is needed even for |
|
62 * node types whose comments are disabled by default, because individual nodes |
|
63 * may override that default. |
|
64 * |
|
65 * @see comment_node_type_insert() |
|
66 */ |
|
67 function comment_modules_enabled($modules) { |
|
68 // Only react if comment module is one of the modules being enabled. |
|
69 // hook_node_type_insert() is used to create body fields while the comment |
|
70 // module is enabled. |
|
71 if (in_array('comment', $modules)) { |
|
72 // Ensure that the list of node types reflects newly enabled modules. |
|
73 node_types_rebuild(); |
|
74 |
|
75 // Create comment body fields for each node type, if needed. |
|
76 foreach (node_type_get_types() as $type => $info) { |
|
77 _comment_body_field_create($info); |
|
78 } |
|
79 } |
|
80 } |
|
81 |
|
82 /** |
|
83 * Implements hook_update_dependencies(). |
|
84 */ |
|
85 function comment_update_dependencies() { |
|
86 // comment_update_7005() creates the comment body field and therefore must |
|
87 // run after all Field modules have been enabled, which happens in |
|
88 // system_update_7027(). |
|
89 $dependencies['comment'][7005] = array( |
|
90 'system' => 7027, |
|
91 ); |
|
92 |
|
93 // comment_update_7006() needs to query the {filter_format} table to get a |
|
94 // list of existing text formats, so it must run after filter_update_7000(), |
|
95 // which creates that table. |
|
96 $dependencies['comment'][7006] = array( |
|
97 'filter' => 7000, |
|
98 ); |
|
99 |
|
100 return $dependencies; |
|
101 } |
|
102 |
|
103 /** |
|
104 * @addtogroup updates-6.x-to-7.x |
|
105 * @{ |
|
106 */ |
|
107 |
|
108 /** |
|
109 * Rename comment display setting variables. |
|
110 */ |
|
111 function comment_update_7000() { |
|
112 $types = _update_7000_node_get_types(); |
|
113 foreach ($types as $type => $type_object) { |
|
114 variable_del('comment_default_order' . $type); |
|
115 |
|
116 // Drupal 6 had four display modes: |
|
117 // - COMMENT_MODE_FLAT_COLLAPSED = 1 |
|
118 // - COMMENT_MODE_FLAT_EXPANDED = 2 |
|
119 // - COMMENT_MODE_THREADED_COLLAPSED = 3 |
|
120 // - COMMENT_MODE_THREADED_EXPANDED = 4 |
|
121 // |
|
122 // Drupal 7 doesn't support collapsed/expanded modes anymore, so we |
|
123 // migrate all the flat modes to COMMENT_MODE_FLAT (0) and all the threaded |
|
124 // modes to COMMENT_MODE_THREADED (1). |
|
125 $setting = variable_get('comment_default_mode_' . $type, 4); |
|
126 if ($setting == 3 || $setting == 4) { |
|
127 variable_set('comment_default_mode_' . $type, 1); |
|
128 } |
|
129 else { |
|
130 variable_set('comment_default_mode_' . $type, 0); |
|
131 } |
|
132 |
|
133 // There were only two comment modes in the past: |
|
134 // - 1 was 'required' previously, convert into DRUPAL_REQUIRED (2). |
|
135 // - 0 was 'optional' previously, convert into DRUPAL_OPTIONAL (1). |
|
136 $preview = variable_get('comment_preview_' . $type, 1) ? 2 : 1; |
|
137 variable_set('comment_preview_' . $type, $preview); |
|
138 } |
|
139 } |
|
140 |
|
141 /** |
|
142 * Change comment status from published being 0 to being 1 |
|
143 */ |
|
144 function comment_update_7001() { |
|
145 // Choose a temporary status value different from the existing status values. |
|
146 $tmp_status = db_query('SELECT MAX(status) FROM {comments}')->fetchField() + 1; |
|
147 |
|
148 $changes = array( |
|
149 0 => $tmp_status, |
|
150 1 => 0, |
|
151 $tmp_status => 1, |
|
152 ); |
|
153 |
|
154 foreach ($changes as $old => $new) { |
|
155 db_update('comments') |
|
156 ->fields(array('status' => $new)) |
|
157 ->condition('status', $old) |
|
158 ->execute(); |
|
159 } |
|
160 } |
|
161 |
|
162 /** |
|
163 * Rename {comments} table to {comment} and upgrade it. |
|
164 */ |
|
165 function comment_update_7002() { |
|
166 db_rename_table('comments', 'comment'); |
|
167 |
|
168 // Add user-related indexes. These may already exist from Drupal 6. |
|
169 if (!db_index_exists('comment', 'comment_uid')) { |
|
170 db_add_index('comment', 'comment_uid', array('uid')); |
|
171 db_add_index('node_comment_statistics', 'last_comment_uid', array('last_comment_uid')); |
|
172 } |
|
173 |
|
174 // Create a language column. |
|
175 db_add_field('comment', 'language', array( |
|
176 'type' => 'varchar', |
|
177 'length' => 12, |
|
178 'not null' => TRUE, |
|
179 'default' => '', |
|
180 )); |
|
181 db_add_index('comment', 'comment_nid_language', array('nid', 'language')); |
|
182 } |
|
183 |
|
184 /** |
|
185 * Split {comment}.timestamp into 'created' and 'changed', improve indexing on {comment}. |
|
186 */ |
|
187 function comment_update_7003() { |
|
188 // Drop the old indexes. |
|
189 db_drop_index('comment', 'status'); |
|
190 db_drop_index('comment', 'pid'); |
|
191 |
|
192 // Create a created column. |
|
193 db_add_field('comment', 'created', array( |
|
194 'type' => 'int', |
|
195 'not null' => TRUE, |
|
196 'default' => 0, |
|
197 )); |
|
198 |
|
199 // Rename the timestamp column to changed. |
|
200 db_change_field('comment', 'timestamp', 'changed', array( |
|
201 'type' => 'int', |
|
202 'not null' => TRUE, |
|
203 'default' => 0, |
|
204 )); |
|
205 |
|
206 // Migrate the data. |
|
207 // @todo db_update() should support this. |
|
208 db_query('UPDATE {comment} SET created = changed'); |
|
209 |
|
210 // Recreate the indexes. |
|
211 // The 'comment_num_new' index is optimized for comment_num_new() |
|
212 // and comment_new_page_count(). |
|
213 db_add_index('comment', 'comment_num_new', array('nid', 'status', 'created', 'cid', 'thread')); |
|
214 db_add_index('comment', 'comment_pid_status', array('pid', 'status')); |
|
215 } |
|
216 |
|
217 /** |
|
218 * Upgrade the {node_comment_statistics} table. |
|
219 */ |
|
220 function comment_update_7004() { |
|
221 db_add_field('node_comment_statistics', 'cid', array( |
|
222 'type' => 'int', |
|
223 'not null' => TRUE, |
|
224 'default' => 0, |
|
225 'description' => 'The {comment}.cid of the last comment.', |
|
226 )); |
|
227 db_add_index('node_comment_statistics', 'cid', array('cid')); |
|
228 |
|
229 // The comment_count index may have been added in Drupal 6. |
|
230 if (!db_index_exists('node_comment_statistics', 'comment_count')) { |
|
231 // Add an index on the comment_count. |
|
232 db_add_index('node_comment_statistics', 'comment_count', array('comment_count')); |
|
233 } |
|
234 } |
|
235 |
|
236 /** |
|
237 * Create the comment_body field. |
|
238 */ |
|
239 function comment_update_7005() { |
|
240 // Create comment body field. |
|
241 $field = array( |
|
242 'field_name' => 'comment_body', |
|
243 'type' => 'text_long', |
|
244 'module' => 'text', |
|
245 'entity_types' => array( |
|
246 'comment', |
|
247 ), |
|
248 'settings' => array(), |
|
249 'cardinality' => 1, |
|
250 ); |
|
251 _update_7000_field_create_field($field); |
|
252 |
|
253 // Add the field to comments for all existing bundles. |
|
254 $generic_instance = array( |
|
255 'entity_type' => 'comment', |
|
256 'label' => t('Comment'), |
|
257 'settings' => array( |
|
258 'text_processing' => 1, |
|
259 ), |
|
260 'required' => TRUE, |
|
261 'display' => array( |
|
262 'default' => array( |
|
263 'label' => 'hidden', |
|
264 'type' => 'text_default', |
|
265 'weight' => 0, |
|
266 'settings' => array(), |
|
267 'module' => 'text', |
|
268 ), |
|
269 ), |
|
270 'widget' => array( |
|
271 'type' => 'text_textarea', |
|
272 'settings' => array( |
|
273 'rows' => 5, |
|
274 ), |
|
275 'weight' => 0, |
|
276 'module' => 'text', |
|
277 ), |
|
278 'description' => '', |
|
279 ); |
|
280 |
|
281 $types = _update_7000_node_get_types(); |
|
282 foreach ($types as $type => $type_object) { |
|
283 $instance = $generic_instance; |
|
284 $instance['bundle'] = 'comment_node_' . $type; |
|
285 _update_7000_field_create_instance($field, $instance); |
|
286 } |
|
287 } |
|
288 |
|
289 /** |
|
290 * Migrate data from the comment field to field storage. |
|
291 */ |
|
292 function comment_update_7006(&$sandbox) { |
|
293 // This is a multipass update. First set up some comment variables. |
|
294 if (empty($sandbox['total'])) { |
|
295 $comments = (bool) db_query_range('SELECT 1 FROM {comment}', 0, 1)->fetchField(); |
|
296 $sandbox['types'] = array(); |
|
297 if ($comments) { |
|
298 $sandbox['types'] = array_keys(_update_7000_node_get_types()); |
|
299 } |
|
300 $sandbox['total'] = count($sandbox['types']); |
|
301 } |
|
302 |
|
303 if (!empty($sandbox['types'])) { |
|
304 $type = array_shift($sandbox['types']); |
|
305 |
|
306 $query = db_select('comment', 'c'); |
|
307 $query->innerJoin('node', 'n', 'c.nid = n.nid AND n.type = :type', array(':type' => $type)); |
|
308 $query->addField('c', 'cid', 'entity_id'); |
|
309 $query->addExpression("'comment_node_$type'", 'bundle'); |
|
310 $query->addExpression("'comment'", 'entity_type'); |
|
311 $query->addExpression('0', 'deleted'); |
|
312 $query->addExpression("'" . LANGUAGE_NONE . "'", 'language'); |
|
313 $query->addExpression('0', 'delta'); |
|
314 $query->addField('c', 'comment', 'comment_body_value'); |
|
315 $query->addField('c', 'format', 'comment_body_format'); |
|
316 |
|
317 db_insert('field_data_comment_body') |
|
318 ->from($query) |
|
319 ->execute(); |
|
320 |
|
321 $sandbox['#finished'] = 1 - count($sandbox['types']) / $sandbox['total']; |
|
322 } |
|
323 |
|
324 // On the last pass of the update, $sandbox['types'] will be empty. |
|
325 if (empty($sandbox['types'])) { |
|
326 // Update the comment body text formats. For an explanation of these |
|
327 // updates, see the code comments in user_update_7010(). |
|
328 db_update('field_data_comment_body') |
|
329 ->fields(array('comment_body_format' => NULL)) |
|
330 ->condition('comment_body_value', '') |
|
331 ->condition('comment_body_format', 0) |
|
332 ->execute(); |
|
333 $existing_formats = db_query("SELECT format FROM {filter_format}")->fetchCol(); |
|
334 $default_format = variable_get('filter_default_format', 1); |
|
335 db_update('field_data_comment_body') |
|
336 ->fields(array('comment_body_format' => $default_format)) |
|
337 ->isNotNull('comment_body_format') |
|
338 ->condition('comment_body_format', $existing_formats, 'NOT IN') |
|
339 ->execute(); |
|
340 |
|
341 // Finally, remove the old comment data. |
|
342 db_drop_field('comment', 'comment'); |
|
343 db_drop_field('comment', 'format'); |
|
344 } |
|
345 } |
|
346 |
|
347 /** |
|
348 * @} End of "addtogroup updates-6.x-to-7.x". |
|
349 */ |
|
350 |
|
351 /** |
|
352 * @addtogroup updates-7.x-extra |
|
353 * @{ |
|
354 */ |
|
355 |
|
356 /** |
|
357 * Add an index to the created column. |
|
358 */ |
|
359 function comment_update_7007() { |
|
360 db_add_index('comment', 'comment_created', array('created')); |
|
361 } |
|
362 |
|
363 /** |
|
364 * Update database to match Drupal 7 schema. |
|
365 */ |
|
366 function comment_update_7008() { |
|
367 // Update default status to 1. |
|
368 db_change_field('comment', 'status', 'status', array( |
|
369 'type' => 'int', |
|
370 'unsigned' => TRUE, |
|
371 'not null' => TRUE, |
|
372 'default' => 1, |
|
373 'size' => 'tiny', |
|
374 )); |
|
375 |
|
376 // Realign indexes. |
|
377 db_drop_index('comment', 'comment_status_pid'); |
|
378 db_add_index('comment', 'comment_status_pid', array('pid', 'status')); |
|
379 db_drop_index('comment', 'comment_pid_status'); |
|
380 db_drop_index('comment', 'nid'); |
|
381 } |
|
382 |
|
383 /** |
|
384 * Change the last_comment_timestamp column description. |
|
385 */ |
|
386 function comment_update_7009() { |
|
387 db_change_field('node_comment_statistics', 'last_comment_timestamp', 'last_comment_timestamp', array( |
|
388 'type' => 'int', |
|
389 'not null' => TRUE, |
|
390 'default' => 0, |
|
391 'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.changed.', |
|
392 )); |
|
393 } |
|
394 |
|
395 /** |
|
396 * @} End of "addtogroup updates-7.x-extra". |
|
397 */ |
|
398 |
|
399 /** |
|
400 * Implements hook_schema(). |
|
401 */ |
|
402 function comment_schema() { |
|
403 $schema['comment'] = array( |
|
404 'description' => 'Stores comments and associated data.', |
|
405 'fields' => array( |
|
406 'cid' => array( |
|
407 'type' => 'serial', |
|
408 'not null' => TRUE, |
|
409 'description' => 'Primary Key: Unique comment ID.', |
|
410 ), |
|
411 'pid' => array( |
|
412 'type' => 'int', |
|
413 'not null' => TRUE, |
|
414 'default' => 0, |
|
415 'description' => 'The {comment}.cid to which this comment is a reply. If set to 0, this comment is not a reply to an existing comment.', |
|
416 ), |
|
417 'nid' => array( |
|
418 'type' => 'int', |
|
419 'not null' => TRUE, |
|
420 'default' => 0, |
|
421 'description' => 'The {node}.nid to which this comment is a reply.', |
|
422 ), |
|
423 'uid' => array( |
|
424 'type' => 'int', |
|
425 'not null' => TRUE, |
|
426 'default' => 0, |
|
427 'description' => 'The {users}.uid who authored the comment. If set to 0, this comment was created by an anonymous user.', |
|
428 ), |
|
429 'subject' => array( |
|
430 'type' => 'varchar', |
|
431 'length' => 64, |
|
432 'not null' => TRUE, |
|
433 'default' => '', |
|
434 'description' => 'The comment title.', |
|
435 ), |
|
436 'hostname' => array( |
|
437 'type' => 'varchar', |
|
438 'length' => 128, |
|
439 'not null' => TRUE, |
|
440 'default' => '', |
|
441 'description' => "The author's host name.", |
|
442 ), |
|
443 'created' => array( |
|
444 'type' => 'int', |
|
445 'not null' => TRUE, |
|
446 'default' => 0, |
|
447 'description' => 'The time that the comment was created, as a Unix timestamp.', |
|
448 ), |
|
449 'changed' => array( |
|
450 'type' => 'int', |
|
451 'not null' => TRUE, |
|
452 'default' => 0, |
|
453 'description' => 'The time that the comment was last edited, as a Unix timestamp.', |
|
454 ), |
|
455 'status' => array( |
|
456 'type' => 'int', |
|
457 'unsigned' => TRUE, |
|
458 'not null' => TRUE, |
|
459 'default' => 1, |
|
460 'size' => 'tiny', |
|
461 'description' => 'The published status of a comment. (0 = Not Published, 1 = Published)', |
|
462 ), |
|
463 'thread' => array( |
|
464 'type' => 'varchar', |
|
465 'length' => 255, |
|
466 'not null' => TRUE, |
|
467 'description' => "The vancode representation of the comment's place in a thread.", |
|
468 ), |
|
469 'name' => array( |
|
470 'type' => 'varchar', |
|
471 'length' => 60, |
|
472 'not null' => FALSE, |
|
473 'description' => "The comment author's name. Uses {users}.name if the user is logged in, otherwise uses the value typed into the comment form.", |
|
474 ), |
|
475 'mail' => array( |
|
476 'type' => 'varchar', |
|
477 'length' => 64, |
|
478 'not null' => FALSE, |
|
479 'description' => "The comment author's e-mail address from the comment form, if user is anonymous, and the 'Anonymous users may/must leave their contact information' setting is turned on.", |
|
480 ), |
|
481 'homepage' => array( |
|
482 'type' => 'varchar', |
|
483 'length' => 255, |
|
484 'not null' => FALSE, |
|
485 'description' => "The comment author's home page address from the comment form, if user is anonymous, and the 'Anonymous users may/must leave their contact information' setting is turned on.", |
|
486 ), |
|
487 'language' => array( |
|
488 'description' => 'The {languages}.language of this comment.', |
|
489 'type' => 'varchar', |
|
490 'length' => 12, |
|
491 'not null' => TRUE, |
|
492 'default' => '', |
|
493 ), |
|
494 ), |
|
495 'indexes' => array( |
|
496 'comment_status_pid' => array('pid', 'status'), |
|
497 'comment_num_new' => array('nid', 'status', 'created', 'cid', 'thread'), |
|
498 'comment_uid' => array('uid'), |
|
499 'comment_nid_language' => array('nid', 'language'), |
|
500 'comment_created' => array('created'), |
|
501 ), |
|
502 'primary key' => array('cid'), |
|
503 'foreign keys' => array( |
|
504 'comment_node' => array( |
|
505 'table' => 'node', |
|
506 'columns' => array('nid' => 'nid'), |
|
507 ), |
|
508 'comment_author' => array( |
|
509 'table' => 'users', |
|
510 'columns' => array('uid' => 'uid'), |
|
511 ), |
|
512 ), |
|
513 ); |
|
514 |
|
515 $schema['node_comment_statistics'] = array( |
|
516 'description' => 'Maintains statistics of node and comments posts to show "new" and "updated" flags.', |
|
517 'fields' => array( |
|
518 'nid' => array( |
|
519 'type' => 'int', |
|
520 'unsigned' => TRUE, |
|
521 'not null' => TRUE, |
|
522 'default' => 0, |
|
523 'description' => 'The {node}.nid for which the statistics are compiled.', |
|
524 ), |
|
525 'cid' => array( |
|
526 'type' => 'int', |
|
527 'not null' => TRUE, |
|
528 'default' => 0, |
|
529 'description' => 'The {comment}.cid of the last comment.', |
|
530 ), |
|
531 'last_comment_timestamp' => array( |
|
532 'type' => 'int', |
|
533 'not null' => TRUE, |
|
534 'default' => 0, |
|
535 'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.changed.', |
|
536 ), |
|
537 'last_comment_name' => array( |
|
538 'type' => 'varchar', |
|
539 'length' => 60, |
|
540 'not null' => FALSE, |
|
541 'description' => 'The name of the latest author to post a comment on this node, from {comment}.name.', |
|
542 ), |
|
543 'last_comment_uid' => array( |
|
544 'type' => 'int', |
|
545 'not null' => TRUE, |
|
546 'default' => 0, |
|
547 'description' => 'The user ID of the latest author to post a comment on this node, from {comment}.uid.', |
|
548 ), |
|
549 'comment_count' => array( |
|
550 'type' => 'int', |
|
551 'unsigned' => TRUE, |
|
552 'not null' => TRUE, |
|
553 'default' => 0, |
|
554 'description' => 'The total number of comments on this node.', |
|
555 ), |
|
556 ), |
|
557 'primary key' => array('nid'), |
|
558 'indexes' => array( |
|
559 'node_comment_timestamp' => array('last_comment_timestamp'), |
|
560 'comment_count' => array('comment_count'), |
|
561 'last_comment_uid' => array('last_comment_uid'), |
|
562 ), |
|
563 'foreign keys' => array( |
|
564 'statistics_node' => array( |
|
565 'table' => 'node', |
|
566 'columns' => array('nid' => 'nid'), |
|
567 ), |
|
568 'last_comment_author' => array( |
|
569 'table' => 'users', |
|
570 'columns' => array( |
|
571 'last_comment_uid' => 'uid', |
|
572 ), |
|
573 ), |
|
574 ), |
|
575 ); |
|
576 |
|
577 return $schema; |
|
578 } |