".get_string("noposts", "forum")."
"; } } /** * @deprecated since Moodle 3.3, when the block_course_overview block was removed. */ function forum_filter_user_groups_discussions() { throw new coding_exception('forum_filter_user_groups_discussions() can not be used any more and is obsolete.'); } /** * Returns whether the discussion group is visible by the current user or not. * * @since Moodle 2.8, 2.7.1, 2.6.4 * @param cm_info $cm The discussion course module * @param int $discussiongroupid The discussion groupid * @return bool */ function forum_is_user_group_discussion(cm_info $cm, $discussiongroupid) { if ($discussiongroupid == -1 || $cm->effectivegroupmode != SEPARATEGROUPS) { return true; } if (isguestuser()) { return false; } if (has_capability('moodle/site:accessallgroups', context_module::instance($cm->id)) || in_array($discussiongroupid, $cm->get_modinfo()->get_groups($cm->groupingid))) { return true; } return false; } /** * @deprecated since Moodle 3.3, when the block_course_overview block was removed. */ function forum_print_overview() { throw new coding_exception('forum_print_overview() can not be used any more and is obsolete.'); } /** * Given a course and a date, prints a summary of all the new * messages posted in the course since that date * * @global object * @global object * @global object * @uses CONTEXT_MODULE * @uses VISIBLEGROUPS * @param object $course * @param bool $viewfullnames capability * @param int $timestart * @return bool success */ function forum_print_recent_activity($course, $viewfullnames, $timestart) { global $USER, $DB, $OUTPUT; // do not use log table if possible, it may be huge and is expensive to join with other tables $userfieldsapi = \core_user\fields::for_userpic(); $allnamefields = $userfieldsapi->get_sql('u', false, '', 'duserid', false)->selects; if (!$posts = $DB->get_records_sql("SELECT p.*, f.course, f.type AS forumtype, f.name AS forumname, f.intro, f.introformat, f.duedate, f.cutoffdate, f.assessed AS forumassessed, f.assesstimestart, f.assesstimefinish, f.scale, f.grade_forum, f.maxbytes, f.maxattachments, f.forcesubscribe, f.trackingtype, f.rsstype, f.rssarticles, f.timemodified, f.warnafter, f.blockafter, f.blockperiod, f.completiondiscussions, f.completionreplies, f.completionposts, f.displaywordcount, f.lockdiscussionafter, f.grade_forum_notify, d.name AS discussionname, d.firstpost, d.userid AS discussionstarter, d.assessed AS discussionassessed, d.timemodified, d.usermodified, d.forum, d.groupid, d.timestart, d.timeend, d.pinned, d.timelocked, $allnamefields FROM {forum_posts} p JOIN {forum_discussions} d ON d.id = p.discussion JOIN {forum} f ON f.id = d.forum JOIN {user} u ON u.id = p.userid WHERE p.created > ? AND f.course = ? AND p.deleted <> 1 ORDER BY p.id ASC", array($timestart, $course->id))) { // order by initial posting date return false; } $modinfo = get_fast_modinfo($course); $strftimerecent = get_string('strftimerecent'); $managerfactory = mod_forum\local\container::get_manager_factory(); $entityfactory = mod_forum\local\container::get_entity_factory(); $discussions = []; $capmanagers = []; $printposts = []; foreach ($posts as $post) { if (!isset($modinfo->instances['forum'][$post->forum])) { // not visible continue; } $cm = $modinfo->instances['forum'][$post->forum]; if (!$cm->uservisible) { continue; } // Get the discussion. Cache if not yet available. if (!isset($discussions[$post->discussion])) { // Build the discussion record object from the post data. $discussionrecord = (object)[ 'id' => $post->discussion, 'course' => $post->course, 'forum' => $post->forum, 'name' => $post->discussionname, 'firstpost' => $post->firstpost, 'userid' => $post->discussionstarter, 'groupid' => $post->groupid, 'assessed' => $post->discussionassessed, 'timemodified' => $post->timemodified, 'usermodified' => $post->usermodified, 'timestart' => $post->timestart, 'timeend' => $post->timeend, 'pinned' => $post->pinned, 'timelocked' => $post->timelocked ]; // Build the discussion entity from the factory and cache it. $discussions[$post->discussion] = $entityfactory->get_discussion_from_stdclass($discussionrecord); } $discussionentity = $discussions[$post->discussion]; // Get the capability manager. Cache if not yet available. if (!isset($capmanagers[$post->forum])) { $context = context_module::instance($cm->id); $coursemodule = $cm->get_course_module_record(); // Build the forum record object from the post data. $forumrecord = (object)[ 'id' => $post->forum, 'course' => $post->course, 'type' => $post->forumtype, 'name' => $post->forumname, 'intro' => $post->intro, 'introformat' => $post->introformat, 'duedate' => $post->duedate, 'cutoffdate' => $post->cutoffdate, 'assessed' => $post->forumassessed, 'assesstimestart' => $post->assesstimestart, 'assesstimefinish' => $post->assesstimefinish, 'scale' => $post->scale, 'grade_forum' => $post->grade_forum, 'maxbytes' => $post->maxbytes, 'maxattachments' => $post->maxattachments, 'forcesubscribe' => $post->forcesubscribe, 'trackingtype' => $post->trackingtype, 'rsstype' => $post->rsstype, 'rssarticles' => $post->rssarticles, 'timemodified' => $post->timemodified, 'warnafter' => $post->warnafter, 'blockafter' => $post->blockafter, 'blockperiod' => $post->blockperiod, 'completiondiscussions' => $post->completiondiscussions, 'completionreplies' => $post->completionreplies, 'completionposts' => $post->completionposts, 'displaywordcount' => $post->displaywordcount, 'lockdiscussionafter' => $post->lockdiscussionafter, 'grade_forum_notify' => $post->grade_forum_notify ]; // Build the forum entity from the factory. $forumentity = $entityfactory->get_forum_from_stdclass($forumrecord, $context, $coursemodule, $course); // Get the capability manager of this forum and cache it. $capmanagers[$post->forum] = $managerfactory->get_capability_manager($forumentity); } $capabilitymanager = $capmanagers[$post->forum]; // Get the post entity. $postentity = $entityfactory->get_post_from_stdclass($post); // Check if the user can view the post. if ($capabilitymanager->can_view_post($USER, $discussionentity, $postentity)) { $printposts[] = $post; } } unset($posts); if (!$printposts) { return false; } echo $OUTPUT->heading(get_string('newforumposts', 'forum') . ':', 6); $list = html_writer::start_tag('ul', ['class' => 'unlist']); foreach ($printposts as $post) { $subjectclass = empty($post->parent) ? ' bold' : ''; $authorhidden = forum_is_author_hidden($post, (object) ['type' => $post->forumtype]); $list .= html_writer::start_tag('li'); $list .= html_writer::start_div('head'); $list .= html_writer::div(userdate_htmltime($post->modified, $strftimerecent), 'date'); if (!$authorhidden) { $list .= html_writer::div(fullname($post, $viewfullnames), 'name'); } $list .= html_writer::end_div(); // Head. $list .= html_writer::start_div('info' . $subjectclass); $discussionurl = new moodle_url('/mod/forum/discuss.php', ['d' => $post->discussion]); if (!empty($post->parent)) { $discussionurl->param('parent', $post->parent); $discussionurl->set_anchor('p'. $post->id); } $post->subject = break_up_long_words(format_string($post->subject, true)); $list .= html_writer::link($discussionurl, $post->subject, ['rel' => 'bookmark']); $list .= html_writer::end_div(); // Info. $list .= html_writer::end_tag('li'); } $list .= html_writer::end_tag('ul'); echo $list; return true; } /** * Update activity grades. * * @param object $forum * @param int $userid specific user only, 0 means all */ function forum_update_grades($forum, $userid = 0): void { global $CFG, $DB; require_once($CFG->libdir.'/gradelib.php'); $ratings = null; if ($forum->assessed) { require_once($CFG->dirroot.'/rating/lib.php'); $cm = get_coursemodule_from_instance('forum', $forum->id); $rm = new rating_manager(); $ratings = $rm->get_user_grades((object) [ 'component' => 'mod_forum', 'ratingarea' => 'post', 'contextid' => \context_module::instance($cm->id)->id, 'modulename' => 'forum', 'moduleid ' => $forum->id, 'userid' => $userid, 'aggregationmethod' => $forum->assessed, 'scaleid' => $forum->scale, 'itemtable' => 'forum_posts', 'itemtableusercolumn' => 'userid', ]); } $forumgrades = null; if ($forum->grade_forum) { $sql = <<