summaryrefslogtreecommitdiff
path: root/modules/forum
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2007-09-05 08:27:57 +0000
committerDries Buytaert <dries@buytaert.net>2007-09-05 08:27:57 +0000
commit531b45d045cd1468a37ebf1de4d39352e51360b9 (patch)
tree7c012819cd42d7511066b1598363add079a5a3aa /modules/forum
parent2db2c039fb5caabf511c95f15034ec18b39533d4 (diff)
downloadbrdo-531b45d045cd1468a37ebf1de4d39352e51360b9.tar.gz
brdo-531b45d045cd1468a37ebf1de4d39352e51360b9.tar.bz2
- Patch #172643 by chx and fresco: fixed the leave shadow copy functionality.
Diffstat (limited to 'modules/forum')
-rw-r--r--modules/forum/forum.install47
-rw-r--r--modules/forum/forum.module48
-rw-r--r--modules/forum/forum.schema18
3 files changed, 75 insertions, 38 deletions
diff --git a/modules/forum/forum.install b/modules/forum/forum.install
index b63ea4c44..d17b9ba12 100644
--- a/modules/forum/forum.install
+++ b/modules/forum/forum.install
@@ -5,33 +5,31 @@
* Implementation of hook_install().
*/
function forum_install() {
- // Create the forum vocabulary. Assign the vocabulary a low weight so
- // it will appear first in forum topic create and edit forms.
- $vocabulary = array(
- 'name' => t('Forums'),
- 'multiple' => 0,
- 'required' => 1,
- 'hierarchy' => 1,
- 'relations' => 0,
- 'module' => 'forum',
- 'weight' => -10,
- 'nodes' => array('forum' => 1),
- );
- taxonomy_save_vocabulary($vocabulary);
-
- variable_set('forum_nav_vocabulary', $vocabulary['vid']);
+ // Create tables.
+ drupal_install_schema('forum');
}
-/**
- * Remove forum table; forums now use the general term_node table to support multiple
- * node types.
- */
-function forum_update_6001() {
- $ret = array();
-
- $ret[] = update_sql("DROP TABLE {forum}");
+function forum_enable() {
+ // Create the forum vocabulary if it does not exist. Assign the vocabulary
+ // a low weight so it will appear first in forum topic create and edit
+ // forms.
+ $vid = variable_get('forum_nav_vocabulary', 0);
+ $vocabularies = taxonomy_get_vocabularies();
+ if (!isset($vocabularies[$vid])) {
+ $vocabulary = array(
+ 'name' => t('Forums'),
+ 'multiple' => 0,
+ 'required' => 1,
+ 'hierarchy' => 1,
+ 'relations' => 0,
+ 'module' => 'forum',
+ 'weight' => -10,
+ 'nodes' => array('forum' => 1),
+ );
+ taxonomy_save_vocabulary($vocabulary);
- return $ret;
+ variable_set('forum_nav_vocabulary', $vocabulary['vid']);
+ }
}
/**
@@ -43,6 +41,7 @@ function forum_uninstall() {
taxonomy_del_vocabulary($vid);
db_query("DELETE FROM {node} WHERE type = 'forum'");
+ db_query('DROP TABLE {forum}');
variable_del('forum_containers');
variable_del('forum_nav_vocabulary');
variable_del('forum_hot_topic');
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index d01a34449..a061011f1 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -234,7 +234,7 @@ function forum_nodeapi(&$node, $op, $teaser, $page) {
break;
// Assign forum taxonomy when adding a topic from within a forum.
- case 'submit':
+ case 'presave':
// Make sure all fields are set properly:
$node->icon = !empty($node->icon) ? $node->icon : '';
@@ -246,12 +246,12 @@ function forum_nodeapi(&$node, $op, $teaser, $page) {
$forum_terms[] = $term->tid;
}
}
- foreach ($node->taxonomy as $term_id => $term) {
+ foreach ($node->taxonomy as $term_id) {
if (in_array($term_id, $forum_terms)) {
$node->tid = $term_id;
}
}
- $old_tid = db_result(db_query_range("SELECT t.tid FROM {term_data} t INNER JOIN {node} n WHERE t.vid = n.vid AND n.nid = %d ORDER BY t.vid DESC", $node->nid, 0, 1));
+ $old_tid = db_result(db_query_range("SELECT t.tid FROM {term_node} t INNER JOIN {node} n WHERE t.vid = n.vid AND n.nid = %d ORDER BY t.vid DESC", $node->nid, 0, 1));
if ($old_tid) {
if (($node->tid != $old_tid) && $node->shadow) {
// A shadow copy needs to be created. Retain new term and add old term.
@@ -260,6 +260,20 @@ function forum_nodeapi(&$node, $op, $teaser, $page) {
}
}
break;
+ case 'update':
+ if (!$node->revision) {
+ db_query('UPDATE {forum} SET tid = %d WHERE vid = %d', $node->tid, $node->vid);
+ break;
+ }
+ // Deliberate no break -- for new revisions we need an insert.
+ case 'insert':
+ db_query('INSERT INTO {forum} (tid, vid, nid) VALUES (%d, %d, %d)', $node->tid, $node->vid, $node->nid);
+ break;
+ case 'delete':
+ db_query('DELETE FROM {forum} WHERE nid = %d', $node->nid);
+ break;
+ case 'load':
+ return db_fetch_object(db_query('SELECT tid AS forum_tid FROM {forum} WHERE vid = %d', $node->vid));
}
return;
@@ -347,6 +361,7 @@ function forum_form_alter(&$form, $form_state, $form_id) {
unset($form['relations']);
unset($form['tags']);
unset($form['multiple']);
+ unset($form['delete']);
$form['required'] = array('#type' => 'value', '#value' => 1);
}
}
@@ -496,7 +511,7 @@ function forum_get_forums($tid = 0) {
// This query does not use full ANSI syntax since MySQL 3.x does not support
// table1 INNER JOIN table2 INNER JOIN table3 ON table2_criteria ON table3_criteria
// used to join node_comment_statistics to users.
- $sql = "SELECT ncs.last_comment_timestamp, IF (ncs.last_comment_uid != 0, u2.name, ncs.last_comment_name) AS last_comment_name, ncs.last_comment_uid FROM {node} n INNER JOIN {users} u1 ON n.uid = u1.uid INNER JOIN {term_node} tn ON n.nid = tn.nid INNER JOIN {node_comment_statistics} ncs ON n.nid = ncs.nid INNER JOIN {users} u2 ON ncs.last_comment_uid=u2.uid WHERE n.status = 1 AND tn.tid = %d ORDER BY ncs.last_comment_timestamp DESC";
+ $sql = "SELECT ncs.last_comment_timestamp, IF (ncs.last_comment_uid != 0, u2.name, ncs.last_comment_name) AS last_comment_name, ncs.last_comment_uid FROM {node} n INNER JOIN {users} u1 ON n.uid = u1.uid INNER JOIN {term_node} tn ON n.vid = tn.vid INNER JOIN {node_comment_statistics} ncs ON n.nid = ncs.nid INNER JOIN {users} u2 ON ncs.last_comment_uid=u2.uid WHERE n.status = 1 AND tn.tid = %d ORDER BY ncs.last_comment_timestamp DESC";
$sql = db_rewrite_sql($sql);
$topic = db_fetch_object(db_query_range($sql, $forum->tid, 0, 1));
@@ -519,7 +534,7 @@ function forum_get_forums($tid = 0) {
* than NODE_NEW_LIMIT.
*/
function _forum_topics_unread($term, $uid) {
- $sql = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid AND tn.tid = %d LEFT JOIN {history} h ON n.nid = h.nid AND h.uid = %d WHERE n.status = 1 AND n.created > %d AND h.nid IS NULL";
+ $sql = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {term_node} tn ON n.vid = tn.vid AND tn.tid = %d LEFT JOIN {history} h ON n.nid = h.nid AND h.uid = %d WHERE n.status = 1 AND n.created > %d AND h.nid IS NULL";
$sql = db_rewrite_sql($sql);
return db_result(db_query($sql, $term, $uid, NODE_NEW_LIMIT));
}
@@ -544,7 +559,7 @@ function forum_get_topics($tid, $sortby, $forum_per_page) {
$term = taxonomy_get_term($tid);
- $sql = db_rewrite_sql("SELECT n.nid, r.tid, n.title, n.sticky, u.name, u.uid, n.created AS timestamp, n.comment AS comment_mode, l.last_comment_timestamp, IF(l.last_comment_uid != 0, cu.name, l.last_comment_name) AS last_comment_name, l.last_comment_uid, l.comment_count AS num_comments FROM {node_comment_statistics} l, {users} cu, {term_node} r, {users} u, {node} n WHERE n.status = 1 AND l.last_comment_uid = cu.uid AND n.nid = l.nid AND n.nid = r.nid AND r.tid = %d AND n.uid = u.uid AND n.vid = r.vid");
+ $sql = db_rewrite_sql("SELECT n.nid, r.tid, n.title, n.sticky, u.name, u.uid, n.created AS timestamp, n.comment AS comment_mode, l.last_comment_timestamp, IF(l.last_comment_uid != 0, cu.name, l.last_comment_name) AS last_comment_name, l.last_comment_uid, l.comment_count AS num_comments, f.tid AS forum_tid FROM {node_comment_statistics} l INNER JOIN {node} n ON n.nid = l.nid INNER JOIN {users} cu ON l.last_comment_uid = cu.uid INNER JOIN {term_node} r ON n.vid = r.vid INNER JOIN {users} u ON n.uid = u.uid INNER JOIN {forum} f ON n.vid = f.vid WHERE n.status = 1 AND r.tid = %d");
$sql .= tablesort_sql($forum_topic_list_header, 'n.sticky DESC,');
$sql .= ', n.created DESC'; // Always add a secondary sort order so that the news forum topics are on top.
@@ -778,7 +793,19 @@ function template_preprocess_forum_topic_list(&$variables) {
$variables['topics'][$id]->zebra = $row % 2 == 0 ? 'odd' : 'even';
$row++;
- $variables['topics'][$id]->title = l($topic->title, "node/$topic->nid");
+ // We keep the actual tid in forum table, if it's different from the
+ // current tid then it means the topic appears in two forums, one of
+ // them is a shadow copy.
+ if ($topic->forum_tid != $variables['tid']) {
+ $variables['topics'][$id]->moved = TRUE;
+ $variables['topics'][$id]->title = check_plain($topic->title);
+ $variables['topics'][$id]->message = l(t('This topic has been moved'), "forum/$topic->forum_tid");
+ }
+ else {
+ $variables['topics'][$id]->moved = FALSE;
+ $variables['topics'][$id]->title = l($topic->title, "node/$topic->nid");
+ $variables['topics'][$id]->message = '';
+ }
$variables['topics'][$id]->created = theme('forum_submitted', $topic);
$variables['topics'][$id]->last_reply = theme('forum_submitted', isset($topic->last_reply) ? $topic->last_reply : NULL);
@@ -789,13 +816,6 @@ function template_preprocess_forum_topic_list(&$variables) {
$variables['topics'][$id]->new_url = url("node/$topic->nid", array('query' => comment_new_page_count($topic->num_comments, $topic->new_replies, $topic->nid), 'fragment' => 'new'));
}
- $variables['topics'][$id]->moved = FALSE;
- $variables['topics'][$id]->message = '';
- if ($topic->tid != $variables['tid']) {
- $variables['topics'][$id]->moved = TRUE;
- $variables['topics'][$id]->title = check_plain($topic->title);
- $variables['topics'][$id]->message = l(t('This topic has been moved'), "forum/$topic->tid");
- }
}
}
else {
diff --git a/modules/forum/forum.schema b/modules/forum/forum.schema
index e69de29bb..738fb8e39 100644
--- a/modules/forum/forum.schema
+++ b/modules/forum/forum.schema
@@ -0,0 +1,18 @@
+<?php
+
+function forum_schema() {
+ $schema['forum'] = array(
+ 'fields' => array(
+ 'nid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+ 'vid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+ 'tid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+ ),
+ 'indexes' => array(
+ 'nid' => array('nid'),
+ 'tid' => array('tid')
+ ),
+ 'primary key' => array('vid'),
+ );
+
+ return $schema;
+}