--- forum.module 2004/03/11 05:33:18 1.4 +++ forum.module 2004/03/11 06:33:39 @@ -275,7 +275,7 @@ if ($user->uid && $forums) { foreach (_forum_topics_read($user->uid) as $tid => $old) { if ($forums[$tid]) { - $forums[$tid]->old_topics = $old; + $forums[$tid]->old_topics = count($old); } } } @@ -305,14 +305,27 @@ return ($value) ? $value->count : 0; } -function _forum_topics_read($uid) { - $result = db_query("SELECT tid, count(*) AS c FROM {history} h INNER JOIN {node} n ON n.nid = h.nid INNER JOIN {forum} f ON n.nid = f.nid 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); +function _forum_topics_read($uid, $tid = 0) { + $query = "SELECT tid, n.nid FROM {history} h INNER JOIN {node} n ON n.nid = h.nid INNER JOIN {forum} f ON n.nid = f.nid WHERE f.nid = n.nid AND n.nid = h.nid AND n.type = 'forum' AND n.status = 1 AND h.uid = $uid"; + if ($tid) { + $query .= " AND f.tid = $tid"; + } + + $result = db_query($query); + + while ($obj = db_fetch_object($result)) { + $topics_read[$obj->tid][$obj->nid] = 1; + } + $result = db_query("SELECT tid, c.nid FROM {comments} c LEFT JOIN {comments_history} h ON h.uid = %d AND c.cid >= h.min_cid AND c.cid <= h.max_cid INNER JOIN {forum} f ON c.nid = f.nid WHERE c.status = 0 AND h.min_cid IS NULL GROUP BY tid, nid", $uid); while ($obj = db_fetch_object($result)) { - $topics_read[$obj->tid] = $obj->c; + unset($topics_read[$obj->tid][$obj->nid]); + if (count($topics_read[$obj->tid]) == 0) { + unset($topics_read[$obj->tid]); + } } - return $topics_read ? $topics_read : array(); + return $topics_read; } function _forum_last_post($term) { @@ -397,16 +410,13 @@ function _forum_new($tid, $exclude = 0) { global $user; - $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; - } + $read = _forum_topics_read($user->uid, $tid); - if ($exclude != 0) { - $read[] = $exclude; + if ($exclude) { + $read[$tid][$exclude] = 1; } - $nid = db_result(db_query_range("SELECT n.nid FROM {node} n INNER JOIN {forum} f ON n.nid = f.nid 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", $tid, 0, 1)); + $nid = db_result(db_query_range("SELECT n.nid FROM {node} n INNER JOIN {forum} f ON n.nid = f.nid WHERE n.type = 'forum' AND f.nid = n.nid AND n.status = 1 AND f.tid = %d ". ($read ? "AND NOT (n.nid IN (". implode(",", array_keys($read[$tid])) .")) " : "") ."ORDER BY created", $tid, 0, 1)); return $nid ? $nid : 0; }