See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Displays the list of discussions in a forum. 19 * 20 * @package mod_forum 21 * @copyright 2019 Andrew Nicols <andrew@nicols.co.uk> 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 */ 24 25 use mod_forum\grades\forum_gradeitem; 26 27 require_once('../../config.php'); 28 29 $managerfactory = mod_forum\local\container::get_manager_factory(); 30 $legacydatamapperfactory = mod_forum\local\container::get_legacy_data_mapper_factory(); 31 $vaultfactory = mod_forum\local\container::get_vault_factory(); 32 $forumvault = $vaultfactory->get_forum_vault(); 33 $discussionvault = $vaultfactory->get_discussion_vault(); 34 $postvault = $vaultfactory->get_post_vault(); 35 $discussionlistvault = $vaultfactory->get_discussions_in_forum_vault(); 36 37 $cmid = optional_param('id', 0, PARAM_INT); 38 $forumid = optional_param('f', 0, PARAM_INT); 39 $mode = optional_param('mode', 0, PARAM_INT); 40 $showall = optional_param('showall', '', PARAM_INT); 41 $pageno = optional_param('page', 0, PARAM_INT); 42 $search = optional_param('search', '', PARAM_CLEAN); 43 $pageno = optional_param('p', $pageno, PARAM_INT); 44 $pagesize = optional_param('s', 0, PARAM_INT); 45 $sortorder = optional_param('o', null, PARAM_INT); 46 47 if (!$cmid && !$forumid) { 48 throw new \moodle_exception('missingparameter'); 49 } 50 51 if ($cmid) { 52 $forum = $forumvault->get_from_course_module_id($cmid); 53 if (empty($forum)) { 54 throw new \moodle_exception('Unable to find forum with cmid ' . $cmid); 55 } 56 } else { 57 $forum = $forumvault->get_from_id($forumid); 58 if (empty($forum)) { 59 throw new \moodle_exception('Unable to find forum with id ' . $forumid); 60 } 61 } 62 63 if (!empty($showall)) { 64 // The user wants to see all discussions. 65 $pageno = 0; 66 $pagesize = 0; 67 } 68 69 $urlfactory = mod_forum\local\container::get_url_factory(); 70 $capabilitymanager = $managerfactory->get_capability_manager($forum); 71 72 $url = $urlfactory->get_forum_view_url_from_forum($forum); 73 $PAGE->set_url($url); 74 75 $course = $forum->get_course_record(); 76 $coursemodule = $forum->get_course_module_record(); 77 $cm = \cm_info::create($coursemodule); 78 79 require_course_login($course, true, $cm); 80 81 $istypesingle = $forum->get_type() === 'single'; 82 $saveddisplaymode = get_user_preferences('forum_displaymode', $CFG->forum_displaymode); 83 84 if ($mode) { 85 $displaymode = $mode; 86 } else { 87 $displaymode = $saveddisplaymode; 88 } 89 90 if (get_user_preferences('forum_useexperimentalui', false)) { 91 if ($displaymode == FORUM_MODE_NESTED) { 92 $displaymode = FORUM_MODE_NESTED_V2; 93 } 94 } else { 95 if ($displaymode == FORUM_MODE_NESTED_V2) { 96 $displaymode = FORUM_MODE_NESTED; 97 } 98 } 99 100 if ($displaymode != $saveddisplaymode) { 101 set_user_preference('forum_displaymode', $displaymode); 102 } 103 104 $PAGE->set_context($forum->get_context()); 105 $PAGE->set_title($forum->get_name()); 106 $PAGE->add_body_class('forumtype-' . $forum->get_type()); 107 $PAGE->set_heading($course->fullname); 108 $PAGE->add_header_action(forum_search_form($course, $search)); 109 110 if ($istypesingle && $displaymode == FORUM_MODE_NESTED_V2) { 111 $PAGE->add_body_class('nested-v2-display-mode reset-style'); 112 $settingstrigger = $OUTPUT->render_from_template('mod_forum/settings_drawer_trigger', null); 113 $PAGE->add_header_action($settingstrigger); 114 } 115 116 if (empty($cm->visible) && !has_capability('moodle/course:viewhiddenactivities', $forum->get_context())) { 117 redirect( 118 $urlfactory->get_course_url_from_forum($forum), 119 get_string('activityiscurrentlyhidden'), 120 null, 121 \core\output\notification::NOTIFY_WARNING 122 ); 123 } 124 125 if (!$capabilitymanager->can_view_discussions($USER)) { 126 redirect( 127 $urlfactory->get_course_url_from_forum($forum), 128 get_string('noviewdiscussionspermission', 'forum'), 129 null, 130 \core\output\notification::NOTIFY_WARNING 131 ); 132 } 133 134 // Mark viewed and trigger the course_module_viewed event. 135 $forumdatamapper = $legacydatamapperfactory->get_forum_data_mapper(); 136 $forumrecord = $forumdatamapper->to_legacy_object($forum); 137 $PAGE->set_activity_record($forumrecord); 138 forum_view( 139 $forumrecord, 140 $forum->get_course_record(), 141 $forum->get_course_module_record(), 142 $forum->get_context() 143 ); 144 145 // Return here if we post or set subscription etc. 146 $SESSION->fromdiscussion = qualified_me(); 147 148 if (!empty($CFG->enablerssfeeds) && !empty($CFG->forum_enablerssfeeds) && $forum->get_rss_type() && $forum->get_rss_articles()) { 149 require_once("{$CFG->libdir}/rsslib.php"); 150 151 $rsstitle = format_string($course->shortname, true, [ 152 'context' => context_course::instance($course->id), 153 ]) . ': ' . format_string($forum->get_name()); 154 rss_add_http_header($forum->get_context(), 'mod_forum', $forumrecord, $rsstitle); 155 } 156 $activityheader = $PAGE->activityheader; 157 $pageheader = []; 158 if ($activityheader->is_title_allowed()) { 159 $pageheader['title'] = format_string($forum->get_name()); 160 } 161 162 // Fetch the current groupid. 163 $groupid = groups_get_activity_group($cm, true) ?: null; 164 165 if ($istypesingle || empty($forum->get_intro())) { 166 $pageheader['description'] = ''; 167 } 168 $activityheader->set_attrs($pageheader); 169 170 echo $OUTPUT->header(); 171 172 $rendererfactory = mod_forum\local\container::get_renderer_factory(); 173 // The elements for view action are rendered and added to the page. 174 echo forum_activity_actionbar($forum, $groupid, $course, $search); 175 176 if ($sortorder) { 177 set_user_preference('forum_discussionlistsortorder', $sortorder); 178 } 179 180 $sortorder = get_user_preferences('forum_discussionlistsortorder', $discussionlistvault::SORTORDER_LASTPOST_DESC); 181 182 switch ($forum->get_type()) { 183 case 'single': 184 $forumgradeitem = forum_gradeitem::load_from_forum_entity($forum); 185 if ($capabilitymanager->can_grade($USER)) { 186 187 if ($forumgradeitem->is_grading_enabled()) { 188 $groupid = groups_get_activity_group($cm, true) ?: null; 189 $gradeobj = (object) [ 190 'contextid' => $forum->get_context()->id, 191 'cmid' => $forum->get_course_module_record()->id, 192 'name' => format_string($forum->get_name()), 193 'courseid' => $course->id, 194 'coursename' => format_string($course->shortname), 195 'experimentaldisplaymode' => $displaymode == FORUM_MODE_NESTED_V2, 196 'groupid' => $groupid, 197 'gradingcomponent' => $forumgradeitem->get_grading_component_name(), 198 'gradingcomponentsubtype' => $forumgradeitem->get_grading_component_subtype(), 199 'sendstudentnotifications' => $forum->should_notify_students_default_when_grade_for_forum(), 200 'gradeonlyactiveusers' => $forumgradeitem->should_grade_only_active_users(), 201 ]; 202 echo $OUTPUT->render_from_template('mod_forum/grades/grade_button', $gradeobj); 203 } 204 } else { 205 if ($forumgradeitem->is_grading_enabled()) { 206 $groupid = groups_get_activity_group($cm, true) ?: null; 207 $gradeobj = (object) [ 208 'contextid' => $forum->get_context()->id, 209 'cmid' => $forum->get_course_module_record()->id, 210 'name' => format_string($forum->get_name()), 211 'courseid' => $course->id, 212 'coursename' => format_string($course->shortname), 213 'groupid' => $groupid, 214 'userid' => $USER->id, 215 'gradingcomponent' => $forumgradeitem->get_grading_component_name(), 216 'gradingcomponentsubtype' => $forumgradeitem->get_grading_component_subtype(), 217 ]; 218 echo $OUTPUT->render_from_template('mod_forum/grades/view_grade_button', $gradeobj); 219 } 220 } 221 $discussion = $discussionvault->get_last_discussion_in_forum($forum); 222 $discussioncount = $discussionvault->get_count_discussions_in_forum($forum); 223 $hasmultiplediscussions = $discussioncount > 1; 224 $discussionsrenderer = $rendererfactory->get_single_discussion_list_renderer($forum, $discussion, 225 $hasmultiplediscussions, $displaymode); 226 $post = $postvault->get_from_id($discussion->get_first_post_id()); 227 $orderpostsby = $displaymode == FORUM_MODE_FLATNEWEST ? 'created DESC' : 'created ASC'; 228 $replies = $postvault->get_replies_to_post( 229 $USER, 230 $post, 231 $capabilitymanager->can_view_any_private_reply($USER), 232 $orderpostsby 233 ); 234 echo $discussionsrenderer->render($USER, $post, $replies); 235 236 if (!$CFG->forum_usermarksread && forum_tp_is_tracked($forumrecord, $USER)) { 237 $postids = array_map(function($post) { 238 return $post->get_id(); 239 }, array_merge([$post], array_values($replies))); 240 forum_tp_mark_posts_read($USER, $postids); 241 } 242 break; 243 case 'blog': 244 $discussionsrenderer = $rendererfactory->get_blog_discussion_list_renderer($forum); 245 // Blog forums always show discussions newest first. 246 echo $discussionsrenderer->render($USER, $cm, $groupid, $discussionlistvault::SORTORDER_CREATED_DESC, 247 $pageno, $pagesize, null, false); 248 249 if (!$CFG->forum_usermarksread && forum_tp_is_tracked($forumrecord, $USER)) { 250 $discussions = mod_forum_get_discussion_summaries($forum, $USER, $groupid, null, $pageno, $pagesize); 251 $firstpostids = array_map(function($discussion) { 252 return $discussion->get_first_post()->get_id(); 253 }, array_values($discussions)); 254 forum_tp_mark_posts_read($USER, $firstpostids); 255 } 256 break; 257 default: 258 $discussionsrenderer = $rendererfactory->get_discussion_list_renderer($forum); 259 echo $discussionsrenderer->render($USER, $cm, $groupid, $sortorder, $pageno, $pagesize, $displaymode, false); 260 } 261 262 echo $OUTPUT->footer();
title
Description
Body
title
Description
Body
title
Description
Body
title
Body