cms/drupal/modules/comment/comment.install
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     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 }