From 9197e1472f741faa51a9e8a8be9e4271af0a0760 Mon Sep 17 00:00:00 2001 From: moodler Date: Sun, 11 Jan 2004 17:46:57 +0000 Subject: [PATCH] First version of support in groups in the forums. Still needs plenty of testing. There is no GUI yet for turning on the groupmode just for the forum (this will be on the course page) but you can put a 1 (visible) or 2 (separate) in the course_modules table. --- mod/forum/discuss.php | 21 +++++++++++ mod/forum/lib.php | 47 ++++++++++++++++++++----- mod/forum/version.php | 2 +- mod/forum/view.php | 82 ++++++++++++++++++++++++++++++++----------- 4 files changed, 122 insertions(+), 30 deletions(-) diff --git a/mod/forum/discuss.php b/mod/forum/discuss.php index 60cf79ef42..b1b3cd15f0 100644 --- a/mod/forum/discuss.php +++ b/mod/forum/discuss.php @@ -92,6 +92,27 @@ "$navmiddle -> $navtail", "", "", true, $searchform, navmenu($course, $cm)); } +/// Check to see if groups are being used in this forum +/// If so, make sure the current person is allowed to see this discussion + + $groupmode = groupmode($course, $cm); + + if ($groupmode == SEPARATEGROUPS and !isteacheredit($course->id)) { // Groups must be kept separate + require_login(); + if (!$toppost = get_record("forum_posts", "id", $discussion->firstpost)) { + error("Could not find the top post of the discussion"); + } + if (!$group = user_group($course->id, $toppost->userid)) { // Find the topic's group + error("Could not find the appropriate group of this discussion"); + } + if (mygroupid($course->id) != $group->id) { + print_heading("Sorry, you can't see this discussion because you are not in this group"); + print_footer(); + die; + } + } + + echo "
 "; forum_print_mode_form($discussion->id, $displaymode); echo ""; diff --git a/mod/forum/lib.php b/mod/forum/lib.php index edffc746a5..ffbce94b20 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -237,11 +237,29 @@ function forum_cron () { continue; } + $groupmode = false; + if ($cm = get_coursemodule_from_instance("forum", $forum->id, $course->id)) { + if ($groupmode = groupmode($course, $cm)) { // Groups are being used + if (!$group = user_group($course->id, $userfrom->id)) { // If user not in a group + continue; // Be safe and don't send it to anyone + } + } + } + + if ($users = forum_subscribed_users($course, $forum)) { $canunsubscribe = ! forum_is_forcesubscribed($forum->id); $mailcount=0; foreach ($users as $userto) { + if ($groupmode) { // Look for a reason not to send this email + if (!isteacheredit($course->id, $userto->id)) { + if (!ismember($group->id, $userto->id)) { + continue; + } + } + } + /// Override the language and timezone of the "current" user, so that /// mail is customised for the receiver. $USER->lang = $userto->lang; @@ -820,7 +838,8 @@ function forum_count_unrated_posts($discussionid, $userid) { } } -function forum_get_discussions($forum="0", $forumsort="d.timemodified DESC", $user=0, $fullpost=true) { +function forum_get_discussions($forum="0", $forumsort="d.timemodified DESC", + $user=0, $fullpost=true, $currentgroup=0) { /// Get all discussions in a forum global $CFG; @@ -837,14 +856,22 @@ function forum_get_discussions($forum="0", $forumsort="d.timemodified DESC", $us } else { $postdata = "p.*"; } + if ($currentgroup) { + $grouptable = ", {$CFG->prefix}groups_members gm "; + $groupselect = " AND gm.groupid = '$currentgroup' AND u.id = gm.userid "; + } else { + $grouptable = ""; + $groupselect = ""; + } + return get_records_sql("SELECT $postdata, d.timemodified, u.firstname, u.lastname, u.email, u.picture FROM {$CFG->prefix}forum_discussions d, - {$CFG->prefix}forum_posts p, - {$CFG->prefix}user u + {$CFG->prefix}forum_posts p, + {$CFG->prefix}user u $grouptable WHERE d.forum = '$forum' AND p.discussion = d.id AND p.parent = 0 - AND p.userid = u.id $userselect + AND p.userid = u.id $groupselect $userselect ORDER BY $forumsort"); } @@ -1923,7 +1950,7 @@ function forum_user_has_posted_discussion($forumid, $userid) { } } -function forum_user_can_post_discussion($forum) { +function forum_user_can_post_discussion($forum, $currentgroup=false) { // $forum is an object global $USER; @@ -1931,6 +1958,8 @@ function forum_user_can_post_discussion($forum) { return (! forum_user_has_posted_discussion($forum->id, $USER->id)); } else if ($forum->type == "teacher") { return isteacher($forum->course); + } else if ($currentgroup) { + return (isteacheredit($forum->course) or ismember($currentgroup)); } else if (isteacher($forum->course)) { return true; } else { @@ -1957,7 +1986,9 @@ function forum_user_can_post($forum, $user=NULL) { } -function forum_print_latest_discussions($forum_id=0, $forum_numdiscussions=5, $forum_style="plain", $forum_sort="") { +function forum_print_latest_discussions($forum_id=0, $forum_numdiscussions=5, + $forum_style="plain", $forum_sort="", + $currentgroup=0) { global $CFG, $USER; if ($forum_id) { @@ -1981,7 +2012,7 @@ function forum_print_latest_discussions($forum_id=0, $forum_numdiscussions=5, $f } } - if (forum_user_can_post_discussion($forum)) { + if (forum_user_can_post_discussion($forum, $currentgroup)) { echo "

