Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402] [Versions 400 and 402]
1 <?php 2 3 // This file is part of Moodle - http://moodle.org/ 4 // 5 // Moodle is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // Moodle is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 17 18 /** 19 * @package mod_forum 20 * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com} 21 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 22 */ 23 24 require_once(__DIR__ . '/../../config.php'); 25 require_once($CFG->dirroot . '/course/lib.php'); 26 require_once($CFG->dirroot . '/mod/forum/lib.php'); 27 require_once($CFG->libdir . '/rsslib.php'); 28 29 $id = optional_param('id', 0, PARAM_INT); // Course id 30 $subscribe = optional_param('subscribe', null, PARAM_INT); // Subscribe/Unsubscribe all forums 31 32 $url = new moodle_url('/mod/forum/index.php', array('id' => $id)); 33 if ($subscribe !== null) { 34 require_sesskey(); 35 $url->param('subscribe', $subscribe); 36 } 37 $PAGE->set_url($url); 38 $PAGE->set_secondary_active_tab('coursehome'); 39 40 if ($id) { 41 if (!$course = $DB->get_record('course', array('id' => $id))) { 42 throw new \moodle_exception('invalidcourseid'); 43 } 44 } else { 45 $course = get_site(); 46 } 47 48 require_course_login($course); 49 $PAGE->set_pagelayout('incourse'); 50 $coursecontext = context_course::instance($course->id); 51 52 unset($SESSION->fromdiscussion); 53 54 $params = array( 55 'context' => context_course::instance($course->id) 56 ); 57 $event = \mod_forum\event\course_module_instance_list_viewed::create($params); 58 $event->add_record_snapshot('course', $course); 59 $event->trigger(); 60 61 $strforums = get_string('forums', 'forum'); 62 $strforum = get_string('forum', 'forum'); 63 $strdescription = get_string('description'); 64 $strdiscussions = get_string('discussions', 'forum'); 65 $strsubscribed = get_string('subscribed', 'forum'); 66 $strunreadposts = get_string('unreadposts', 'forum'); 67 $strtracking = get_string('tracking', 'forum'); 68 $strmarkallread = get_string('markallread', 'forum'); 69 $strtrackforum = get_string('trackforum', 'forum'); 70 $strnotrackforum = get_string('notrackforum', 'forum'); 71 $strsubscribe = get_string('subscribe', 'forum'); 72 $strunsubscribe = get_string('unsubscribe', 'forum'); 73 $stryes = get_string('yes'); 74 $strno = get_string('no'); 75 $strrss = get_string('rss'); 76 $stremaildigest = get_string('emaildigest'); 77 78 $searchform = forum_search_form($course); 79 80 // Start of the table for General Forums. 81 $generaltable = new html_table(); 82 $generaltable->head = array ($strforum, $strdescription, $strdiscussions); 83 $generaltable->align = array ('left', 'left', 'center'); 84 85 if ($usetracking = forum_tp_can_track_forums()) { 86 $untracked = forum_tp_get_untracked_forums($USER->id, $course->id); 87 88 $generaltable->head[] = $strunreadposts; 89 $generaltable->align[] = 'center'; 90 91 $generaltable->head[] = $strtracking; 92 $generaltable->align[] = 'center'; 93 } 94 95 // Fill the subscription cache for this course and user combination. 96 \mod_forum\subscriptions::fill_subscription_cache_for_course($course->id, $USER->id); 97 98 $usesections = course_format_uses_sections($course->format); 99 100 $table = new html_table(); 101 102 // Parse and organise all the forums. Most forums are course modules but 103 // some special ones are not. These get placed in the general forums 104 // category with the forums in section 0. 105 106 $forums = $DB->get_records_sql(" 107 SELECT f.*, 108 d.maildigest 109 FROM {forum} f 110 LEFT JOIN {forum_digests} d ON d.forum = f.id AND d.userid = ? 111 WHERE f.course = ? 112 ", array($USER->id, $course->id)); 113 114 $generalforums = array(); 115 $learningforums = array(); 116 $modinfo = get_fast_modinfo($course); 117 $showsubscriptioncolumns = false; 118 119 foreach ($modinfo->get_instances_of('forum') as $forumid => $cm) { 120 if (!$cm->uservisible or !isset($forums[$forumid])) { 121 continue; 122 } 123 124 $forum = $forums[$forumid]; 125 126 if (!$context = context_module::instance($cm->id, IGNORE_MISSING)) { 127 // Shouldn't happen. 128 continue; 129 } 130 131 if (!has_capability('mod/forum:viewdiscussion', $context)) { 132 // User can't view this one - skip it. 133 continue; 134 } 135 136 // Determine whether subscription options should be displayed. 137 $forum->cansubscribe = mod_forum\subscriptions::is_subscribable($forum); 138 $forum->cansubscribe = $forum->cansubscribe || has_capability('mod/forum:managesubscriptions', $context); 139 $forum->issubscribed = mod_forum\subscriptions::is_subscribed($USER->id, $forum, null, $cm); 140 141 $showsubscriptioncolumns = $showsubscriptioncolumns || $forum->issubscribed || $forum->cansubscribe; 142 143 // Fill two type array - order in modinfo is the same as in course. 144 if ($forum->type == 'news' or $forum->type == 'social') { 145 $generalforums[$forum->id] = $forum; 146 147 } else if ($course->id == SITEID or empty($cm->sectionnum)) { 148 $generalforums[$forum->id] = $forum; 149 150 } else { 151 $learningforums[$forum->id] = $forum; 152 } 153 } 154 155 if ($showsubscriptioncolumns) { 156 // The user can subscribe to at least one forum. 157 $generaltable->head[] = $strsubscribed; 158 $generaltable->align[] = 'center'; 159 160 $generaltable->head[] = $stremaildigest . ' ' . $OUTPUT->help_icon('emaildigesttype', 'mod_forum'); 161 $generaltable->align[] = 'center'; 162 163 } 164 165 if ($show_rss = (($showsubscriptioncolumns || $course->id == SITEID) && 166 isset($CFG->enablerssfeeds) && isset($CFG->forum_enablerssfeeds) && 167 $CFG->enablerssfeeds && $CFG->forum_enablerssfeeds)) { 168 $generaltable->head[] = $strrss; 169 $generaltable->align[] = 'center'; 170 } 171 172 173 // Do course wide subscribe/unsubscribe if requested 174 if (!is_null($subscribe)) { 175 if (isguestuser() or !$showsubscriptioncolumns) { 176 // There should not be any links leading to this place, just redirect. 177 redirect( 178 new moodle_url('/mod/forum/index.php', array('id' => $id)), 179 get_string('subscribeenrolledonly', 'forum'), 180 null, 181 \core\output\notification::NOTIFY_ERROR 182 ); 183 } 184 // Can proceed now, the user is not guest and is enrolled 185 foreach ($modinfo->get_instances_of('forum') as $forumid => $cm) { 186 $forum = $forums[$forumid]; 187 $modcontext = context_module::instance($cm->id); 188 $cansub = false; 189 190 if (has_capability('mod/forum:viewdiscussion', $modcontext)) { 191 $cansub = true; 192 } 193 if ($cansub && $cm->visible == 0 && 194 !has_capability('mod/forum:managesubscriptions', $modcontext)) 195 { 196 $cansub = false; 197 } 198 if (!\mod_forum\subscriptions::is_forcesubscribed($forum)) { 199 $subscribed = \mod_forum\subscriptions::is_subscribed($USER->id, $forum, null, $cm); 200 $canmanageactivities = has_capability('moodle/course:manageactivities', $coursecontext, $USER->id); 201 if (($canmanageactivities || \mod_forum\subscriptions::is_subscribable($forum)) && $subscribe && !$subscribed && $cansub) { 202 \mod_forum\subscriptions::subscribe_user($USER->id, $forum, $modcontext, true); 203 } else if (!$subscribe && $subscribed) { 204 \mod_forum\subscriptions::unsubscribe_user($USER->id, $forum, $modcontext, true); 205 } 206 } 207 } 208 $returnto = forum_go_back_to(new moodle_url('/mod/forum/index.php', array('id' => $course->id))); 209 $shortname = format_string($course->shortname, true, array('context' => context_course::instance($course->id))); 210 if ($subscribe) { 211 redirect( 212 $returnto, 213 get_string('nowallsubscribed', 'forum', $shortname), 214 null, 215 \core\output\notification::NOTIFY_SUCCESS 216 ); 217 } else { 218 redirect( 219 $returnto, 220 get_string('nowallunsubscribed', 'forum', $shortname), 221 null, 222 \core\output\notification::NOTIFY_SUCCESS 223 ); 224 } 225 } 226 227 if ($generalforums) { 228 // Process general forums. 229 foreach ($generalforums as $forum) { 230 $cm = $modinfo->instances['forum'][$forum->id]; 231 $context = context_module::instance($cm->id); 232 233 $count = forum_count_discussions($forum, $cm, $course); 234 235 if ($usetracking) { 236 if ($forum->trackingtype == FORUM_TRACKING_OFF) { 237 $unreadlink = '-'; 238 $trackedlink = '-'; 239 240 } else { 241 if (isset($untracked[$forum->id])) { 242 $unreadlink = '-'; 243 } else if ($unread = forum_tp_count_forum_unread_posts($cm, $course)) { 244 $unreadlink = '<span class="unread"><a href="view.php?f='.$forum->id.'#unread">'.$unread.'</a>'; 245 $icon = $OUTPUT->pix_icon('t/markasread', $strmarkallread); 246 $unreadlink .= '<a title="'.$strmarkallread.'" href="markposts.php?f='. 247 $forum->id.'&mark=read&sesskey=' . sesskey() . '">' . $icon . '</a></span>'; 248 } else { 249 $unreadlink = '<span class="read">0</span>'; 250 } 251 252 if (($forum->trackingtype == FORUM_TRACKING_FORCED) && ($CFG->forum_allowforcedreadtracking)) { 253 $trackedlink = $stryes; 254 } else if ($forum->trackingtype === FORUM_TRACKING_OFF || ($USER->trackforums == 0)) { 255 $trackedlink = '-'; 256 } else { 257 $aurl = new moodle_url('/mod/forum/settracking.php', array( 258 'id' => $forum->id, 259 'sesskey' => sesskey(), 260 )); 261 if (!isset($untracked[$forum->id])) { 262 $trackedlink = $OUTPUT->single_button($aurl, $stryes, 'post', array('title' => $strnotrackforum)); 263 } else { 264 $trackedlink = $OUTPUT->single_button($aurl, $strno, 'post', array('title' => $strtrackforum)); 265 } 266 } 267 } 268 } 269 270 $forum->intro = shorten_text(format_module_intro('forum', $forum, $cm->id), $CFG->forum_shortpost); 271 $forumname = format_string($forum->name, true); 272 273 if ($cm->visible) { 274 $style = ''; 275 } else { 276 $style = 'class="dimmed"'; 277 } 278 $forumlink = "<a href=\"view.php?f=$forum->id\" $style>".format_string($forum->name,true)."</a>"; 279 $discussionlink = "<a href=\"view.php?f=$forum->id\" $style>".$count."</a>"; 280 281 $row = array ($forumlink, $forum->intro, $discussionlink); 282 if ($usetracking) { 283 $row[] = $unreadlink; 284 $row[] = $trackedlink; // Tracking. 285 } 286 287 if ($showsubscriptioncolumns) { 288 $row[] = forum_get_subscribe_link($forum, $context, array('subscribed' => $stryes, 289 'unsubscribed' => $strno, 'forcesubscribed' => $stryes, 290 'cantsubscribe' => '-'), false, false, true); 291 $row[] = forum_index_get_forum_subscription_selector($forum); 292 } 293 294 // If this forum has RSS activated, calculate it. 295 if ($show_rss) { 296 if ($forum->rsstype and $forum->rssarticles) { 297 //Calculate the tooltip text 298 if ($forum->rsstype == 1) { 299 $tooltiptext = get_string('rsssubscriberssdiscussions', 'forum'); 300 } else { 301 $tooltiptext = get_string('rsssubscriberssposts', 'forum'); 302 } 303 304 if (!isloggedin() && $course->id == SITEID) { 305 $userid = guest_user()->id; 306 } else { 307 $userid = $USER->id; 308 } 309 //Get html code for RSS link 310 $row[] = rss_get_link($context->id, $userid, 'mod_forum', $forum->id, $tooltiptext); 311 } else { 312 $row[] = ' '; 313 } 314 } 315 316 $generaltable->data[] = $row; 317 } 318 } 319 320 321 // Start of the table for Learning Forums 322 $learningtable = new html_table(); 323 $learningtable->head = array ($strforum, $strdescription, $strdiscussions); 324 $learningtable->align = array ('left', 'left', 'center'); 325 326 if ($usetracking) { 327 $learningtable->head[] = $strunreadposts; 328 $learningtable->align[] = 'center'; 329 330 $learningtable->head[] = $strtracking; 331 $learningtable->align[] = 'center'; 332 } 333 334 if ($showsubscriptioncolumns) { 335 $learningtable->head[] = $strsubscribed; 336 $learningtable->align[] = 'center'; 337 338 $learningtable->head[] = $stremaildigest . ' ' . $OUTPUT->help_icon('emaildigesttype', 'mod_forum'); 339 $learningtable->align[] = 'center'; 340 } 341 342 if ($show_rss = (($showsubscriptioncolumns || $course->id == SITEID) && 343 isset($CFG->enablerssfeeds) && isset($CFG->forum_enablerssfeeds) && 344 $CFG->enablerssfeeds && $CFG->forum_enablerssfeeds)) { 345 $learningtable->head[] = $strrss; 346 $learningtable->align[] = 'center'; 347 } 348 349 // Now let's process the learning forums. 350 if ($course->id != SITEID) { // Only real courses have learning forums 351 // 'format_.'$course->format only applicable when not SITEID (format_site is not a format) 352 $strsectionname = get_string('sectionname', 'format_'.$course->format); 353 // Add extra field for section number, at the front 354 array_unshift($learningtable->head, $strsectionname); 355 array_unshift($learningtable->align, 'center'); 356 357 358 if ($learningforums) { 359 $currentsection = ''; 360 foreach ($learningforums as $forum) { 361 $cm = $modinfo->instances['forum'][$forum->id]; 362 $context = context_module::instance($cm->id); 363 364 $count = forum_count_discussions($forum, $cm, $course); 365 366 if ($usetracking) { 367 if ($forum->trackingtype == FORUM_TRACKING_OFF) { 368 $unreadlink = '-'; 369 $trackedlink = '-'; 370 371 } else { 372 if (isset($untracked[$forum->id])) { 373 $unreadlink = '-'; 374 } else if ($unread = forum_tp_count_forum_unread_posts($cm, $course)) { 375 $unreadlink = '<span class="unread"><a href="view.php?f='.$forum->id.'#unread">'.$unread.'</a>'; 376 $icon = $OUTPUT->pix_icon('t/markasread', $strmarkallread); 377 $unreadlink .= '<a title="'.$strmarkallread.'" href="markposts.php?f='. 378 $forum->id.'&mark=read&sesskey=' . sesskey() . '">' . $icon . '</a></span>'; 379 } else { 380 $unreadlink = '<span class="read">0</span>'; 381 } 382 383 if (($forum->trackingtype == FORUM_TRACKING_FORCED) && ($CFG->forum_allowforcedreadtracking)) { 384 $trackedlink = $stryes; 385 } else if ($forum->trackingtype === FORUM_TRACKING_OFF || ($USER->trackforums == 0)) { 386 $trackedlink = '-'; 387 } else { 388 $aurl = new moodle_url('/mod/forum/settracking.php', array('id' => $forum->id)); 389 if (!isset($untracked[$forum->id])) { 390 $trackedlink = $OUTPUT->single_button($aurl, $stryes, 'post', array('title' => $strnotrackforum)); 391 } else { 392 $trackedlink = $OUTPUT->single_button($aurl, $strno, 'post', array('title' => $strtrackforum)); 393 } 394 } 395 } 396 } 397 398 $forum->intro = shorten_text(format_module_intro('forum', $forum, $cm->id), $CFG->forum_shortpost); 399 400 if ($cm->sectionnum != $currentsection) { 401 $printsection = get_section_name($course, $cm->sectionnum); 402 if ($currentsection) { 403 $learningtable->data[] = 'hr'; 404 } 405 $currentsection = $cm->sectionnum; 406 } else { 407 $printsection = ''; 408 } 409 410 $forumname = format_string($forum->name,true); 411 412 if ($cm->visible) { 413 $style = ''; 414 } else { 415 $style = 'class="dimmed"'; 416 } 417 $forumlink = "<a href=\"view.php?f=$forum->id\" $style>".format_string($forum->name,true)."</a>"; 418 $discussionlink = "<a href=\"view.php?f=$forum->id\" $style>".$count."</a>"; 419 420 $row = array ($printsection, $forumlink, $forum->intro, $discussionlink); 421 if ($usetracking) { 422 $row[] = $unreadlink; 423 $row[] = $trackedlink; // Tracking. 424 } 425 426 if ($showsubscriptioncolumns) { 427 $row[] = forum_get_subscribe_link($forum, $context, array('subscribed' => $stryes, 428 'unsubscribed' => $strno, 'forcesubscribed' => $stryes, 429 'cantsubscribe' => '-'), false, false, true); 430 $row[] = forum_index_get_forum_subscription_selector($forum); 431 } 432 433 //If this forum has RSS activated, calculate it 434 if ($show_rss) { 435 if ($forum->rsstype and $forum->rssarticles) { 436 //Calculate the tolltip text 437 if ($forum->rsstype == 1) { 438 $tooltiptext = get_string('rsssubscriberssdiscussions', 'forum'); 439 } else { 440 $tooltiptext = get_string('rsssubscriberssposts', 'forum'); 441 } 442 //Get html code for RSS link 443 $row[] = rss_get_link($context->id, $USER->id, 'mod_forum', $forum->id, $tooltiptext); 444 } else { 445 $row[] = ' '; 446 } 447 } 448 449 $learningtable->data[] = $row; 450 } 451 } 452 } 453 454 // Output the page. 455 $PAGE->navbar->add($strforums); 456 $PAGE->set_title("$course->shortname: $strforums"); 457 $PAGE->set_heading($course->fullname); 458 echo $OUTPUT->header(); 459 460 echo html_writer::start_div('input-group mr-5'); 461 echo $searchform; 462 echo html_writer::end_div(); 463 464 if (!isguestuser() && isloggedin() && $showsubscriptioncolumns) { 465 // Show the subscribe all options only to non-guest, enrolled users. 466 echo $OUTPUT->box_start('subscription'); 467 468 $subscriptionlink = new moodle_url('/mod/forum/index.php', [ 469 'id' => $course->id, 470 'sesskey' => sesskey(), 471 ]); 472 473 // Subscribe all. 474 $subscriptionlink->param('subscribe', 1); 475 echo html_writer::tag('div', html_writer::link($subscriptionlink, get_string('allsubscribe', 'forum')), [ 476 'class' => 'helplink', 477 ]); 478 479 // Unsubscribe all. 480 $subscriptionlink->param('subscribe', 0); 481 echo html_writer::tag('div', html_writer::link($subscriptionlink, get_string('allunsubscribe', 'forum')), [ 482 'class' => 'helplink', 483 ]); 484 485 echo $OUTPUT->box_end(); 486 echo $OUTPUT->box(' ', 'clearer'); 487 } 488 489 if ($generalforums) { 490 echo $OUTPUT->heading(get_string('generalforums', 'forum'), 2); 491 echo html_writer::table($generaltable); 492 } 493 494 if ($learningforums) { 495 echo $OUTPUT->heading(get_string('learningforums', 'forum'), 2); 496 echo html_writer::table($learningtable); 497 } 498 499 echo $OUTPUT->footer(); 500 501 /** 502 * Get the content of the forum subscription options for this forum. 503 * 504 * @param stdClass $forum The forum to return options for 505 * @return string 506 */ 507 function forum_index_get_forum_subscription_selector($forum) { 508 global $OUTPUT, $PAGE; 509 510 if ($forum->cansubscribe || $forum->issubscribed) { 511 if ($forum->maildigest === null) { 512 $forum->maildigest = -1; 513 } 514 515 $renderer = $PAGE->get_renderer('mod_forum'); 516 return $OUTPUT->render($renderer->render_digest_options($forum, $forum->maildigest)); 517 } else { 518 // This user can subscribe to some forums. Add the empty fields. 519 return ''; 520 } 521 };
title
Description
Body
title
Description
Body
title
Description
Body
title
Body