From f6da12ca19f5dff391a025b33889b34e42b692c3 Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Wed, 15 Jan 2003 23:01:42 +0000 Subject: Patch by Marco: - forum: fixed link to new topic - forum: new topic shows default forum correctly - forum: first_new is back; the anchor didn't consider multiple pages - forum: use standard pager, needed some changes/fixes to pager.inc - forum: some cleanup - forum: taxonomy hook - renamed first_new to simply new - added an optional parameter to pager_query for the count query - used the optional count param for paging forum topics - internal change: moving a topic doesn't duplicate the node anymore but just changes the forum (term); no change in functionality, and shadow still works (suggested by Dries). This probably also made some queries somewhat lighter. - bug fixed: anonymous users always saw "n (n new)" in the replies column - updated pager help and moved from _help to phpdoc --- includes/pager.inc | 55 +++++++---- modules/forum.module | 226 +++++++++++++++++++-------------------------- modules/forum/forum.module | 226 +++++++++++++++++++-------------------------- update.php | 12 ++- 4 files changed, 236 insertions(+), 283 deletions(-) diff --git a/includes/pager.inc b/includes/pager.inc index 28d96c743..626f0ca2e 100644 --- a/includes/pager.inc +++ b/includes/pager.inc @@ -1,14 +1,6 @@ -

Implementation note: making queries pagable

-

The pager uses LIMIT-based queries to fetch only the records required to render a certain page. However, it has to learn the total number of records returned by the query to (among others) compute the number of pages (= number of all records / number of records per page). This is done by inserting COUNT(*) in the original query, ie. by rewriting the original query

SELECT nid, type FROM node WHERE status = '1' ORDER BY static DESC, created DESC
to read
SELECT COUNT(*) FROM node WHERE status = '1' ORDER BY static DESC, created DESC
Rewriting the query is accomplished using a regular expression; preg_replace("/SELECT.*FROM/i", "SELECT COUNT(*) FROM", $query).

-

Unfortunately, the call to preg_replace() does not work as intended for queries that already have a COUNT() clause; the original COUNT() will be removed from the query, possibly making the remainder of the query fail (eg. when the use of HAVING or ORDER depends on the value returned by COUNT()). In practice, for queries to be pager_query()-able, they shold be reformulated not to use COUNT().