"; echo "wwwroot/mod/forum/post.php?forum=$forum->id\">"; if ($forum->type == "news") { @@ -2005,7 +2036,7 @@ function forum_print_latest_discussions($forum_id=0, $forum_numdiscussions=5, $f $fullpost = true; } - if (! $discussions = forum_get_discussions($forum->id, $forum_sort, 0, $fullpost) ) { + if (! $discussions = forum_get_discussions($forum->id, $forum_sort, 0, $fullpost, $currentgroup) ) { if ($forum->type == "news") { echo "

(".get_string("nonews", "forum").")

"; } else { diff --git a/mod/forum/version.php b/mod/forum/version.php index af0a26b036..8f90df7474 100644 --- a/mod/forum/version.php +++ b/mod/forum/version.php @@ -5,7 +5,7 @@ // This fragment is called by /admin/index.php //////////////////////////////////////////////////////////////////////////////// -$module->version = 2004010100; +$module->version = 2004010500; $module->cron = 60; ?> diff --git a/mod/forum/view.php b/mod/forum/view.php index 154c8b0615..e30f7ff462 100644 --- a/mod/forum/view.php +++ b/mod/forum/view.php @@ -8,6 +8,7 @@ optional_variable($mode); // Display mode (for single forum) optional_variable($search, ""); // search string optional_variable($showall, ""); // show all discussions on one page + optional_variable($group, ""); // choose the current group $strforums = get_string("modulenameplural", "forum"); $strforum = get_string("modulename", "forum"); @@ -68,12 +69,50 @@ notice(get_string("activityiscurrentlyhidden")); } + +/// Check to see if groups are being used in this forum +/// and if so, set $currentgroup to reflect the current group + + $groupmode = groupmode($course, $cm); // Groups are being used + $currentgroup = get_and_set_current_group($course, $groupmode, $_GET['group']); + + if ($groupmode and !$currentgroup) { + print_heading("Sorry, but you need to be part of a group to see this forum."); + print_footer(); + exit; + } + + +/// Print settings and things in a table across the top + + echo ''; + + if ($groupmode == VISIBLEGROUPS or ($groupmode and isteacheredit($course->id))) { + if ($groups = get_records_menu("groups", "courseid", $course->id, "name ASC", "id,name")) { + echo ''; + } + } + + if ($USER) { + echo ''; } + echo '
'; + + echo '
'; + if ($groupmode == VISIBLEGROUPS) { + print_string('groupsvisible'); + } else { + print_string('groupsseparate'); + } + echo ':'; + echo ''; + popup_form("view.php?id=$cm->id&group=", $groups, 'selectgroup', $currentgroup, "", "", "", false, "self"); + echo '
'; + + echo '
'; $SESSION->fromdiscussion = "$FULLME"; if (forum_is_forcesubscribed($forum->id)) { $streveryoneissubscribed = get_string("everyoneissubscribed", "forum"); $strallowchoice = get_string("allowchoice", "forum"); - echo "
"; helpbutton("subscription", $streveryoneissubscribed, "forum"); echo ""; if (isteacher($course->id)) { @@ -81,25 +120,24 @@ } else { echo $streveryoneissubscribed; } - echo "
"; + echo ""; } else { $streveryonecanchoose = get_string("everyonecanchoose", "forum"); $strforcesubscribe = get_string("forcesubscribe", "forum"); $strshowsubscribers = get_string("showsubscribers", "forum"); - echo "
"; helpbutton("subscription", $streveryonecanchoose, "forum"); echo ""; if (isteacher($course->id)) { echo "id&force=yes\">$streveryonecanchoose"; - echo "
"; + echo "
"; echo "id\">$strshowsubscribers"; } else { echo $streveryonecanchoose; } - echo "
"; + echo ""; if (forum_is_subscribed($USER->id, $forum->id)) { $subtexttitle = get_string("subscribestop", "forum"); @@ -108,15 +146,17 @@ $subtexttitle = get_string("subscribestart", "forum"); $subtext = get_string("subscribe", "forum"); } - echo "
"; + echo "
"; echo "id\">$subtext"; - echo "
"; } + echo '
'; + switch ($forum->type) { - case "single": + case 'single': if (! $discussion = get_record("forum_discussions", "forum", $forum->id)) { if ($discussions = get_records("forum_discussions", "forum", $forum->id, "timemodified ASC")) { notify("Warning! There is more than one discussion in this forum - using the most recent"); @@ -132,41 +172,41 @@ forum_print_discussion($course, $forum, $discussion, $post, $USER->mode); break; - case "eachuser": + case 'eachuser': if (!empty($forum->intro)) { print_simple_box(text_to_html($forum->intro), "center"); } - echo "

"; + echo '

'; if (forum_user_can_post_discussion($forum)) { print_string("allowsdiscussions", "forum"); } else { - echo " "; + echo ' '; } - echo "

"; + echo '

'; if (!empty($showall)) { - forum_print_latest_discussions($forum->id, 0, "header"); + forum_print_latest_discussions($forum->id, 0, 'header', '', $currentgroup); } else { - forum_print_latest_discussions($forum->id, $CFG->forum_manydiscussions, "header"); + forum_print_latest_discussions($forum->id, $CFG->forum_manydiscussions, 'header', '', $currentgroup); } break; - case "teacher": + case 'teacher': if (!empty($showall)) { - forum_print_latest_discussions($forum->id, 0, "header"); + forum_print_latest_discussions($forum->id, 0, 'header', '', $currentgroup); } else { - forum_print_latest_discussions($forum->id, $CFG->forum_manydiscussions, "header"); + forum_print_latest_discussions($forum->id, $CFG->forum_manydiscussions, 'header', '', $currentgroup); } break; default: if (!empty($forum->intro)) { - print_simple_box(text_to_html($forum->intro), "center"); + print_simple_box(text_to_html($forum->intro), 'center'); } - echo "

 

"; + echo '

 

'; if (!empty($showall)) { - forum_print_latest_discussions($forum->id, 0, "header"); + forum_print_latest_discussions($forum->id, 0, 'header', '', $currentgroup); } else { - forum_print_latest_discussions($forum->id, $CFG->forum_manydiscussions, "header"); + forum_print_latest_discussions($forum->id, $CFG->forum_manydiscussions, 'header', '', $currentgroup); } break; } -- 2.39.5