| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 | <?php/** * @file * Install, update, and uninstall functions for the Forum module. *//** * Implements hook_install(). */function forum_install() {  // Set the weight of the forum.module to 1 so it is loaded after the taxonomy.module.  db_update('system')    ->fields(array('weight' => 1))    ->condition('name', 'forum')    ->execute();  // Forum topics are published by default, but do not have any other default  // options set (for example, they are not promoted to the front page).  variable_set('node_options_forum', array('status'));}/** * Implements hook_enable(). */function forum_enable() {  // If we enable forum at the same time as taxonomy we need to call  // field_associate_fields() as otherwise the field won't be enabled until  // hook modules_enabled is called which takes place after hook_enable events.  field_associate_fields('taxonomy');  // Create the forum vocabulary if it does not exist.  $vocabulary = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', 0));  if (!$vocabulary) {    $edit = array(      'name' => t('Forums'),      'machine_name' => 'forums',      'description' => t('Forum navigation vocabulary'),      'hierarchy' => 1,      'module' => 'forum',      'weight' => -10,    );    $vocabulary = (object) $edit;    taxonomy_vocabulary_save($vocabulary);    variable_set('forum_nav_vocabulary', $vocabulary->vid);  }  // Create the 'taxonomy_forums' field if it doesn't already exist.  if (!field_info_field('taxonomy_forums')) {    $field = array(      'field_name' => 'taxonomy_forums',      'type' => 'taxonomy_term_reference',      'settings' => array(        'allowed_values' => array(          array(            'vocabulary' => $vocabulary->machine_name,            'parent' => 0,          ),        ),      ),    );    field_create_field($field);    // Create a default forum so forum posts can be created.    $edit = array(      'name' => t('General discussion'),      'description' => '',      'parent' => array(0),      'vid' => $vocabulary->vid,    );    $term = (object) $edit;    taxonomy_term_save($term);    // Create the instance on the bundle.    $instance = array(      'field_name' => 'taxonomy_forums',      'entity_type' => 'node',      'label' => $vocabulary->name,      'bundle' => 'forum',      'required' => TRUE,      'widget' => array(        'type' => 'options_select',      ),      'display' => array(        'default' => array(          'type' => 'taxonomy_term_reference_link',         'weight' => 10,        ),        'teaser' => array(          'type' => 'taxonomy_term_reference_link',         'weight' => 10,        ),      ),    );    field_create_instance($instance);  }  // Ensure the forum node type is available.  node_types_rebuild();  $types = node_type_get_types();  node_add_body_field($types['forum']);}/** * Implements hook_uninstall(). */function forum_uninstall() {  // Load the dependent Taxonomy module, in case it has been disabled.  drupal_load('module', 'taxonomy');  variable_del('forum_containers');  variable_del('forum_hot_topic');  variable_del('forum_per_page');  variable_del('forum_order');  variable_del('forum_block_num_active');  variable_del('forum_block_num_new');  variable_del('node_options_forum');  field_delete_field('taxonomy_forums');  // Purge field data now to allow taxonomy module to be uninstalled  // if this is the only field remaining.  field_purge_batch(10);}/** * Implements hook_schema(). */function forum_schema() {  $schema['forum'] = array(    'description' => 'Stores the relationship of nodes to forum terms.',    'fields' => array(      'nid' => array(        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default' => 0,        'description' => 'The {node}.nid of the node.',      ),      'vid' => array(        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default' => 0,        'description' => 'Primary Key: The {node}.vid of the node.',      ),      'tid' => array(        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default' => 0,        'description' => 'The {taxonomy_term_data}.tid of the forum term assigned to the node.',      ),    ),    'indexes' => array(      'forum_topic' => array('nid', 'tid'),      'tid' => array('tid'),    ),    'primary key' => array('vid'),    'foreign keys' => array(      'forum_node' => array(        'table' => 'node',        'columns' => array(          'nid' => 'nid',          'vid' => 'vid',        ),      ),    ),  );  $schema['forum_index'] = array(    'description' => 'Maintains denormalized information about node/term relationships.',    'fields' => array(      'nid' => array(        'description' => 'The {node}.nid this record tracks.',        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default' => 0,      ),      'title' => array(        'description' => 'The title of this node, always treated as non-markup plain text.',        'type' => 'varchar',        'length' => 255,        'not null' => TRUE,        'default' => '',      ),      'tid' => array(         'description' => 'The term ID.',         'type' => 'int',         'unsigned' => TRUE,         'not null' => TRUE,         'default' => 0,      ),      'sticky' => array(        'description' => 'Boolean indicating whether the node is sticky.',        'type' => 'int',        'not null' => FALSE,        'default' => 0,        'size' => 'tiny',      ),      'created' => array(        'description' => 'The Unix timestamp when the node was created.',        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default'=> 0,      ),      'last_comment_timestamp' => array(        'type' => 'int',        'not null' => TRUE,        'default' => 0,        'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.timestamp.',      ),      'comment_count' => array(        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default' => 0,        'description' => 'The total number of comments on this node.',      ),    ),    'indexes' => array(      'forum_topics' => array('nid', 'tid', 'sticky', 'last_comment_timestamp'),      'created' => array('created'),      'last_comment_timestamp' => array('last_comment_timestamp'),    ),    'foreign keys' => array(      'tracked_node' => array(        'table' => 'node',        'columns' => array('nid' => 'nid'),      ),      'term' => array(        'table' => 'taxonomy_term_data',        'columns' => array(          'tid' => 'tid',        ),      ),    ),  );  return $schema;}/** * Implements hook_update_dependencies(). */function forum_update_dependencies() {  $dependencies['forum'][7003] = array(    // Forum update 7003 uses field API update functions, so must run after    // Field API has been enabled.    'system' => 7020,    // Forum update 7003 relies on updated taxonomy module schema. Ensure it    // runs after all taxonomy updates.    'taxonomy' => 7010,  );  return $dependencies;}/** * Add new index to forum table. */function forum_update_7000() {  db_drop_index('forum', 'nid');  db_add_index('forum', 'forum_topic', array('nid', 'tid'));}/** * Create new {forum_index} table. */function forum_update_7001() {  $forum_index = array(    'description' => 'Maintains denormalized information about node/term relationships.',    'fields' => array(      'nid' => array(        'description' => 'The {node}.nid this record tracks.',        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default' => 0,      ),      'title' => array(        'description' => 'The title of this node, always treated as non-markup plain text.',        'type' => 'varchar',        'length' => 255,        'not null' => TRUE,        'default' => '',      ),      'tid' => array(         'description' => 'The term ID.',         'type' => 'int',         'unsigned' => TRUE,         'not null' => TRUE,         'default' => 0,      ),      'sticky' => array(        'description' => 'Boolean indicating whether the node is sticky.',        'type' => 'int',        'not null' => FALSE,        'default' => 0,        'size' => 'tiny',      ),      'created' => array(        'description' => 'The Unix timestamp when the node was created.',        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default'=> 0,      ),      'last_comment_timestamp' => array(        'type' => 'int',        'not null' => TRUE,        'default' => 0,        'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.timestamp.',      ),      'comment_count' => array(        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,        'default' => 0,        'description' => 'The total number of comments on this node.',      ),    ),    'indexes' => array(      'forum_topics' => array('tid', 'sticky', 'last_comment_timestamp'),    ),    'foreign keys' => array(      'tracked_node' => array(        'table' => 'node',        'columns' => array('nid' => 'nid'),      ),      'term' => array(        'table' => 'taxonomy_term_data',        'columns' => array(          'tid' => 'tid',        ),      ),    ),  );  db_create_table('forum_index', $forum_index);  $select = db_select('node', 'n');  $forum_alias = $select->join('forum', 'f', 'n.vid = f.vid');  $ncs_alias = $select->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');  $select    ->fields('n', array('nid', 'title', 'sticky', 'created'))    ->fields($forum_alias, array('tid'))    ->fields($ncs_alias, array('last_comment_timestamp', 'comment_count'));  db_insert('forum_index')    ->fields(array('nid', 'title', 'sticky', 'created', 'tid', 'last_comment_timestamp', 'comment_count'))    ->from($select)    ->execute();}/** * @addtogroup updates-7.x-extra * @{ *//** * Add new index to forum_index table. */function forum_update_7002() {  db_drop_index('forum_index', 'forum_topics');  db_add_index('forum_index', 'forum_topics', array('nid', 'tid', 'sticky', 'last_comment_timestamp'));}/** * Rename field to 'taxonomy_forums'. */function forum_update_7003() {  $messages = array();  $new_field_name = 'taxonomy_forums';  // Test to see if the taxonomy_forums field exists.  $fields = _update_7000_field_read_fields(array('field_name' => $new_field_name));  if ($fields) {    // Since the field exists, we're done.    return;  }  // Calculate the old field name.  $vid = variable_get('forum_nav_vocabulary', 0);  $vocabulary_machine_name = db_select('taxonomy_vocabulary', 'tv')    ->fields('tv', array('machine_name'))    ->condition('vid', $vid)    ->execute()    ->fetchField();  $old_field_name = 'taxonomy_' . $vocabulary_machine_name;  // Read the old fields.  $old_fields = _update_7000_field_read_fields(array('field_name' => $old_field_name));  foreach ($old_fields as $old_field) {    if ($old_field['storage']['type'] != 'field_sql_storage') {      $messages[] = t('Cannot rename field %id (%old_field_name) to %new_field_name because it does not use the field_sql_storage storage type.', array(        '%id' => $old_field['id'],        '%old_field_name' => $old_field_name,        '%new_field_name' => $new_field_name,      ));      continue;    }    // Update {field_config}.    db_update('field_config')      ->fields(array('field_name' => $new_field_name))      ->condition('id', $old_field['id'])      ->execute();    // Update {field_config_instance}.    db_update('field_config_instance')      ->fields(array('field_name' => $new_field_name))      ->condition('field_id', $old_field['id'])      ->execute();    // The tables that need updating in the form 'old_name' => 'new_name'.    $tables = array(      'field_data_' . $old_field_name => 'field_data_' . $new_field_name,      'field_revision_' . $old_field_name => 'field_revision_' . $new_field_name,    );    foreach ($tables as $old_table => $new_table) {      $old_column_name = $old_field_name . '_tid';      $new_column_name = $new_field_name . '_tid';      // Rename the column.      db_drop_index($old_table, $old_column_name);      db_change_field($old_table, $old_column_name, $new_column_name, array(        'type' => 'int',        'unsigned' => TRUE,        'not null' => FALSE,      ));      db_drop_index($old_table, $new_column_name);      db_add_index($old_table, $new_column_name, array($new_column_name));      // Rename the table.      db_rename_table($old_table, $new_table);    }  }  cache_clear_all('*', 'cache_field', TRUE);  return $messages;}/** * Update {forum_index} so that only published nodes are indexed. */function forum_update_7011() {  $select = db_select('node', 'n')    ->fields('n', array('nid'))    ->condition('status', 0 );  db_delete('forum_index')    ->condition('nid', $select, 'IN')    ->execute();}/** * Add 'created' and 'last_comment_timestamp' indexes. */function forum_update_7012() {  db_add_index('forum_index', 'created', array('created'));  db_add_index('forum_index', 'last_comment_timestamp', array('last_comment_timestamp'));}/** * @} End of "addtogroup updates-7.x-extra". */
 |