Newer
Older
Dries Buytaert
committed
<?php
Angie Byron
committed
/**
* @file
* Install, update and uninstall functions for the forum module.
*/
Dries Buytaert
committed
* Implements hook_install().
Dries Buytaert
committed
function forum_install() {
Dries Buytaert
committed
// Set the weight of the forum.module to 1 so it is loaded after the taxonomy.module.
Dries Buytaert
committed
db_update('system')
->fields(array('weight' => 1))
->condition('name', 'forum')
->execute();
Dries Buytaert
committed
// 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'));
Dries Buytaert
committed
}
Dries Buytaert
committed
/**
* Implements hook_enable().
*/
Dries Buytaert
committed
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');
Angie Byron
committed
// Create the forum vocabulary if it does not exist.
$vocabulary = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', 0));
if (!$vocabulary) {
Dries Buytaert
committed
$edit = array(
Dries Buytaert
committed
'name' => t('Forums'),
Angie Byron
committed
'machine_name' => 'forums',
'description' => t('Forum navigation vocabulary'),
Dries Buytaert
committed
'hierarchy' => 1,
'module' => 'forum',
'weight' => -10,
);
Dries Buytaert
committed
$vocabulary = (object) $edit;
taxonomy_vocabulary_save($vocabulary);
Angie Byron
committed
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(
Angie Byron
committed
'field_name' => 'taxonomy_forums',
Angie Byron
committed
'type' => 'taxonomy_term_reference',
'settings' => array(
'allowed_values' => array(
array(
Angie Byron
committed
'vocabulary' => $vocabulary->machine_name,
Angie Byron
committed
'parent' => 0,
),
),
),
);
field_create_field($field);
Dries Buytaert
committed
Dries Buytaert
committed
// 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);
Angie Byron
committed
// Create the instance on the bundle.
$instance = array(
Angie Byron
committed
'field_name' => 'taxonomy_forums',
Angie Byron
committed
'entity_type' => 'node',
'label' => $vocabulary->name,
'bundle' => 'forum',
'required' => TRUE,
'widget' => array(
'type' => 'options_select',
),
Angie Byron
committed
'display' => array(
'default' => array(
'type' => 'taxonomy_term_reference_link',
'weight' => 10,
),
'teaser' => array(
'type' => 'taxonomy_term_reference_link',
'weight' => 10,
),
),
Angie Byron
committed
);
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']);
}
Dries Buytaert
committed
* 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');
Dries Buytaert
committed
variable_del('forum_block_num_active');
variable_del('forum_block_num_new');
Dries Buytaert
committed
variable_del('node_options_forum');
Angie Byron
committed
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);
Dries Buytaert
committed
/**
Dries Buytaert
committed
* Implements hook_schema().
Dries Buytaert
committed
*/
function forum_schema() {
$schema['forum'] = array(
Dries Buytaert
committed
'description' => 'Stores the relationship of nodes to forum terms.',
Dries Buytaert
committed
'fields' => array(
'nid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
Dries Buytaert
committed
'description' => 'The {node}.nid of the node.',
),
'vid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
Dries Buytaert
committed
'description' => 'Primary Key: The {node}.vid of the node.',
),
'tid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
Dries Buytaert
committed
'description' => 'The {taxonomy_term_data}.tid of the forum term assigned to the node.',
Dries Buytaert
committed
),
'indexes' => array(
Dries Buytaert
committed
'forum_topic' => array('nid', 'tid'),
'tid' => array('tid'),
Dries Buytaert
committed
),
'primary key' => array('vid'),
'foreign keys' => array(
Dries Buytaert
committed
'forum_node' => array(
'table' => 'node',
'columns' => array(
'nid' => 'nid',
'vid' => 'vid',
),
),
Dries Buytaert
committed
);
Angie Byron
committed
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
$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'),
Angie Byron
committed
),
'foreign keys' => array(
Dries Buytaert
committed
'tracked_node' => array(
'table' => 'node',
'columns' => array('nid' => 'nid'),
),
'term' => array(
'table' => 'taxonomy_term_data',
'columns' => array(
'tid' => 'tid',
),
),
Angie Byron
committed
),
);
Dries Buytaert
committed
return $schema;
}
Dries Buytaert
committed
/**
* 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;
}
Dries Buytaert
committed
/**
* Add new index to forum table.
*/
function forum_update_7000() {
Dries Buytaert
committed
db_drop_index('forum', 'nid');
db_add_index('forum', 'forum_topic', array('nid', 'tid'));
Dries Buytaert
committed
}
Angie Byron
committed
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
/**
* 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(
Dries Buytaert
committed
'tracked_node' => array(
'table' => 'node',
'columns' => array('nid' => 'nid'),
),
'term' => array(
'table' => 'taxonomy_term_data',
'columns' => array(
'tid' => 'tid',
),
),
Angie Byron
committed
),
);
db_create_table('forum_index', $forum_index);
Angie Byron
committed
Angie Byron
committed
$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();
Angie Byron
committed
}
/**
* 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'));
}
Angie Byron
committed
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
/**
* @addtogroup updates-7.x-extra
* @{
*/
/**
* 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;
}
/**
* @} End of "addtogroup updates-7.x-extra"
*/
/**
* Update {form_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();
}