- - * "SELECT * FROM table" - * "SELECT field1,field2 FROM table WHERE nid = '1'" - * @param int $limit how many rows to return (per page) - * @param int $element adds support for multiple paged tables on one page + * For example, if you want to page this query: "SELECT COUNT(*), TYPE FROM + * node GROUP BY TYPE", pager_query() would invoke the wrong query, being: + * "SELECT COUNT(*) FROM node GROUP BY TYPE". So instead, you should pass + * "SELECT COUNT(DISTINCT(TYPE)) FROM node" as the optional $count_query + * parameter. * - * @return resource MySQL query result + * @param string $query the SQL query that needs paging + * @param int $limit the number of rows per page + * @param int $element optional attribute to distringuish between multiple pagers on one page + * @param string $count_query an optional SQL query used to count records when rewriting the query would fail + * + * @return resource SQL query result */ -function pager_query($query, $limit = 10, $element = 0) { + +function pager_query($query, $limit = 10, $element = 0, $count_query = "") { global $from, $pager_from_array, $db_type, $pager_total; // count the total number of records in this query: - $pager_total[$element] = db_result(db_query(preg_replace("/SELECT.*FROM/i", "SELECT COUNT(*) FROM", $query))); + if ($count_query == "") { + $pager_total[$element] = db_result(db_query(preg_replace(array("/SELECT.*FROM/i", "/ORDER BY .*/"), array("SELECT COUNT(*) FROM", ""), $query))); + } + else { + $pager_total[$element] = db_result(db_query($count_query)); + } // convert comma separated $from to an array, used by other functions: $pager_from_array = explode(",", $from); @@ -282,16 +296,17 @@ function pager_query($query, $limit = 10, $element = 0) { } function pager_link($from_new, $attributes = array()) { + global $q; foreach($attributes as $key => $value) { $query[] = "$key=$value"; } if (count($attributes)) { - $url = url("", "from=". $from_new[0] ."&". implode("&", $query)); + $url = url($q, "from=". $from_new[0] ."&". implode("&", $query)); } else { - $url = url("", "from=". $from_new[0]); + $url = url($q, "from=". $from_new[0]); } return $url; diff --git a/modules/forum.module b/modules/forum.module index 605d8048f..92d91f6bf 100644 --- a/modules/forum.module +++ b/modules/forum.module @@ -59,14 +59,22 @@ function forum_conf_options() { return $output; } +function forum_taxonomy($op, $type, $object) { + if ($type == "vocabulary" && ($op == "insert" || $op == "update")) { + if (variable_get("forum_nav_vocabulary", "") == "" && in_array("forum", $object["types"])) { + // since none is already set, silently set this vocabulary as the navigation vocabulary + variable_set("forum_nav_vocabulary", $object["vid"]); + } + } +} + function forum_save($op, $node) { if ($op == "approve") { return array("status" => 1); } if ($op == "create") { - $moderation = array("body" => filter($node->body), "moderate" => 0, "status" => 1); - return array_merge($moderation, array("tid", "icon_num", "shadow")); + return array("body" => filter($node->body), "moderate" => 0, "status" => 1, "tid", "icon_num", "shadow" => 0); } if ($op == "decline") { @@ -74,20 +82,12 @@ function forum_save($op, $node) { } if ($op == "update") { - // if she changed the term, we could have to leave a shadow - $old_terms = explode(",", $node->old_container); - foreach ($node->taxonomy as $term) { - if ($term && (!in_array($term, $old_terms)) && $node->shadow) { - $shadow = $term; - break; - } - } - return array("body" => filter($node->body), "tid", "icon_num", "shadow" => $shadow, "old_container"); + return array("body" => filter($node->body), "tid", "icon_num", "shadow"); } } function forum_load($node) { - $forum = db_fetch_object(db_query("SELECT * FROM forum WHERE nid = '%d' AND shadow = 0", $node->nid)); + $forum = db_fetch_object(db_query("SELECT * FROM forum WHERE nid = '%d'", $node->nid)); return $forum; } @@ -102,7 +102,7 @@ function forum_block($op = "list", $delta = 0) { if (empty($cache)) { unset($items); - $content = node_title_list(db_query("SELECT n.nid, n.title, u.uid, u.name, GREATEST(n.created, MAX(c.timestamp)) AS sort FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid LEFT JOIN users u ON n.uid = u.uid WHERE n.type = 'forum' AND n.nid = f.nid AND f.shadow = 0 AND n.status = 1 GROUP BY n.nid ORDER BY sort DESC LIMIT ". variable_get("forum_block_num", "5")), t("Active forum topics:")); + $content = node_title_list(db_query("SELECT n.nid, n.title, u.uid, u.name, GREATEST(n.created, MAX(c.timestamp)) AS sort FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid LEFT JOIN users u ON n.uid = u.uid WHERE n.type = 'forum' AND n.nid = f.nid AND n.status = 1 GROUP BY n.nid ORDER BY sort DESC LIMIT ". variable_get("forum_block_num", "5")), t("Active forum topics:")); $content .= "
"; unset ($items); @@ -127,6 +127,7 @@ function forum_block($op = "list", $delta = 0) { } function forum_link($type, $node = 0, $main = 0) { + global $user; if ($type == "page" && user_access("access content")) { $links[] = l(t("forum"), "forum"); @@ -135,10 +136,7 @@ function forum_link($type, $node = 0, $main = 0) { if (!$main && $type == "node" && $node->type == "forum") { // get previous and next topic - $sql = "SELECT n.nid, title, body, GREATEST(n.created, MAX(c.timestamp)) AS date_sort, COUNT(c.nid) AS num_comments FROM node n, term_node t, forum f LEFT JOIN comments c ON c.nid = n.nid WHERE n.nid = t.nid AND n.nid = f.nid AND t.tid = '%d' AND f.shadow = 0 AND n.status = 1 GROUP BY n.nid ORDER BY ". _forum_get_topic_order(isset($user->sortby) ? $user->sortby : variable_get("forum_order",1)); - - $terms = array_keys(taxonomy_node_get_terms_by_vocabulary($node->nid, variable_get("forum_nav_vocabulary", ""))); - $result = db_query($sql, $terms[0]); + $result = db_query("SELECT n.nid, title, body, GREATEST(n.created, MAX(c.timestamp)) AS date_sort, COUNT(c.nid) AS num_comments FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid WHERE n.nid = f.nid AND f.tid = '%d' AND n.status = 1 GROUP BY n.nid ORDER BY ". _forum_get_topic_order(isset($user->sortby) ? $user->sortby : variable_get("forum_order",1)), $node->tid); while ($topic = db_fetch_object($result)) { if ($stop == 1) { @@ -179,16 +177,6 @@ function forum_view($node, $main = 0) { } $voc = taxonomy_get_vocabulary($term_data->vid); - /* TODO: find out what this code was ment to do and either use it or not. - - $output .= "

". _forum_get_icon($node) ." ". l($voc->name, "forum") ." : ". l($term_data->name, "forum/$term_data->tid"); - - $output .= " / $node->title
".t("%a by %b", array("%a" => format_date($node->created), "%b" => format_name($node)))."

". check_output($node->body) ."

"; - $output .= "

". $theme->links(link_node($node, $main)) ."

"; - - #$theme->box(t("Discussion forum"), $output); - */ - if (!$main) { $node->title = _forum_get_icon($node) ." ". l($voc->name, "forum") ." : ". l($term_data->name, "forum/$term_data->tid") ." / $node->title"; } @@ -196,27 +184,31 @@ function forum_view($node, $main = 0) { $theme->node($node, $main); } +function forum_validate($node) { + // we use the validate hook to remember the old taxonomy terms + $node->taxonomy = array_keys(taxonomy_node_get_terms($node->nid)); + if (!in_array($node->tid[0], $node->taxonomy)) { + $node->taxonomy[] = $node->tid[0]; + } + return $node; +} + function forum_form(&$node, &$help, &$error) { - global $tid; - if ($node->nid) { - if ($node->taxonomy) { - $tid = $node->taxonomy; - } - else { - // editing: load category from taxonomy - $tid = implode(",", array_keys(taxonomy_node_get_terms($node->nid))); - } - //$output .= implode("

", taxonomy_node_form("forum", $node)); - $output .= "nid)))."\">"; - $output .= form_checkbox(t("Leave shadow copy"), "shadow", 1, $node->shadow, t("If you move this topic, you can leave a link in the old forum to the new forum.")); + if ($node->tid) { + // editing + $tid = $node->tid; } else { - if ($node->taxonomy) { - $tid = $node->taxonomy; - } + // new topic + $tid = arg(3); } - $output .= _taxonomy_term_select("Forum", "taxonomy", $tid, variable_get("forum_nav_vocabulary", ""), "", 0, "", variable_get("forum_containers", array())); + $output .= _taxonomy_term_select("Forum", "tid", $tid, variable_get("forum_nav_vocabulary", ""), "", 0, "", variable_get("forum_containers", array())); + + if ($node->nid) { + // if editing, give option to leave shadows + $output .= form_checkbox(t("Leave shadow copy"), "shadow", 1, $node->shadow, t("If you move this topic, you can leave a link in the old forum to the new forum.")); + } if ($icon_path = variable_get("forum_topic_icon_path", "")) { if ($node->icon) { @@ -253,26 +245,12 @@ function forum_form(&$node, &$help, &$error) { function forum_insert($node) { $node->icon = _forum_decode_icon($node); - if (!$node->shadow) { - db_query("INSERT INTO forum (nid, icon) VALUES ('%d', '%s')", $node->nid, $node->icon); - } - else { - // we created a shadow, a link to a moved topic in a new forum - db_query("INSERT INTO forum (nid, icon, shadow) VALUES ('%d', '%s', '%d')", $node->nid, $node->icon, $node->shadow); - } + db_query("INSERT INTO forum (nid, icon, shadow, tid) VALUES ('%d', '%s', '%d', '%d')", $node->nid, $node->icon, $node->shadow, $node->tid); } function forum_update($node) { $node->icon = _forum_decode_icon($node); - db_query("UPDATE forum SET icon = '%s' WHERE nid = '%d'", $node->icon, $node->nid); - if ($node->shadow) { - // insert in old forum a new topic, with link to new forum - $node->nid = ""; - $node->type = "forum"; - $node->status = 1; - $node->taxonomy = array($node->old_container); - node_submit($node); - } + db_query("UPDATE forum SET icon = '%s', shadow = '%d', tid = '%d' WHERE nid = '%d'", $node->icon, $node->shadow, $node->tid[0], $node->nid); } function _forum_decode_icon($node) { @@ -358,7 +336,6 @@ function forum_get_forums($tid = 0) { } } } - return $forums; } @@ -376,17 +353,17 @@ function forum_get_parents($tid) { } function _forum_num_topics($term) { - $value = db_fetch_object(db_query("SELECT COUNT(n.nid) AS count FROM node n, term_node r, forum f WHERE r.tid = '%d' AND n.nid = r.nid AND n.nid = f.nid AND n.status = 1 AND n.type = 'forum' AND f.shadow = 0", $term)); + $value = db_fetch_object(db_query("SELECT COUNT(n.nid) AS count FROM node n, forum f WHERE f.tid = '%d' AND n.nid = f.nid AND n.status = 1 AND n.type = 'forum'", $term)); return ($value) ? $value->count : 0; } function _forum_num_replies($term) { - $value = db_fetch_object(db_query("SELECT COUNT(*) AS count FROM comments c, term_node r, node n WHERE r.tid = '%d' AND n.nid = r.nid AND n.nid = c.nid AND n.status = 1 AND c.status = 0 AND n.type = 'forum'", $term)); + $value = db_fetch_object(db_query("SELECT COUNT(*) AS count FROM comments c, node n, forum f WHERE f.tid = '%d' AND n.nid = f.nid AND n.nid = c.nid AND n.status = 1 AND c.status = 0 AND n.type = 'forum'", $term)); return ($value) ? $value->count : 0; } function _forum_topics_read($uid) { - $result = db_query("SELECT tid, count(*) AS c FROM history h, term_node r, node n, forum f WHERE f.nid = r.nid AND r.nid = h.nid AND n.nid = h.nid AND f.shadow = 0 AND n.type = 'forum' AND n.status = 1 AND h.uid = '%d' GROUP BY tid", $uid); + $result = db_query("SELECT tid, count(*) AS c FROM history h, node n, forum f WHERE f.nid = n.nid AND n.nid = h.nid AND n.type = 'forum' AND n.status = 1 AND h.uid = '%d' GROUP BY tid", $uid); while ($obj = db_fetch_object($result)) { $topics_read[$obj->tid] = $obj->c; @@ -396,16 +373,16 @@ function _forum_topics_read($uid) { } function _forum_last_post($term) { - $topic = db_fetch_object(db_query("SELECT n.nid, n.created AS timestamp, u.name AS name, u.uid AS uid FROM node n, term_node r LEFT JOIN users u ON n.uid = u.uid WHERE r.tid = '%d' AND n.nid = r.nid AND n.type = 'forum' AND n.status = 1 ORDER BY timestamp DESC LIMIT 1", $term)); + $topic = db_fetch_object(db_query("SELECT n.nid, n.created AS timestamp, u.name AS name, u.uid AS uid FROM node n, forum f LEFT JOIN users u ON n.uid = u.uid WHERE f.tid = '%d' AND n.nid = f.nid AND n.type = 'forum' AND n.status = 1 ORDER BY timestamp DESC LIMIT 1", $term)); - $reply = db_fetch_object(db_query("SELECT n.nid, c.timestamp, u.name AS name, u.uid AS uid FROM term_node r, node n LEFT JOIN comments c ON n.nid = c.nid LEFT JOIN users u ON c.uid = u.uid WHERE r.tid = '%d' AND n.nid = r.nid AND n.type = 'forum' AND n.status = 1 AND c.status = 0 ORDER BY c.timestamp DESC LIMIT 1", $term)); + $reply = db_fetch_object(db_query("SELECT n.nid, c.timestamp, u.name AS name, u.uid AS uid FROM forum f, node n LEFT JOIN comments c ON n.nid = c.nid LEFT JOIN users u ON c.uid = u.uid WHERE f.tid = '%d' AND n.nid = f.nid AND n.type = 'forum' AND n.status = 1 AND c.status = 0 ORDER BY c.timestamp DESC LIMIT 1", $term)); $value = ($topic->timestamp > $reply->timestamp) ? $topic : $reply; return $value; } -function forum_get_topics($tid, $sortby, $forum_per_page, $offset) { +function forum_get_topics($tid, $sortby, $forum_per_page) { global $user; $term = taxonomy_get_term($tid); @@ -413,63 +390,61 @@ function forum_get_topics($tid, $sortby, $forum_per_page, $offset) { $sql_sortby = _forum_get_topic_order($sortby); - $sql = "SELECT n.nid, title, users.name AS name, users.uid AS uid, n.created AS timestamp, GREATEST(n.created, MAX(c.timestamp)) AS date_sort, COUNT(c.nid) AS num_comments, icon, n.comment AS comment_mode, shadow FROM node n, term_node r LEFT JOIN users ON n.uid = users.uid LEFT JOIN comments c ON c.nid = n.nid LEFT JOIN forum f ON n.nid = f.nid WHERE n.nid = r.nid AND r.tid = '%d' AND n.status = 1 AND n.type = 'forum' GROUP BY n.nid ORDER BY $sql_sortby"; + // show topics with the correct tid, or in the forum but with shadow = 1 + $sql = "SELECT n.nid, title, u.name AS name, u.uid AS uid, n.created AS timestamp, GREATEST(n.created, MAX(c.timestamp)) AS date_sort, COUNT(c.nid) AS num_comments, icon, n.comment AS comment_mode, f.tid FROM node n, term_node r LEFT JOIN users u ON n.uid = u.uid LEFT JOIN comments c ON c.nid = n.nid LEFT JOIN forum f ON n.nid = f.nid WHERE n.nid = r.nid AND ( (r.tid = '".check_query($tid)."' AND f.shadow = 1) OR f.tid = '".check_query($tid)."' ) AND n.status = 1 AND n.type = 'forum' GROUP BY n.nid ORDER BY $sql_sortby"; - $result = db_query($sql, $tid); + $sql_count = "SELECT COUNT(DISTINCT(n.nid)) FROM node n, term_node r LEFT JOIN forum f ON n.nid = f.nid WHERE n.nid = r.nid AND ( (r.tid = '".check_query($tid)."' AND f.shadow = 1) OR f.tid = '".check_query($tid)."' ) AND n.status = 1 AND n.type = 'forum'"; + + $result = pager_query($sql, $forum_per_page, 0, $sql_count); $topic_num = db_num_rows($result); $n = 0; while ($topic = db_fetch_object($result)) { - if ($n < $offset) { - $n++; - continue; - } - - $history = _forum_user_last_visit($topic->nid); - // folder is new if topic is new or there are new comments since last visit - if ($topic->shadow > 0) { - $topic->new = 0; - } - else { - if (!$history && $user->uid) { - $topic->new_replies = 0; - $topic->new = 1; + if ($user->uid) { + $history = _forum_user_last_visit($topic->nid); + // folder is new if topic is new or there are new comments since last visit + if ($topic->shadow > 0) { + $topic->new = 0; } else { - $comments = db_result(db_query("SELECT COUNT(c.nid) FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$topic->nid' AND n.status = 1 AND c.status = 0 AND timestamp > '$history' GROUP BY n.nid")); - - $topic->new_replies = $comments ? $comments : 0; - if ($topic->new_replies) { + if (!$history && $user->uid) { + $topic->new_replies = 0; $topic->new = 1; } else { - $topic->new = 0; + $comments = db_result(db_query("SELECT COUNT(c.nid) FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$topic->nid' AND n.status = 1 AND c.status = 0 AND timestamp > '$history' GROUP BY n.nid")); + + $topic->new_replies = $comments ? $comments : 0; + if ($topic->new_replies) { + $topic->new = 1; + } + else { + $topic->new = 0; + } } } - } + } + else { + // you're not logged in eh? + $topic->new_replies = 0; + $topic->new = 0; + } $topic->last_reply = _forum_last_reply($topic->nid); $topics[] = $topic; - - $n++; - if ($n == ($forum_per_page + $offset)) { - break; - } } - return array($topics, $topic_num); + return $topics; } -function _forum_first_new($tid) { +function _forum_new($tid) { global $user; - $result = db_query("SELECT r.nid FROM node n, history h, term_node r WHERE n.type = 'forum' AND n.status = 1 AND h.nid = n.nid AND r.nid = h.nid AND r.tid = '%d' AND h.uid = '%d' ", $tid, $user->uid); + $result = db_query("SELECT n.nid FROM node n, history h, forum f WHERE n.type = 'forum' AND n.status = 1 AND h.nid = n.nid AND f.nid = h.nid AND f.tid = '%d' AND h.uid = '%d'", $tid, $user->uid); while ($r = db_fetch_object($result)) { $read[] = $r->nid; } - if ($read) { - $nid = db_result(db_query("SELECT r.nid AS c FROM node n LEFT JOIN term_node r ON r.nid = n.nid WHERE n.type = 'forum' AND n.status = 1 AND r.tid = '%d' AND NOT (r.nid IN (".implode(",", $read).")) ORDER BY created LIMIT 1", $tid)); - } + $nid = db_result(db_query("SELECT n.nid FROM node n, forum f WHERE n.type = 'forum' AND f.nid = n.nid AND n.status = 1 AND f.tid = '%d' ".($read ? "AND NOT (n.nid IN (".implode(",", $read).")) " : "") ."ORDER BY created LIMIT 1", $tid)); return $nid ? $nid : 0; } @@ -479,7 +454,7 @@ function _forum_message_taxonomy() { } function forum_page() { - global $theme, $sortby, $forum_per_page, $offset, $op, $user; + global $theme, $sortby, $forum_per_page, $from, $op, $user; if (user_access("access content")) { if (module_exist("taxonomy")) { @@ -489,6 +464,12 @@ function forum_page() { $user = user_save($user, array("sortby" => $sortby, "forum_per_page" => $forum_per_page)); } + if (arg(2) == "new") { + if ($nid = _forum_new($tid)) { + drupal_goto(url("node/view/$nid")); + } + } + if (empty($sortby)) { $sortby = isset($user->sortby) ? $user->sortby : variable_get("forum_order",1); } @@ -497,17 +478,15 @@ function forum_page() { $forum_per_page = isset($user->forum_per_page) ? $user->forum_per_page : variable_get("forum_per_page", 25); } - if (empty($offset)) { - $offset = 0; - } + $offset = ($from / $forum_per_page) + 1; $forums = forum_get_forums($tid); $parents = forum_get_parents($tid); if ($tid && !in_array($tid, variable_get("forum_containers", array()))) { - list($topics, $topic_num) = forum_get_topics($tid, $sortby, $forum_per_page, $offset); + $topics = forum_get_topics($tid, $sortby, $forum_per_page); } - theme_invoke("forum_render", $forums, $topics, $topic_num, $parents, $tid, $sortby, $forum_per_page, $offset); + theme_invoke("forum_render", $forums, $topics, $parents, $tid, $sortby, $forum_per_page, $offset); } else { $theme->header(); @@ -526,13 +505,13 @@ function forum_page() { ** Render functions. */ -function forum_render($forums, $topics, $topic_num, $parents, $tid, $sortby, $forum_per_page, $offset) { +function forum_render($forums, $topics, $parents, $tid, $sortby, $forum_per_page, $offset) { // forum list, topics list, topic browser and "add new topic" link global $theme; $output .= theme_invoke("forum_forum_list", $forums, $parents, $tid); if ($tid && !in_array($tid, variable_get("forum_containers", array()))) { - $output .= theme_invoke("forum_topic_list", $topics, $topic_num, $sortby, $forum_per_page, $offset); + $output .= theme_invoke("forum_topic_list", $tid, $topics, $sortby, $forum_per_page, $offset); } $theme->header(); @@ -578,7 +557,7 @@ function forum_forum_list($forums, $parents, $tid) { $links[] = l(t("the most recent topic"), "node/view/". $forum->last_post->nid); } if ($new_topics) { - $links[] = l(t("the first new topic"), "forum/$forum->tid#new"); + $links[] = l(t("the first new topic"), "forum/$forum->tid/new"); } if ($links) { @@ -624,10 +603,8 @@ function forum_topic_browser() { return form(form_item(t("Topic viewing options"), $output, t("Select your preferred way to display the topics and click 'Update settings'."))); } -function forum_topic_list($topics, $num_topics, $sortby, $forum_per_page, $offset) { - global $theme, $id, $status, $tid, $user; - - $output .= "

" .t("%a topics, %b topics per page, page %c of %d", array("%a" => $num_topics, "%b" => $forum_per_page, "%c" => ceil(($offset + 1)/$forum_per_page), "%d" => ceil($num_topics/$forum_per_page))) ."
"; +function forum_topic_list($tid, $topics, $sortby, $forum_per_page, $offset) { + global $theme, $id, $status, $user, $pager_total; if ($topics) { $output .= "\n"; @@ -635,13 +612,13 @@ function forum_topic_list($topics, $num_topics, $sortby, $forum_per_page, $offse foreach ($topics as $topic) { // folder is new if topic is new or there are new comments since last visit - if ($topic->shadow) { + if ($topic->tid != $tid) { $output .= " - + "; } else { @@ -660,28 +637,15 @@ function forum_topic_list($topics, $num_topics, $sortby, $forum_per_page, $offse $output .= "
"._forum_get_folder_icon($topic->new, $topic->num_comments, $topic->comment_mode)." "._forum_get_icon($topic)." $topic->title". l(t("This topic has been moved"), "forum/$topic->shadow")."". l(t("This topic has been moved"), "forum/$topic->tid")."
\n"; } $output .= "
"; - $output .= ""; - if ($offset > 0) { - $output .= ""; - } - else { - $output .= ""; - } + $output .= "
" .t("%a topics, %b topics per page, page %c of %d", array("%a" => $pager_total[0], "%b" => $forum_per_page, "%c" => $offset, "%d" => ceil($pager_total[0]/$forum_per_page))) ."
"; - if (user_access("create forum topics")) { - $output .= ""; - } + $output .= (($pager = pager_display(NULL, $forum_per_page, 0, "default")) ? "$pager" : ""); - if (count($topics) >= $forum_per_page) { - $output .= ""; - } - else { - $output .= ""; + if (user_access("create forum topics")) { + $output .= "
". l(t("create new forum topic"), "node/add/forum/$tid") ."
"; } - $output .= "
". l(t("previous topics"), array("mod" => "forum", "tid" => $tid, "offset" => ($offset-$forum_per_page))) ."
 
". l(t("create new forum topic"), array("mod" => "node", "op" => "add", "type" => "forum", "tid" => $tid)) ."
". l(t("next topics"), array("mod" => "forum", "tid" => $tid, "offset" => ($offset+$forum_per_page))) ."
 
"; - return $output; } diff --git a/modules/forum/forum.module b/modules/forum/forum.module index 605d8048f..92d91f6bf 100644 --- a/modules/forum/forum.module +++ b/modules/forum/forum.module @@ -59,14 +59,22 @@ function forum_conf_options() { return $output; } +function forum_taxonomy($op, $type, $object) { + if ($type == "vocabulary" && ($op == "insert" || $op == "update")) { + if (variable_get("forum_nav_vocabulary", "") == "" && in_array("forum", $object["types"])) { + // since none is already set, silently set this vocabulary as the navigation vocabulary + variable_set("forum_nav_vocabulary", $object["vid"]); + } + } +} + function forum_save($op, $node) { if ($op == "approve") { return array("status" => 1); } if ($op == "create") { - $moderation = array("body" => filter($node->body), "moderate" => 0, "status" => 1); - return array_merge($moderation, array("tid", "icon_num", "shadow")); + return array("body" => filter($node->body), "moderate" => 0, "status" => 1, "tid", "icon_num", "shadow" => 0); } if ($op == "decline") { @@ -74,20 +82,12 @@ function forum_save($op, $node) { } if ($op == "update") { - // if she changed the term, we could have to leave a shadow - $old_terms = explode(",", $node->old_container); - foreach ($node->taxonomy as $term) { - if ($term && (!in_array($term, $old_terms)) && $node->shadow) { - $shadow = $term; - break; - } - } - return array("body" => filter($node->body), "tid", "icon_num", "shadow" => $shadow, "old_container"); + return array("body" => filter($node->body), "tid", "icon_num", "shadow"); } } function forum_load($node) { - $forum = db_fetch_object(db_query("SELECT * FROM forum WHERE nid = '%d' AND shadow = 0", $node->nid)); + $forum = db_fetch_object(db_query("SELECT * FROM forum WHERE nid = '%d'", $node->nid)); return $forum; } @@ -102,7 +102,7 @@ function forum_block($op = "list", $delta = 0) { if (empty($cache)) { unset($items); - $content = node_title_list(db_query("SELECT n.nid, n.title, u.uid, u.name, GREATEST(n.created, MAX(c.timestamp)) AS sort FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid LEFT JOIN users u ON n.uid = u.uid WHERE n.type = 'forum' AND n.nid = f.nid AND f.shadow = 0 AND n.status = 1 GROUP BY n.nid ORDER BY sort DESC LIMIT ". variable_get("forum_block_num", "5")), t("Active forum topics:")); + $content = node_title_list(db_query("SELECT n.nid, n.title, u.uid, u.name, GREATEST(n.created, MAX(c.timestamp)) AS sort FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid LEFT JOIN users u ON n.uid = u.uid WHERE n.type = 'forum' AND n.nid = f.nid AND n.status = 1 GROUP BY n.nid ORDER BY sort DESC LIMIT ". variable_get("forum_block_num", "5")), t("Active forum topics:")); $content .= "
"; unset ($items); @@ -127,6 +127,7 @@ function forum_block($op = "list", $delta = 0) { } function forum_link($type, $node = 0, $main = 0) { + global $user; if ($type == "page" && user_access("access content")) { $links[] = l(t("forum"), "forum"); @@ -135,10 +136,7 @@ function forum_link($type, $node = 0, $main = 0) { if (!$main && $type == "node" && $node->type == "forum") { // get previous and next topic - $sql = "SELECT n.nid, title, body, GREATEST(n.created, MAX(c.timestamp)) AS date_sort, COUNT(c.nid) AS num_comments FROM node n, term_node t, forum f LEFT JOIN comments c ON c.nid = n.nid WHERE n.nid = t.nid AND n.nid = f.nid AND t.tid = '%d' AND f.shadow = 0 AND n.status = 1 GROUP BY n.nid ORDER BY ". _forum_get_topic_order(isset($user->sortby) ? $user->sortby : variable_get("forum_order",1)); - - $terms = array_keys(taxonomy_node_get_terms_by_vocabulary($node->nid, variable_get("forum_nav_vocabulary", ""))); - $result = db_query($sql, $terms[0]); + $result = db_query("SELECT n.nid, title, body, GREATEST(n.created, MAX(c.timestamp)) AS date_sort, COUNT(c.nid) AS num_comments FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid WHERE n.nid = f.nid AND f.tid = '%d' AND n.status = 1 GROUP BY n.nid ORDER BY ". _forum_get_topic_order(isset($user->sortby) ? $user->sortby : variable_get("forum_order",1)), $node->tid); while ($topic = db_fetch_object($result)) { if ($stop == 1) { @@ -179,16 +177,6 @@ function forum_view($node, $main = 0) { } $voc = taxonomy_get_vocabulary($term_data->vid); - /* TODO: find out what this code was ment to do and either use it or not. - - $output .= "

". _forum_get_icon($node) ." ". l($voc->name, "forum") ." : ". l($term_data->name, "forum/$term_data->tid"); - - $output .= " / $node->title
".t("%a by %b", array("%a" => format_date($node->created), "%b" => format_name($node)))."

". check_output($node->body) ."

"; - $output .= "

". $theme->links(link_node($node, $main)) ."

"; - - #$theme->box(t("Discussion forum"), $output); - */ - if (!$main) { $node->title = _forum_get_icon($node) ." ". l($voc->name, "forum") ." : ". l($term_data->name, "forum/$term_data->tid") ." / $node->title"; } @@ -196,27 +184,31 @@ function forum_view($node, $main = 0) { $theme->node($node, $main); } +function forum_validate($node) { + // we use the validate hook to remember the old taxonomy terms + $node->taxonomy = array_keys(taxonomy_node_get_terms($node->nid)); + if (!in_array($node->tid[0], $node->taxonomy)) { + $node->taxonomy[] = $node->tid[0]; + } + return $node; +} + function forum_form(&$node, &$help, &$error) { - global $tid; - if ($node->nid) { - if ($node->taxonomy) { - $tid = $node->taxonomy; - } - else { - // editing: load category from taxonomy - $tid = implode(",", array_keys(taxonomy_node_get_terms($node->nid))); - } - //$output .= implode("

", taxonomy_node_form("forum", $node)); - $output .= "nid)))."\">"; - $output .= form_checkbox(t("Leave shadow copy"), "shadow", 1, $node->shadow, t("If you move this topic, you can leave a link in the old forum to the new forum.")); + if ($node->tid) { + // editing + $tid = $node->tid; } else { - if ($node->taxonomy) { - $tid = $node->taxonomy; - } + // new topic + $tid = arg(3); } - $output .= _taxonomy_term_select("Forum", "taxonomy", $tid, variable_get("forum_nav_vocabulary", ""), "", 0, "", variable_get("forum_containers", array())); + $output .= _taxonomy_term_select("Forum", "tid", $tid, variable_get("forum_nav_vocabulary", ""), "", 0, "", variable_get("forum_containers", array())); + + if ($node->nid) { + // if editing, give option to leave shadows + $output .= form_checkbox(t("Leave shadow copy"), "shadow", 1, $node->shadow, t("If you move this topic, you can leave a link in the old forum to the new forum.")); + } if ($icon_path = variable_get("forum_topic_icon_path", "")) { if ($node->icon) { @@ -253,26 +245,12 @@ function forum_form(&$node, &$help, &$error) { function forum_insert($node) { $node->icon = _forum_decode_icon($node); - if (!$node->shadow) { - db_query("INSERT INTO forum (nid, icon) VALUES ('%d', '%s')", $node->nid, $node->icon); - } - else { - // we created a shadow, a link to a moved topic in a new forum - db_query("INSERT INTO forum (nid, icon, shadow) VALUES ('%d', '%s', '%d')", $node->nid, $node->icon, $node->shadow); - } + db_query("INSERT INTO forum (nid, icon, shadow, tid) VALUES ('%d', '%s', '%d', '%d')", $node->nid, $node->icon, $node->shadow, $node->tid); } function forum_update($node) { $node->icon = _forum_decode_icon($node); - db_query("UPDATE forum SET icon = '%s' WHERE nid = '%d'", $node->icon, $node->nid); - if ($node->shadow) { - // insert in old forum a new topic, with link to new forum - $node->nid = ""; - $node->type = "forum"; - $node->status = 1; - $node->taxonomy = array($node->old_container); - node_submit($node); - } + db_query("UPDATE forum SET icon = '%s', shadow = '%d', tid = '%d' WHERE nid = '%d'", $node->icon, $node->shadow, $node->tid[0], $node->nid); } function _forum_decode_icon($node) { @@ -358,7 +336,6 @@ function forum_get_forums($tid = 0) { } } } - return $forums; } @@ -376,17 +353,17 @@ function forum_get_parents($tid) { } function _forum_num_topics($term) { - $value = db_fetch_object(db_query("SELECT COUNT(n.nid) AS count FROM node n, term_node r, forum f WHERE r.tid = '%d' AND n.nid = r.nid AND n.nid = f.nid AND n.status = 1 AND n.type = 'forum' AND f.shadow = 0", $term)); + $value = db_fetch_object(db_query("SELECT COUNT(n.nid) AS count FROM node n, forum f WHERE f.tid = '%d' AND n.nid = f.nid AND n.status = 1 AND n.type = 'forum'", $term)); return ($value) ? $value->count : 0; } function _forum_num_replies($term) { - $value = db_fetch_object(db_query("SELECT COUNT(*) AS count FROM comments c, term_node r, node n WHERE r.tid = '%d' AND n.nid = r.nid AND n.nid = c.nid AND n.status = 1 AND c.status = 0 AND n.type = 'forum'", $term)); + $value = db_fetch_object(db_query("SELECT COUNT(*) AS count FROM comments c, node n, forum f WHERE f.tid = '%d' AND n.nid = f.nid AND n.nid = c.nid AND n.status = 1 AND c.status = 0 AND n.type = 'forum'", $term)); return ($value) ? $value->count : 0; } function _forum_topics_read($uid) { - $result = db_query("SELECT tid, count(*) AS c FROM history h, term_node r, node n, forum f WHERE f.nid = r.nid AND r.nid = h.nid AND n.nid = h.nid AND f.shadow = 0 AND n.type = 'forum' AND n.status = 1 AND h.uid = '%d' GROUP BY tid", $uid); + $result = db_query("SELECT tid, count(*) AS c FROM history h, node n, forum f WHERE f.nid = n.nid AND n.nid = h.nid AND n.type = 'forum' AND n.status = 1 AND h.uid = '%d' GROUP BY tid", $uid); while ($obj = db_fetch_object($result)) { $topics_read[$obj->tid] = $obj->c; @@ -396,16 +373,16 @@ function _forum_topics_read($uid) { } function _forum_last_post($term) { - $topic = db_fetch_object(db_query("SELECT n.nid, n.created AS timestamp, u.name AS name, u.uid AS uid FROM node n, term_node r LEFT JOIN users u ON n.uid = u.uid WHERE r.tid = '%d' AND n.nid = r.nid AND n.type = 'forum' AND n.status = 1 ORDER BY timestamp DESC LIMIT 1", $term)); + $topic = db_fetch_object(db_query("SELECT n.nid, n.created AS timestamp, u.name AS name, u.uid AS uid FROM node n, forum f LEFT JOIN users u ON n.uid = u.uid WHERE f.tid = '%d' AND n.nid = f.nid AND n.type = 'forum' AND n.status = 1 ORDER BY timestamp DESC LIMIT 1", $term)); - $reply = db_fetch_object(db_query("SELECT n.nid, c.timestamp, u.name AS name, u.uid AS uid FROM term_node r, node n LEFT JOIN comments c ON n.nid = c.nid LEFT JOIN users u ON c.uid = u.uid WHERE r.tid = '%d' AND n.nid = r.nid AND n.type = 'forum' AND n.status = 1 AND c.status = 0 ORDER BY c.timestamp DESC LIMIT 1", $term)); + $reply = db_fetch_object(db_query("SELECT n.nid, c.timestamp, u.name AS name, u.uid AS uid FROM forum f, node n LEFT JOIN comments c ON n.nid = c.nid LEFT JOIN users u ON c.uid = u.uid WHERE f.tid = '%d' AND n.nid = f.nid AND n.type = 'forum' AND n.status = 1 AND c.status = 0 ORDER BY c.timestamp DESC LIMIT 1", $term)); $value = ($topic->timestamp > $reply->timestamp) ? $topic : $reply; return $value; } -function forum_get_topics($tid, $sortby, $forum_per_page, $offset) { +function forum_get_topics($tid, $sortby, $forum_per_page) { global $user; $term = taxonomy_get_term($tid); @@ -413,63 +390,61 @@ function forum_get_topics($tid, $sortby, $forum_per_page, $offset) { $sql_sortby = _forum_get_topic_order($sortby); - $sql = "SELECT n.nid, title, users.name AS name, users.uid AS uid, n.created AS timestamp, GREATEST(n.created, MAX(c.timestamp)) AS date_sort, COUNT(c.nid) AS num_comments, icon, n.comment AS comment_mode, shadow FROM node n, term_node r LEFT JOIN users ON n.uid = users.uid LEFT JOIN comments c ON c.nid = n.nid LEFT JOIN forum f ON n.nid = f.nid WHERE n.nid = r.nid AND r.tid = '%d' AND n.status = 1 AND n.type = 'forum' GROUP BY n.nid ORDER BY $sql_sortby"; + // show topics with the correct tid, or in the forum but with shadow = 1 + $sql = "SELECT n.nid, title, u.name AS name, u.uid AS uid, n.created AS timestamp, GREATEST(n.created, MAX(c.timestamp)) AS date_sort, COUNT(c.nid) AS num_comments, icon, n.comment AS comment_mode, f.tid FROM node n, term_node r LEFT JOIN users u ON n.uid = u.uid LEFT JOIN comments c ON c.nid = n.nid LEFT JOIN forum f ON n.nid = f.nid WHERE n.nid = r.nid AND ( (r.tid = '".check_query($tid)."' AND f.shadow = 1) OR f.tid = '".check_query($tid)."' ) AND n.status = 1 AND n.type = 'forum' GROUP BY n.nid ORDER BY $sql_sortby"; - $result = db_query($sql, $tid); + $sql_count = "SELECT COUNT(DISTINCT(n.nid)) FROM node n, term_node r LEFT JOIN forum f ON n.nid = f.nid WHERE n.nid = r.nid AND ( (r.tid = '".check_query($tid)."' AND f.shadow = 1) OR f.tid = '".check_query($tid)."' ) AND n.status = 1 AND n.type = 'forum'"; + + $result = pager_query($sql, $forum_per_page, 0, $sql_count); $topic_num = db_num_rows($result); $n = 0; while ($topic = db_fetch_object($result)) { - if ($n < $offset) { - $n++; - continue; - } - - $history = _forum_user_last_visit($topic->nid); - // folder is new if topic is new or there are new comments since last visit - if ($topic->shadow > 0) { - $topic->new = 0; - } - else { - if (!$history && $user->uid) { - $topic->new_replies = 0; - $topic->new = 1; + if ($user->uid) { + $history = _forum_user_last_visit($topic->nid); + // folder is new if topic is new or there are new comments since last visit + if ($topic->shadow > 0) { + $topic->new = 0; } else { - $comments = db_result(db_query("SELECT COUNT(c.nid) FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$topic->nid' AND n.status = 1 AND c.status = 0 AND timestamp > '$history' GROUP BY n.nid")); - - $topic->new_replies = $comments ? $comments : 0; - if ($topic->new_replies) { + if (!$history && $user->uid) { + $topic->new_replies = 0; $topic->new = 1; } else { - $topic->new = 0; + $comments = db_result(db_query("SELECT COUNT(c.nid) FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$topic->nid' AND n.status = 1 AND c.status = 0 AND timestamp > '$history' GROUP BY n.nid")); + + $topic->new_replies = $comments ? $comments : 0; + if ($topic->new_replies) { + $topic->new = 1; + } + else { + $topic->new = 0; + } } } - } + } + else { + // you're not logged in eh? + $topic->new_replies = 0; + $topic->new = 0; + } $topic->last_reply = _forum_last_reply($topic->nid); $topics[] = $topic; - - $n++; - if ($n == ($forum_per_page + $offset)) { - break; - } } - return array($topics, $topic_num); + return $topics; } -function _forum_first_new($tid) { +function _forum_new($tid) { global $user; - $result = db_query("SELECT r.nid FROM node n, history h, term_node r WHERE n.type = 'forum' AND n.status = 1 AND h.nid = n.nid AND r.nid = h.nid AND r.tid = '%d' AND h.uid = '%d' ", $tid, $user->uid); + $result = db_query("SELECT n.nid FROM node n, history h, forum f WHERE n.type = 'forum' AND n.status = 1 AND h.nid = n.nid AND f.nid = h.nid AND f.tid = '%d' AND h.uid = '%d'", $tid, $user->uid); while ($r = db_fetch_object($result)) { $read[] = $r->nid; } - if ($read) { - $nid = db_result(db_query("SELECT r.nid AS c FROM node n LEFT JOIN term_node r ON r.nid = n.nid WHERE n.type = 'forum' AND n.status = 1 AND r.tid = '%d' AND NOT (r.nid IN (".implode(",", $read).")) ORDER BY created LIMIT 1", $tid)); - } + $nid = db_result(db_query("SELECT n.nid FROM node n, forum f WHERE n.type = 'forum' AND f.nid = n.nid AND n.status = 1 AND f.tid = '%d' ".($read ? "AND NOT (n.nid IN (".implode(",", $read).")) " : "") ."ORDER BY created LIMIT 1", $tid)); return $nid ? $nid : 0; } @@ -479,7 +454,7 @@ function _forum_message_taxonomy() { } function forum_page() { - global $theme, $sortby, $forum_per_page, $offset, $op, $user; + global $theme, $sortby, $forum_per_page, $from, $op, $user; if (user_access("access content")) { if (module_exist("taxonomy")) { @@ -489,6 +464,12 @@ function forum_page() { $user = user_save($user, array("sortby" => $sortby, "forum_per_page" => $forum_per_page)); } + if (arg(2) == "new") { + if ($nid = _forum_new($tid)) { + drupal_goto(url("node/view/$nid")); + } + } + if (empty($sortby)) { $sortby = isset($user->sortby) ? $user->sortby : variable_get("forum_order",1); } @@ -497,17 +478,15 @@ function forum_page() { $forum_per_page = isset($user->forum_per_page) ? $user->forum_per_page : variable_get("forum_per_page", 25); } - if (empty($offset)) { - $offset = 0; - } + $offset = ($from / $forum_per_page) + 1; $forums = forum_get_forums($tid); $parents = forum_get_parents($tid); if ($tid && !in_array($tid, variable_get("forum_containers", array()))) { - list($topics, $topic_num) = forum_get_topics($tid, $sortby, $forum_per_page, $offset); + $topics = forum_get_topics($tid, $sortby, $forum_per_page); } - theme_invoke("forum_render", $forums, $topics, $topic_num, $parents, $tid, $sortby, $forum_per_page, $offset); + theme_invoke("forum_render", $forums, $topics, $parents, $tid, $sortby, $forum_per_page, $offset); } else { $theme->header(); @@ -526,13 +505,13 @@ function forum_page() { ** Render functions. */ -function forum_render($forums, $topics, $topic_num, $parents, $tid, $sortby, $forum_per_page, $offset) { +function forum_render($forums, $topics, $parents, $tid, $sortby, $forum_per_page, $offset) { // forum list, topics list, topic browser and "add new topic" link global $theme; $output .= theme_invoke("forum_forum_list", $forums, $parents, $tid); if ($tid && !in_array($tid, variable_get("forum_containers", array()))) { - $output .= theme_invoke("forum_topic_list", $topics, $topic_num, $sortby, $forum_per_page, $offset); + $output .= theme_invoke("forum_topic_list", $tid, $topics, $sortby, $forum_per_page, $offset); } $theme->header(); @@ -578,7 +557,7 @@ function forum_forum_list($forums, $parents, $tid) { $links[] = l(t("the most recent topic"), "node/view/". $forum->last_post->nid); } if ($new_topics) { - $links[] = l(t("the first new topic"), "forum/$forum->tid#new"); + $links[] = l(t("the first new topic"), "forum/$forum->tid/new"); } if ($links) { @@ -624,10 +603,8 @@ function forum_topic_browser() { return form(form_item(t("Topic viewing options"), $output, t("Select your preferred way to display the topics and click 'Update settings'."))); } -function forum_topic_list($topics, $num_topics, $sortby, $forum_per_page, $offset) { - global $theme, $id, $status, $tid, $user; - - $output .= "

" .t("%a topics, %b topics per page, page %c of %d", array("%a" => $num_topics, "%b" => $forum_per_page, "%c" => ceil(($offset + 1)/$forum_per_page), "%d" => ceil($num_topics/$forum_per_page))) ."
"; +function forum_topic_list($tid, $topics, $sortby, $forum_per_page, $offset) { + global $theme, $id, $status, $user, $pager_total; if ($topics) { $output .= "\n"; @@ -635,13 +612,13 @@ function forum_topic_list($topics, $num_topics, $sortby, $forum_per_page, $offse foreach ($topics as $topic) { // folder is new if topic is new or there are new comments since last visit - if ($topic->shadow) { + if ($topic->tid != $tid) { $output .= " - + "; } else { @@ -660,28 +637,15 @@ function forum_topic_list($topics, $num_topics, $sortby, $forum_per_page, $offse $output .= "
"._forum_get_folder_icon($topic->new, $topic->num_comments, $topic->comment_mode)." "._forum_get_icon($topic)." $topic->title". l(t("This topic has been moved"), "forum/$topic->shadow")."". l(t("This topic has been moved"), "forum/$topic->tid")."
\n"; } $output .= "
"; - $output .= ""; - if ($offset > 0) { - $output .= ""; - } - else { - $output .= ""; - } + $output .= "
" .t("%a topics, %b topics per page, page %c of %d", array("%a" => $pager_total[0], "%b" => $forum_per_page, "%c" => $offset, "%d" => ceil($pager_total[0]/$forum_per_page))) ."
"; - if (user_access("create forum topics")) { - $output .= ""; - } + $output .= (($pager = pager_display(NULL, $forum_per_page, 0, "default")) ? "$pager" : ""); - if (count($topics) >= $forum_per_page) { - $output .= ""; - } - else { - $output .= ""; + if (user_access("create forum topics")) { + $output .= "
". l(t("create new forum topic"), "node/add/forum/$tid") ."
"; } - $output .= "
". l(t("previous topics"), array("mod" => "forum", "tid" => $tid, "offset" => ($offset-$forum_per_page))) ."
 
". l(t("create new forum topic"), array("mod" => "node", "op" => "add", "type" => "forum", "tid" => $tid)) ."
". l(t("next topics"), array("mod" => "forum", "tid" => $tid, "offset" => ($offset+$forum_per_page))) ."
 
"; - return $output; } diff --git a/update.php b/update.php index 6b7eb5712..7918d7387 100644 --- a/update.php +++ b/update.php @@ -62,7 +62,8 @@ $mysql_updates = array( "2002-12-22" => "update_47", "2002-12-29" => "update_48", "2003-01-03" => "update_49", - "2003-01-05" => "update_50" + "2003-01-05" => "update_50", + "2003-01-15" => "update_51" ); // Update functions @@ -673,6 +674,15 @@ function update_50() { update_content("%node.php%"); } +function update_51() { + update_sql("ALTER TABLE form ADD tid INT UNSIGNED NOT NULL"); + $result = db_queryd("SELECT n.nid, t.tid FROM node n, term_node t WHERE n.nid = t.nid AND type = 'forum'"); + while ($node = db_fetch_object($result)) { + db_queryd("UPDATE forum SET tid = '%d' WHERE nid = '%d'", $node->tid, $node->nid); + } + update_sql("ALTER TABLE forum ADD INDEX (tid)"); +} + function update_upgrade3() { update_sql("INSERT INTO system VALUES ('archive.module','archive','module','',1)"); update_sql("INSERT INTO system VALUES ('block.module','block','module','',1)"); -- cgit v1.2.3