diff --git a/mod/forum/index.php b/mod/forum/index.php index 400ed8feab3..a32a7a66f06 100644 --- a/mod/forum/index.php +++ b/mod/forum/index.php @@ -132,7 +132,7 @@ } if (!forum_is_forcesubscribed($forum)) { $subscribed = forum_is_subscribed($USER->id, $forum); - if ($subscribe && !$subscribed && $cansub) { + if ((has_capability('moodle/course:manageactivities', $coursecontext, $USER->id) || $forum->forcesubscribe != FORUM_DISALLOWSUBSCRIBE) && $subscribe && !$subscribed && $cansub) { forum_subscribe($USER->id, $forumid); } else if (!$subscribe && $subscribed) { forum_unsubscribe($USER->id, $forumid); diff --git a/mod/forum/lib.php b/mod/forum/lib.php index b18af5f9ae0..59ea5326048 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -4065,31 +4065,52 @@ function forum_unsubscribe($userid, $forumid) { * Given a new post, subscribes or unsubscribes as appropriate. * Returns some text which describes what happened. */ -function forum_post_subscription($post) { +function forum_post_subscription($post, $forum) { global $USER; - - $subscribed=forum_is_subscribed($USER->id, $post->forum); - if ((isset($post->subscribe) && $post->subscribe && $subscribed) - || (!$post->subscribe && !$subscribed)) { + + $action = ''; + $subscribed = forum_is_subscribed($USER->id, $forum); + + if ($forum->forcesubscribe == FORUM_FORCESUBSCRIBE) { // database ignored return ""; - } - if (!$forum = get_record("forum", "id", $post->forum)) { - return ""; + } elseif (($forum->forcesubscribe == FORUM_DISALLOWSUBSCRIBE) + && !has_capability('moodle/course:manageactivities', $coursecontext, $USER->id)) { + if ($subscribed) { + $action = 'unsubscribe'; // sanity check, following MDL-14558 + } else { + return ""; + } + + } else { // go with the user's choice + if (isset($post->subscribe)) { + // no change + if ((!empty($post->subscribe) && $subscribed) + || (empty($post->subscribe) && !$subscribed)) { + return ""; + + } elseif (!empty($post->subscribe) && !$subscribed) { + $action = 'subscribe'; + + } elseif (empty($post->subscribe) && $subscribed) { + $action = 'unsubscribe'; + } + } } $info = new object(); $info->name = fullname($USER); $info->forum = format_string($forum->name); - if (!empty($post->subscribe)) { - forum_subscribe($USER->id, $post->forum); - return "
".get_string("nowsubscribed", "forum", $info)."
"; + switch ($action) { + case 'subscribe': + forum_subscribe($USER->id, $post->forum); + return "".get_string("nowsubscribed", "forum", $info)."
"; + case 'unsubscribe': + forum_unsubscribe($USER->id, $post->forum); + return "".get_string("nownotsubscribed", "forum", $info)."
"; } - - forum_unsubscribe($USER->id, $post->forum); - return "".get_string("nownotsubscribed", "forum", $info)."
"; } /** diff --git a/mod/forum/post.php b/mod/forum/post.php index 6476d757292..3a2eeb7b9e4 100644 --- a/mod/forum/post.php +++ b/mod/forum/post.php @@ -501,7 +501,7 @@ } $message .= ''.get_string("postaddedtimeleft", "forum", format_time($CFG->maxeditingtime)) . '
'; } - if ($subscribemessage = forum_post_subscription($discussion)) { + if ($subscribemessage = forum_post_subscription($discussion, $forum)) { $timemessage = 4; }