moodle/mod/forum/discuss.php
moodler f37da85054 MAJOR NEW FEATURE: Tracking of read/unread posts
Many thanks to Mike Churchward for his work on this and persevering
with sending updated versions to me.  :-)

Shane and I have polished it up, rewritten a few parts (display-related)
and here it is, finally in CVS!

I think there will still need to be some optimisation for the SQL,
since it's still pretty intensive. Perhaps some sort of caching in
the session that gets modified along with the database whenever
something gets read.

However if there are problems the whole thing can be switched off
in the forum module config so this is not crucially urgent.
2005-01-29 09:49:42 +00:00

214 lines
7.8 KiB
PHP

<?php // $Id$
// Displays a post, and all the posts below it.
// If no post is given, displays all posts in a discussion
require_once("../../config.php");
require_once("lib.php");
require_variable($d); // Discussion ID
optional_variable($parent); // If set, then display this post and all children.
optional_variable($mode); // If set, changes the layout of the thread
optional_variable($move); // If set, moves this discussion to another forum
optional_variable($mark); // Used for tracking read posts if user initiated.
optional_variable($postid); // Used for tracking read posts if user initiated.
if (! $discussion = get_record("forum_discussions", "id", $d)) {
error("Discussion ID was incorrect or no longer exists");
}
if (! $course = get_record("course", "id", $discussion->course)) {
error("Course ID is incorrect - discussion is faulty");
}
if ($CFG->forcelogin) {
require_login();
}
if ($course->category) {
require_login($course->id);
}
if (!empty($move)) {
if (!isteacher($course->id)) {
error("Only teachers can do that!");
}
if ($forum = get_record("forum", "id", $move)) {
if (!forum_move_attachments($discussion, $move)) {
notify("Errors occurred while moving attachment directories - check your file permissions");
}
set_field("forum_discussions", "forum", $forum->id, "id", $discussion->id);
$discussion->forum = $forum->id;
if ($cm = get_coursemodule_from_instance("forum", $forum->id, $course->id)) {
add_to_log($course->id, "forum", "move discussion", "discuss.php?d=$discussion->id", "$discussion->id",
$cm->id);
} else {
add_to_log($course->id, "forum", "move discussion", "discuss.php?d=$discussion->id", "$discussion->id");
}
$discussionmoved = true;
} else {
error("You can't move to that forum - it doesn't exist!");
}
}
if (empty($forum)) {
if (! $forum = get_record("forum", "id", $discussion->forum)) {
notify("Bad forum ID stored in this discussion");
}
}
if ($forum->type == "teacher") {
if (!isteacher($course->id)) {
error("You must be a $course->teacher to view this forum");
}
}
$logparameters = "d=$discussion->id";
if ($parent) {
$logparameters .= "&amp;parent=$parent";
}
if ($cm = get_coursemodule_from_instance("forum", $forum->id, $course->id)) {
add_to_log($course->id, "forum", "view discussion", "discuss.php?$logparameters", "$discussion->id", $cm->id);
} else {
add_to_log($course->id, "forum", "view discussion", "discuss.php?$logparameters", "$discussion->id");
}
unset($SESSION->fromdiscussion);
if ($mode) {
set_user_preference("forum_displaymode", $mode);
}
$displaymode = get_user_preferences("forum_displaymode", $CFG->forum_displaymode);
if ($parent) {
if (abs($displaymode) == 1) { // If flat AND parent, then force nested display this time
$displaymode = 3;
}
} else {
$parent = $discussion->firstpost;
$navtail = "$discussion->name";
}
if (! $post = forum_get_post_full($parent)) {
error("Discussion no longer exists", "$CFG->wwwroot/mod/forum/view.php?f=$forum->id");
}
if ($CFG->forum_trackreadposts && $CFG->forum_usermarksread) {
if ($mark == 'read') {
forum_tp_add_read_record($USER->id, $postid, $discussion->id, $forum->id);
} else if ($mark == 'unread') {
forum_tp_delete_read_records($USER->id, $postid);
}
}
if (empty($navtail)) {
$navtail = "<a href=\"discuss.php?d=$discussion->id\">$discussion->name</a> -> $post->subject";
}
$navmiddle = "<a href=\"../forum/index.php?id=$course->id\">".get_string("forums", "forum")."</a> -> <a href=\"../forum/view.php?f=$forum->id\">$forum->name</a>";
$searchform = forum_print_search_form($course, "", true, "plain");
if ($course->category) {
print_header("$course->shortname: $discussion->name", "$course->fullname",
"<a href=\"../../course/view.php?id=$course->id\">$course->shortname</a> ->
$navmiddle -> $navtail", "", "", true, $searchform, navmenu($course, $cm));
} else {
print_header("$course->shortname: $discussion->name", "$course->fullname",
"$navmiddle -> $navtail", "", "", true, $searchform, navmenu($course, $cm));
}
echo '<div id="forum-discuss" class="forum">'; // forum-discuss wrapper start
/// Check to see if groups are being used in this forum
/// If so, make sure the current person is allowed to see this discussion
/// Also, if we know they should be able to reply, then explicitly set $canreply
$canreply = NULL; /// No override one way or the other
if ($forum->type == "teacher") {
$groupmode = NOGROUPS;
} else {
$groupmode = groupmode($course, $cm);
}
if ($groupmode and !isteacheredit($course->id)) { // Groups must be kept separate
if ($groupmode == SEPARATEGROUPS) {
require_login();
if (mygroupid($course->id) == $discussion->groupid) {
$canreply = true;
} elseif ($discussion->groupid == -1) {
$canreply = false;
} else {
print_heading("Sorry, you can't see this discussion because you are not in this group");
print_footer();
die;
}
} else if ($groupmode == VISIBLEGROUPS) {
$canreply = (mygroupid($course->id) == $discussion->groupid);
}
}
/// Print the controls across the top
echo "<table width=\"100%\"><tr><td width=\"33%\">";
if ($groupmode == VISIBLEGROUPS or ($groupmode and isteacheredit($course->id))) {
if ($groups = get_records_menu("groups", "courseid", $course->id, "name ASC", "id,name")) {
print_group_menu($groups, $groupmode, $discussion->groupid, "view.php?id=$cm->id&amp;group=");
}
}
echo "</td><td width=\"33%\">";
forum_print_mode_form($discussion->id, $displaymode);
echo "</td><td width=\"33%\">";
if (isteacher($course->id)) { // Popup menu to allow discussions to be moved to other forums
if ($forums = get_all_instances_in_course("forum", $course)) {
if ($course->format == 'weeks') {
$strsection = get_string("week");
} else {
$strsection = get_string("topic");
}
$section = -1;
foreach ($forums as $courseforum) {
if (!empty($courseforum->section) and $section != $courseforum->section) {
$forummenu[] = "-------------- $strsection $courseforum->section --------------";
}
$section = $courseforum->section;
if ($courseforum->id != $forum->id) {
$url = "discuss.php?d=$discussion->id&amp;move=$courseforum->id";
$forummenu[$url] = $courseforum->name;
}
}
if (!empty($forummenu)) {
echo "<div align=\"right\">";
echo popup_form("$CFG->wwwroot/mod/forum/", $forummenu, "forummenu", "",
get_string("movethisdiscussionto", "forum"), "", "", true);
echo "</div>";
}
}
}
echo "</td></tr></table>";
if (isset($discussionmoved)) {
notify(get_string("discussionmoved", "forum", $forum->name));
}
/// Print the actual discussion
forum_print_discussion($course, $forum, $discussion, $post, $displaymode, $canreply);
echo '</div>'; // forum-discuss wrapper end
print_footer($course);
?>