Projet

Général

Profil

Paste
Télécharger (17,9 ko) Statistiques
| Branche: | Révision:

root / drupal7 / modules / comment / comment.install @ 6a4d64c4

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
}