/// 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
+/// Also, if we know they should be able to reply, then explicitly set $canreply for performance reasons
- if ($forum->type == 'news') {
- $capname = 'mod/forum:replynews';
- } else {
- $capname = 'mod/forum:replypost';
- }
-
- $canreply = false;
if (isguestuser() or !isloggedin() or has_capability('moodle/legacy:guest', $modcontext, NULL, false)) {
// allow guests and not-logged-in to see the link - they are prompted to log in after clicking the link
$canreply = ($forum->type != 'news'); // no reply in news forums
- } else if (has_capability($capname, $modcontext)) {
- $groupmode = groups_get_activity_groupmode($cm);
- if ($groupmode) {
- if (has_capability('moodle/site:accessallgroups', $modcontext)) {
- $canreply = true;
- } else {
- if ($groupmode == SEPARATEGROUPS) {
- require_login();
- if ($discussion->groupid == -1) {
- // can not reply to discussions for "All participants" in separate mode without accessallgroups cap
- } else if (groups_is_member($discussion->groupid)) {
- $canreply = true;
- } else {
- // this should not happen
- print_heading("Sorry, you can't see this discussion because you are not in this group");
- print_footer($course);
- die;
- }
-
- } else if ($groupmode == VISIBLEGROUPS) {
- if ($discussion->groupid == -1 or groups_is_member($discussion->groupid)) {
- $canreply = true;
- }
- }
- }
- } else {
- $canreply = true;
- }
+ } else {
+ $canreply = forum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext);
}
/// Print the controls across the top
$modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
$userto->viewfullnames[$forum->id] = has_capability('moodle/site:viewfullnames', $modcontext);
}
- if (!isset($userto->canpost[$forum->id])) {
+ if (!isset($userto->canpost[$discussion->id])) {
$modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
- $userto->canpost[$forum->id] = forum_user_can_post($forum, $userto, $cm, $modcontext);
+ $userto->canpost[$discussion->id] = forum_user_can_post($forum, $discussion, $userto, $cm, $course, $modcontext);
}
if (!isset($userfrom->groups[$forum->id])) {
if (!isset($userfrom->groups)) {
$modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
$userto->viewfullnames[$forum->id] = has_capability('moodle/site:viewfullnames', $modcontext);
}
- if (!isset($userto->canpost[$forum->id])) {
+ if (!isset($userto->canpost[$discussion->id])) {
$modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
- $userto->canpost[$forum->id] = forum_user_can_post($forum, $userto, $cm, $modcontext);
+ $userto->canpost[$discussion->id] = forum_user_can_post($forum, $discussion, $userto, $cm, $course, $modcontext);
}
$strforums = get_string('forums', 'forum');
$canunsubscribe = ! forum_is_forcesubscribed($forum);
- $canreply = $userto->canpost[$forum->id];
+ $canreply = $userto->canpost[$discussion->id];
$posttext .= "\n \n";
$posttext .= '=====================================================================';
$viewfullnames = $userto->viewfullnames[$forum->id];
}
- if (!isset($userto->canpost[$forum->id])) {
- $canreply = forum_user_can_post($forum, $userto);
+ if (!isset($userto->canpost[$discussion->id])) {
+ $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
+ $canreply = forum_user_can_post($forum, $discussion, $userto, $cm, $course, $modcontext);
} else {
- $canreply = $userto->canpost[$forum->id];
+ $canreply = $userto->canpost[$discussion->id];
}
$by = New stdClass;
return '';
}
- if (!isset($userto->canpost[$forum->id])) {
- $canreply = forum_user_can_post($forum, $userto);
+ if (!isset($userto->canpost[$discussion->id])) {
+ $canreply = forum_user_can_post($forum, $discussion, $userto);
} else {
- $canreply = $userto->canpost[$forum->id];
+ $canreply = $userto->canpost[$discussion->id];
}
$strforums = get_string('forums', 'forum');
* @param $forum - forum object
* @param $user - user object
*/
-function forum_user_can_post($forum, $user=NULL, $cm=NULL, $context=NULL) {
+function forum_user_can_post($forum, $discussion, $user=NULL, $cm=NULL, $course=NULL, $context=NULL) {
global $USER;
if (empty($user)) {
$user = $USER;
return false;
}
- if (!$context) {
- if (!$cm) {
- debugging('missing cm', DEBUG_DEVELOPER);
- if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course)) {
- error('Course Module ID was incorrect');
- }
+ if (!isset($discussion->groupid)) {
+ debugging('incorrect discussion parameter', DEBUG_DEVELOPER);
+ return false;
+ }
+
+ if (!$cm) {
+ debugging('missing cm', DEBUG_DEVELOPER);
+ if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course)) {
+ error('Course Module ID was incorrect');
+ }
+ }
+
+ if (!$course) {
+ debugging('missing course', DEBUG_DEVELOPER);
+ if (!$course = get_record('course', 'id', $forum->course)) {
+ error('Incorrect course id');
}
+ }
+
+ if (!$context) {
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
}
$capname = 'mod/forum:replypost';
}
- return has_capability($capname, $context, $user->id, false);
+ if (!has_capability($capname, $context, $user->id, false)) {
+ return false;
+ }
+
+ if (!$groupmode = groups_get_activity_groupmode($cm, $course)) {
+ return true;
+ }
+
+ if (has_capability('moodle/site:accessallgroups', $context)) {
+ return true;
+ }
+
+ if ($groupmode == VISIBLEGROUPS) {
+ if ($discussion->groupid == -1) {
+ // allow students to reply to all participants discussions - this was not possible in Moodle <1.8
+ return true;
+ }
+ return groups_is_member($discussion->groupid);
+
+ } else {
+ //separate groups
+ if ($discussion->groupid == -1) {
+ return false;
+ }
+ return groups_is_member($discussion->groupid);
+ }
}
}
}
- $canreply = forum_user_can_post($forum, null, $cm, $context);
$canviewparticipants = has_capability('moodle/course:viewparticipants',$context);
$strdatestring = get_string('strftimerecentfull');
$canviewparticipants, $context);
break;
default:
- if ($canreply or $discussion->replies) {
+ $link = false;
+
+ if ($discussion->replies) {
$link = true;
} else {
- $link = false;
+ $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
+ $link = forum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext);
}
$discussion->forum = $forum->id;
$ownpost = false;
}
if ($canreply === NULL) {
- $reply = forum_user_can_post($forum, null, $cm);
+ $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
+ $reply = forum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext);
} else {
$reply = $canreply;
}