MDL-46654 mod_forum: Remove irrelevant digest/subscribe options

If the user cannot subscribe, there is no point showing the digest options.
This commit is contained in:
Andrew Nicols
2016-08-22 19:12:20 +08:00
parent d6c05ad1f1
commit 8381ac52cd
3 changed files with 212 additions and 88 deletions
+2 -1
View File
@@ -164,7 +164,8 @@ class subscriptions {
* @return bool
*/
public static function is_subscribable($forum) {
return (!\mod_forum\subscriptions::is_forcesubscribed($forum) &&
return (isloggedin() && !isguestuser() &&
!\mod_forum\subscriptions::is_forcesubscribed($forum) &&
!\mod_forum\subscriptions::subscription_disabled($forum));
}
+108 -87
View File
@@ -29,7 +29,7 @@ require_once($CFG->libdir . '/rsslib.php');
$id = optional_param('id', 0, PARAM_INT); // Course id
$subscribe = optional_param('subscribe', null, PARAM_INT); // Subscribe/Unsubscribe all forums
$url = new moodle_url('/mod/forum/index.php', array('id'=>$id));
$url = new moodle_url('/mod/forum/index.php', array('id' => $id));
if ($subscribe !== null) {
require_sesskey();
$url->param('subscribe', $subscribe);
@@ -37,7 +37,7 @@ if ($subscribe !== null) {
$PAGE->set_url($url);
if ($id) {
if (! $course = $DB->get_record('course', array('id' => $id))) {
if (!$course = $DB->get_record('course', array('id' => $id))) {
print_error('invalidcourseid');
}
} else {
@@ -96,34 +96,6 @@ if ($usetracking = forum_tp_can_track_forums()) {
// Fill the subscription cache for this course and user combination.
\mod_forum\subscriptions::fill_subscription_cache_for_course($course->id, $USER->id);
$can_subscribe = is_enrolled($coursecontext);
if ($can_subscribe) {
$generaltable->head[] = $strsubscribed;
$generaltable->align[] = 'center';
$generaltable->head[] = $stremaildigest . ' ' . $OUTPUT->help_icon('emaildigesttype', 'mod_forum');
$generaltable->align[] = 'center';
// Retrieve the list of forum digest options for later.
$digestoptions = forum_get_user_digest_options();
$digestoptions_selector = new single_select(new moodle_url('/mod/forum/maildigest.php',
array(
'backtoindex' => 1,
)),
'maildigest',
$digestoptions,
null,
'');
$digestoptions_selector->method = 'post';
}
if ($show_rss = (($can_subscribe || $course->id == SITEID) &&
isset($CFG->enablerssfeeds) && isset($CFG->forum_enablerssfeeds) &&
$CFG->enablerssfeeds && $CFG->forum_enablerssfeeds)) {
$generaltable->head[] = $strrss;
$generaltable->align[] = 'center';
}
$usesections = course_format_uses_sections($course->format);
$table = new html_table();
@@ -143,8 +115,9 @@ $forums = $DB->get_records_sql("
$generalforums = array();
$learningforums = array();
$modinfo = get_fast_modinfo($course);
$showsubscriptioncolumns = false;
foreach ($modinfo->get_instances_of('forum') as $forumid=>$cm) {
foreach ($modinfo->get_instances_of('forum') as $forumid => $cm) {
if (!$cm->uservisible or !isset($forums[$forumid])) {
continue;
}
@@ -152,14 +125,23 @@ foreach ($modinfo->get_instances_of('forum') as $forumid=>$cm) {
$forum = $forums[$forumid];
if (!$context = context_module::instance($cm->id, IGNORE_MISSING)) {
continue; // Shouldn't happen
}
if (!has_capability('mod/forum:viewdiscussion', $context)) {
// Shouldn't happen.
continue;
}
// fill two type array - order in modinfo is the same as in course
if (!has_capability('mod/forum:viewdiscussion', $context)) {
// User can't view this one - skip it.
continue;
}
// Determine whether subscription options should be displayed.
$forum->cansubscribe = mod_forum\subscriptions::is_subscribable($forum);
$forum->cansubscribe = $forum->cansubscribe || has_capability('mod/forum:managesubscriptions', $context);
$forum->issubscribed = mod_forum\subscriptions::is_subscribed($USER->id, $forum, null, $cm);
$showsubscriptioncolumns = $showsubscriptioncolumns || $forum->issubscribed || $forum->cansubscribe;
// Fill two type array - order in modinfo is the same as in course.
if ($forum->type == 'news' or $forum->type == 'social') {
$generalforums[$forum->id] = $forum;
@@ -171,9 +153,62 @@ foreach ($modinfo->get_instances_of('forum') as $forumid=>$cm) {
}
}
if ($showsubscriptioncolumns) {
// The user can subscribe to at least one forum.
$generaltable->head[] = $strsubscribed;
$generaltable->align[] = 'center';
$generaltable->head[] = $stremaildigest . ' ' . $OUTPUT->help_icon('emaildigesttype', 'mod_forum');
$generaltable->align[] = 'center';
// Retrieve the list of forum digest options for later.
$digestoptions = forum_get_user_digest_options();
$digestoptionsselector = new single_select(new moodle_url('/mod/forum/maildigest.php',
array(
'backtoindex' => 1,
)),
'maildigest',
$digestoptions,
null,
'');
$digestoptionsselector->method = 'post';
$forumsubscriptionhelper = function($forum, $row, $context) use ($digestoptionsselector, $stryes, $strno) {
global $OUTPUT;
$row[] = forum_get_subscribe_link($forum, $context, array('subscribed' => $stryes,
'unsubscribed' => $strno, 'forcesubscribed' => $stryes,
'cantsubscribe' => '-'), false, false, true);
$digestoptionsselector->url->param('id', $forum->id);
if ($forum->maildigest === null) {
$digestoptionsselector->selected = -1;
} else {
$digestoptionsselector->selected = $forum->maildigest;
}
if ($forum->cansubscribe || $forum->issubscribed) {
$row[] = $OUTPUT->render($digestoptionsselector);
} else {
// This user can subscribe to some forums. Add the empty fields.
$row[] = '';
}
return $row;
};
}
if ($show_rss = (($showsubscriptioncolumns || $course->id == SITEID) &&
isset($CFG->enablerssfeeds) && isset($CFG->forum_enablerssfeeds) &&
$CFG->enablerssfeeds && $CFG->forum_enablerssfeeds)) {
$generaltable->head[] = $strrss;
$generaltable->align[] = 'center';
}
// Do course wide subscribe/unsubscribe if requested
if (!is_null($subscribe)) {
if (isguestuser() or !$can_subscribe) {
if (isguestuser() or !$showsubscriptioncolumns) {
// There should not be any links leading to this place, just redirect.
redirect(
new moodle_url('/mod/forum/index.php', array('id' => $id)),
@@ -183,7 +218,7 @@ if (!is_null($subscribe)) {
);
}
// Can proceed now, the user is not guest and is enrolled
foreach ($modinfo->get_instances_of('forum') as $forumid=>$cm) {
foreach ($modinfo->get_instances_of('forum') as $forumid => $cm) {
$forum = $forums[$forumid];
$modcontext = context_module::instance($cm->id);
$cansub = false;
@@ -225,9 +260,8 @@ if (!is_null($subscribe)) {
}
}
/// First, let's process the general forums and build up a display
if ($generalforums) {
// Process general forums.
foreach ($generalforums as $forum) {
$cm = $modinfo->instances['forum'][$forum->id];
$context = context_module::instance($cm->id);
@@ -260,9 +294,9 @@ if ($generalforums) {
'sesskey' => sesskey(),
));
if (!isset($untracked[$forum->id])) {
$trackedlink = $OUTPUT->single_button($aurl, $stryes, 'post', array('title'=>$strnotrackforum));
$trackedlink = $OUTPUT->single_button($aurl, $stryes, 'post', array('title' => $strnotrackforum));
} else {
$trackedlink = $OUTPUT->single_button($aurl, $strno, 'post', array('title'=>$strtrackforum));
$trackedlink = $OUTPUT->single_button($aurl, $strno, 'post', array('title' => $strtrackforum));
}
}
}
@@ -285,21 +319,11 @@ if ($generalforums) {
$row[] = $trackedlink; // Tracking.
}
if ($can_subscribe) {
$row[] = forum_get_subscribe_link($forum, $context, array('subscribed' => $stryes,
'unsubscribed' => $strno, 'forcesubscribed' => $stryes,
'cantsubscribe' => '-'), false, false, true);
$digestoptions_selector->url->param('id', $forum->id);
if ($forum->maildigest === null) {
$digestoptions_selector->selected = -1;
} else {
$digestoptions_selector->selected = $forum->maildigest;
}
$row[] = $OUTPUT->render($digestoptions_selector);
if ($showsubscriptioncolumns) {
$row = $forumsubscriptionhelper($forum, $row, $context);
}
//If this forum has RSS activated, calculate it
// If this forum has RSS activated, calculate it.
if ($show_rss) {
if ($forum->rsstype and $forum->rssarticles) {
//Calculate the tooltip text
@@ -339,7 +363,7 @@ if ($usetracking) {
$learningtable->align[] = 'center';
}
if ($can_subscribe) {
if ($showsubscriptioncolumns) {
$learningtable->head[] = $strsubscribed;
$learningtable->align[] = 'center';
@@ -347,15 +371,14 @@ if ($can_subscribe) {
$learningtable->align[] = 'center';
}
if ($show_rss = (($can_subscribe || $course->id == SITEID) &&
if ($show_rss = (($showsubscriptioncolumns || $course->id == SITEID) &&
isset($CFG->enablerssfeeds) && isset($CFG->forum_enablerssfeeds) &&
$CFG->enablerssfeeds && $CFG->forum_enablerssfeeds)) {
$learningtable->head[] = $strrss;
$learningtable->align[] = 'center';
}
/// Now let's process the learning forums
// Now let's process the learning forums.
if ($course->id != SITEID) { // Only real courses have learning forums
// 'format_.'$course->format only applicable when not SITEID (format_site is not a format)
$strsectionname = get_string('sectionname', 'format_'.$course->format);
@@ -393,11 +416,11 @@ if ($course->id != SITEID) { // Only real courses have learning forums
} else if ($forum->trackingtype === FORUM_TRACKING_OFF || ($USER->trackforums == 0)) {
$trackedlink = '-';
} else {
$aurl = new moodle_url('/mod/forum/settracking.php', array('id'=>$forum->id));
$aurl = new moodle_url('/mod/forum/settracking.php', array('id' => $forum->id));
if (!isset($untracked[$forum->id])) {
$trackedlink = $OUTPUT->single_button($aurl, $stryes, 'post', array('title'=>$strnotrackforum));
$trackedlink = $OUTPUT->single_button($aurl, $stryes, 'post', array('title' => $strnotrackforum));
} else {
$trackedlink = $OUTPUT->single_button($aurl, $strno, 'post', array('title'=>$strtrackforum));
$trackedlink = $OUTPUT->single_button($aurl, $strno, 'post', array('title' => $strtrackforum));
}
}
}
@@ -431,18 +454,8 @@ if ($course->id != SITEID) { // Only real courses have learning forums
$row[] = $trackedlink; // Tracking.
}
if ($can_subscribe) {
$row[] = forum_get_subscribe_link($forum, $context, array('subscribed' => $stryes,
'unsubscribed' => $strno, 'forcesubscribed' => $stryes,
'cantsubscribe' => '-'), false, false, true);
$digestoptions_selector->url->param('id', $forum->id);
if ($forum->maildigest === null) {
$digestoptions_selector->selected = -1;
} else {
$digestoptions_selector->selected = $forum->maildigest;
}
$row[] = $OUTPUT->render($digestoptions_selector);
if ($showsubscriptioncolumns) {
$row = $forumsubscriptionhelper($forum, $row, $context);
}
//If this forum has RSS activated, calculate it
@@ -466,25 +479,34 @@ if ($course->id != SITEID) { // Only real courses have learning forums
}
}
/// Output the page
// Output the page.
$PAGE->navbar->add($strforums);
$PAGE->set_title("$course->shortname: $strforums");
$PAGE->set_heading($course->fullname);
$PAGE->set_button($searchform);
echo $OUTPUT->header();
// Show the subscribe all options only to non-guest, enrolled users
if (!isguestuser() && isloggedin() && $can_subscribe) {
if (!isguestuser() && isloggedin() && $showsubscriptioncolumns) {
// Show the subscribe all options only to non-guest, enrolled users.
echo $OUTPUT->box_start('subscription');
echo html_writer::tag('div',
html_writer::link(new moodle_url('/mod/forum/index.php', array('id'=>$course->id, 'subscribe'=>1, 'sesskey'=>sesskey())),
get_string('allsubscribe', 'forum')),
array('class'=>'helplink'));
echo html_writer::tag('div',
html_writer::link(new moodle_url('/mod/forum/index.php', array('id'=>$course->id, 'subscribe'=>0, 'sesskey'=>sesskey())),
get_string('allunsubscribe', 'forum')),
array('class'=>'helplink'));
$subscriptionlink = new moodle_url('/mod/forum/index.php', [
'id' => $course->id,
'sesskey' => sesskey(),
]);
// Subscribe all.
$subscriptionlink->param('subscribe', 1);
echo html_writer::tag('div', html_writer::link($subscriptionlink, get_string('allsubscribe', 'forum')), [
'class' => 'helplink',
]);
// Unsubscribe all.
$subscriptionlink->param('subscribe', 0);
echo html_writer::tag('div', html_writer::link($subscriptionlink, get_string('allunsubscribe', 'forum')), [
'class' => 'helplink',
]);
echo $OUTPUT->box_end();
echo $OUTPUT->box(' ', 'clearer');
}
@@ -500,4 +522,3 @@ if ($learningforums) {
}
echo $OUTPUT->footer();
+102
View File
@@ -106,6 +106,12 @@ class mod_forum_subscriptions_testcase extends advanced_testcase {
$options = array('course' => $course->id);
$forum = $this->getDataGenerator()->create_module('forum', $options);
// Create a user enrolled in the course as a student.
list($user) = $this->helper_create_users($course, 1);
// Must be logged in as the current user.
$this->setUser($user);
\mod_forum\subscriptions::set_subscription_mode($forum->id, FORUM_FORCESUBSCRIBE);
$forum = $DB->get_record('forum', array('id' => $forum->id));
$this->assertEquals(FORUM_FORCESUBSCRIBE, \mod_forum\subscriptions::get_subscription_mode($forum));
@@ -1318,4 +1324,100 @@ class mod_forum_subscriptions_testcase extends advanced_testcase {
$this->assertGreaterThan($suppliedcmcount, $calculatedcmcount);
}
public function is_subscribable_forums() {
return [
[
'forcesubscribe' => FORUM_DISALLOWSUBSCRIBE,
],
[
'forcesubscribe' => FORUM_CHOOSESUBSCRIBE,
],
[
'forcesubscribe' => FORUM_INITIALSUBSCRIBE,
],
[
'forcesubscribe' => FORUM_FORCESUBSCRIBE,
],
];
}
public function is_subscribable_provider() {
$data = [];
foreach ($this->is_subscribable_forums() as $forum) {
$data[] = [$forum];
}
return $data;
}
/**
* @dataProvider is_subscribable_provider
*/
public function test_is_subscribable_logged_out($options) {
$this->resetAfterTest(true);
// Create a course, with a forum.
$course = $this->getDataGenerator()->create_course();
$options['course'] = $course->id;
$forum = $this->getDataGenerator()->create_module('forum', $options);
$this->assertFalse(\mod_forum\subscriptions::is_subscribable($forum));
}
/**
* @dataProvider is_subscribable_provider
*/
public function test_is_subscribable_is_guest($options) {
global $DB;
$this->resetAfterTest(true);
$guest = $DB->get_record('user', array('username'=>'guest'));
$this->setUser($guest);
// Create a course, with a forum.
$course = $this->getDataGenerator()->create_course();
$options['course'] = $course->id;
$forum = $this->getDataGenerator()->create_module('forum', $options);
$this->assertFalse(\mod_forum\subscriptions::is_subscribable($forum));
}
public function is_subscribable_loggedin_provider() {
return [
[
['forcesubscribe' => FORUM_DISALLOWSUBSCRIBE],
false,
],
[
['forcesubscribe' => FORUM_CHOOSESUBSCRIBE],
true,
],
[
['forcesubscribe' => FORUM_INITIALSUBSCRIBE],
true,
],
[
['forcesubscribe' => FORUM_FORCESUBSCRIBE],
false,
],
];
}
/**
* @dataProvider is_subscribable_loggedin_provider
*/
public function test_is_subscribable_loggedin($options, $expect) {
$this->resetAfterTest(true);
// Create a course, with a forum.
$course = $this->getDataGenerator()->create_course();
$options['course'] = $course->id;
$forum = $this->getDataGenerator()->create_module('forum', $options);
$user = $this->getDataGenerator()->create_user();
$this->getDataGenerator()->enrol_user($user->id, $course->id);
$this->setUser($user);
$this->assertEquals($expect, \mod_forum\subscriptions::is_subscribable($forum));
}
}