See Release Notes
Long Term Support Release
<?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Forum class. * * @package mod_forum * @copyright 2019 Ryan Wyllie <ryan@moodle.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace mod_forum\local\entities; defined('MOODLE_INTERNAL') || die(); global $CFG; require_once($CFG->dirroot . '/mod/forum/lib.php'); require_once($CFG->dirroot . '/rating/lib.php'); use mod_forum\local\entities\discussion as discussion_entity; use context; use stdClass; /** * Forum class. * * @copyright 2019 Ryan Wyllie <ryan@moodle.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class forum { /** @var context $context The forum module context */ private $context; /** @var stdClass $coursemodule The forum course module record */ private $coursemodule; /** @var stdClass $course The forum course record */ private $course; /** @var int $effectivegroupmode The effective group mode */ private $effectivegroupmode; /** @var int $id ID */ private $id; /** @var int $courseid Id of the course this forum is in */ private $courseid; /** @var string $type The forum type, e.g. single, qanda, etc */ private $type; /** @var string $name Name of the forum */ private $name; /** @var string $intro Intro text */ private $intro; /** @var int $introformat Format of the intro text */ private $introformat; /** @var int $assessed The forum rating aggregate */ private $assessed; /** @var int $assesstimestart Timestamp to begin assessment */ private $assesstimestart; /** @var int $assesstimefinish Timestamp to end assessment */ private $assesstimefinish; /** @var int $scale The rating scale */ private $scale; /** @var int $gradeforum The grade for the forum when grading holistically */ private $gradeforum; /** @var bool $gradeforumnotify Whether to notify students when the forum is graded holistically */ private $gradeforumnotify; /** @var int $maxbytes Maximum attachment size */ private $maxbytes; /** @var int $maxattachments Maximum number of attachments */ private $maxattachments; /** @var int $forcesubscribe Does the forum force users to subscribe? */ private $forcesubscribe; /** @var int $trackingtype Tracking type */ private $trackingtype; /** @var int $rsstype RSS type */ private $rsstype; /** @var int $rssarticles RSS articles */ private $rssarticles; /** @var int $timemodified Timestamp when the forum was last modified */ private $timemodified; /** @var int $warnafter Warn after */ private $warnafter; /** @var int $blockafter Block after */ private $blockafter; /** @var int $blockperiod Block period */ private $blockperiod; /** @var int $completiondiscussions Completion discussions */ private $completiondiscussions; /** @var int $completionreplies Completion replies */ private $completionreplies; /** @var int $completionposts Completion posts */ private $completionposts;< /** @var bool $displaywordcounts Should display word counts in posts */ < private $displaywordcounts;> /** @var bool $displaywordcount Should display word counts in posts */ > private $displaywordcount;/** @var bool $lockdiscussionafter Timestamp after which discussions should be locked */ private $lockdiscussionafter; /** @var int $duedate Timestamp that represents the due date for forum posts */ private $duedate; /** @var int $cutoffdate Timestamp after which forum posts will no longer be accepted */ private $cutoffdate; /** * Constructor * * @param context $context The forum module context * @param stdClass $coursemodule The forum course module record * @param stdClass $course The forum course record * @param int $effectivegroupmode The effective group mode * @param int $id ID * @param int $courseid Id of the course this forum is in * @param string $type The forum type, e.g. single, qanda, etc * @param string $name Name of the forum * @param string $intro Intro text * @param int $introformat Format of the intro text * @param int $assessed The forum rating aggregate * @param int $assesstimestart Timestamp to begin assessment * @param int $assesstimefinish Timestamp to end assessment * @param int $scale The rating scale * @param int $gradeforum The holistic grade * @param bool $gradeforumnotify Default for whether to notify students when grade holistically * @param int $maxbytes Maximum attachment size * @param int $maxattachments Maximum number of attachments * @param int $forcesubscribe Does the forum force users to subscribe? * @param int $trackingtype Tracking type * @param int $rsstype RSS type * @param int $rssarticles RSS articles * @param int $timemodified Timestamp when the forum was last modified * @param int $warnafter Warn after * @param int $blockafter Block after * @param int $blockperiod Block period * @param int $completiondiscussions Completion discussions * @param int $completionreplies Completion replies * @param int $completionposts Completion posts * @param bool $displaywordcount Should display word counts in posts * @param int $lockdiscussionafter Timestamp after which discussions should be locked * @param int $duedate Timestamp that represents the due date for forum posts * @param int $cutoffdate Timestamp after which forum posts will no longer be accepted */ public function __construct( context $context, stdClass $coursemodule, stdClass $course, int $effectivegroupmode, int $id, int $courseid, string $type, string $name, string $intro, int $introformat, int $assessed, int $assesstimestart, int $assesstimefinish, int $scale, int $gradeforum, bool $gradeforumnotify, int $maxbytes, int $maxattachments, int $forcesubscribe, int $trackingtype, int $rsstype, int $rssarticles, int $timemodified, int $warnafter, int $blockafter, int $blockperiod, int $completiondiscussions, int $completionreplies, int $completionposts, bool $displaywordcount, int $lockdiscussionafter, int $duedate, int $cutoffdate ) { $this->context = $context; $this->coursemodule = $coursemodule; $this->course = $course; $this->effectivegroupmode = $effectivegroupmode; $this->id = $id; $this->courseid = $courseid; $this->type = $type; $this->name = $name; $this->intro = $intro; $this->introformat = $introformat; $this->assessed = $assessed; $this->assesstimestart = $assesstimestart; $this->assesstimefinish = $assesstimefinish; $this->scale = $scale; $this->gradeforum = $gradeforum; $this->gradeforumnotify = $gradeforumnotify; $this->maxbytes = $maxbytes; $this->maxattachments = $maxattachments; $this->forcesubscribe = $forcesubscribe; $this->trackingtype = $trackingtype; $this->rsstype = $rsstype; $this->rssarticles = $rssarticles; $this->timemodified = $timemodified; $this->warnafter = $warnafter; $this->blockafter = $blockafter; $this->blockperiod = $blockperiod; $this->completiondiscussions = $completiondiscussions; $this->completionreplies = $completionreplies; $this->completionposts = $completionposts; $this->displaywordcount = $displaywordcount; $this->lockdiscussionafter = $lockdiscussionafter; $this->duedate = $duedate; $this->cutoffdate = $cutoffdate; } /** * Get the forum module context. * * @return context */ public function get_context() : context { return $this->context; } /** * Get the forum course module record * * @return stdClass */ public function get_course_module_record() : stdClass { return $this->coursemodule; } /** * Get the effective group mode. * * @return int */ public function get_effective_group_mode() : int { return $this->effectivegroupmode; } /** * Check if the forum is set to group mode. * * @return bool */ public function is_in_group_mode() : bool { return $this->get_effective_group_mode() !== NOGROUPS; } /** * Get the course record. * * @return stdClass */ public function get_course_record() : stdClass { return $this->course; } /** * Get the forum id. * * @return int */ public function get_id() : int { return $this->id; } /** * Get the id of the course that the forum belongs to. * * @return int */ public function get_course_id() : int { return $this->courseid; } /** * Get the forum type. * * @return string */ public function get_type() : string { return $this->type; } /** * Get the forum name. * * @return string */ public function get_name() : string { return $this->name; } /** * Get the forum intro text. * * @return string */ public function get_intro() : string { return $this->intro; } /** * Get the forum intro text format. * * @return int */ public function get_intro_format() : int { return $this->introformat; } /** * Get the rating aggregate. * * @return int */ public function get_rating_aggregate() : int { return $this->assessed; } /** * Does the forum have a rating aggregate? * * @return bool */ public function has_rating_aggregate() : bool { return $this->get_rating_aggregate() != RATING_AGGREGATE_NONE; } /** * Get the timestamp for when the assessment period begins. * * @return int */ public function get_assess_time_start() : int { return $this->assesstimestart; } /** * Get the timestamp for when the assessment period ends. * * @return int */ public function get_assess_time_finish() : int { return $this->assesstimefinish; } /** * Get the rating scale. * * @return int */ public function get_scale() : int { return $this->scale; } /** * Get the grade for the forum when grading holistically. * * @return int */ public function get_grade_for_forum() : int { return $this->gradeforum; } /** * Whether grading is enabled for this item. * * @return bool */ public function is_grading_enabled(): bool { return $this->get_grade_for_forum() !== 0; } /** * Get the default for whether the students should be notified when grading holistically. * * @return bool */ public function should_notify_students_default_when_grade_for_forum(): bool { return $this->gradeforumnotify; } /** * Get the maximum bytes. * * @return int */ public function get_max_bytes() : int { return $this->maxbytes; } /** * Get the maximum number of attachments. * * @return int */ public function get_max_attachments() : int { return $this->maxattachments; } /** * Get the subscription mode. * * @return int */ public function get_subscription_mode() : int { return $this->forcesubscribe; } /** * Is the subscription mode set to optional. * * @return bool */ public function is_subscription_optional() : bool { return $this->get_subscription_mode() === FORUM_CHOOSESUBSCRIBE; } /** * Is the subscription mode set to forced. * * @return bool */ public function is_subscription_forced() : bool { return $this->get_subscription_mode() === FORUM_FORCESUBSCRIBE; } /** * Is the subscription mode set to automatic. * * @return bool */ public function is_subscription_automatic() : bool { return $this->get_subscription_mode() === FORUM_INITIALSUBSCRIBE; } /** * Is the subscription mode set to disabled. * * @return bool */ public function is_subscription_disabled() : bool { return $this->get_subscription_mode() === FORUM_DISALLOWSUBSCRIBE; } /** * Get the tracking type. * * @return int */ public function get_tracking_type() : int { return $this->trackingtype; } /** * Get the RSS type. * * @return int */ public function get_rss_type() : int { return $this->rsstype; } /** * Get the RSS articles. * * @return int */ public function get_rss_articles() : int { return $this->rssarticles; } /** * Get the timestamp for when the forum was last modified. * * @return int */ public function get_time_modified() : int { return $this->timemodified; } /** * Get warn after. * * @return int */ public function get_warn_after() : int { return $this->warnafter; } /** * Get block after. * * @return int */ public function get_block_after() : int { return $this->blockafter; } /** * Get the block period. * * @return int */ public function get_block_period() : int { return $this->blockperiod; } /** * Does the forum have blocking enabled? * * @return bool */ public function has_blocking_enabled() : bool { return !empty($this->get_block_after()) && !empty($this->get_block_period()); } /** * Get the completion discussions. * * @return int */ public function get_completion_discussions() : int { return $this->completiondiscussions; } /** * Get the completion replies. * * @return int */ public function get_completion_replies() : int { return $this->completionreplies; } /** * Get the completion posts. * * @return int */ public function get_completion_posts() : int { return $this->completionposts; } /** * Should the word counts be shown in the posts? * * @return bool */ public function should_display_word_count() : bool { return $this->displaywordcount; } /** * Get the timestamp after which the discussion should be locked. * * @return int */ public function get_lock_discussions_after() : int { return $this->lockdiscussionafter; } /** * Does the forum have a discussion locking timestamp? * * @return bool */ public function has_lock_discussions_after() : bool { return !empty($this->get_lock_discussions_after()); } /** * Check whether the discussion is locked based on forum's time based locking criteria * * @param discussion_entity $discussion * @return bool */ public function is_discussion_time_locked(discussion_entity $discussion) : bool { if (!$this->has_lock_discussions_after()) { return false; } if ($this->get_type() === 'single') { // It does not make sense to lock a single discussion forum. return false; } return (($discussion->get_time_modified() + $this->get_lock_discussions_after()) < time()); } /** * Get the cutoff date. * * @return int */ public function get_cutoff_date() : int { return $this->cutoffdate; } /** * Does the forum have a cutoff date? * * @return bool */ public function has_cutoff_date() : bool { return !empty($this->get_cutoff_date()); } /** * Is the cutoff date for the forum reached? * * @return bool */ public function is_cutoff_date_reached() : bool { if ($this->has_cutoff_date() && ($this->get_cutoff_date() < time())) { return true; } return false; } /** * Get the due date. * * @return int */ public function get_due_date() : int { return $this->duedate; } /** * Does the forum have a due date? * * @return bool */ public function has_due_date() : bool { return !empty($this->get_due_date()); } /** * Is the due date for the forum reached? * * @return bool */ public function is_due_date_reached() : bool { if ($this->has_due_date() && ($this->get_due_date() < time())) { return true; } return false; } /** * Is the discussion locked? - Takes into account both discussion settings AND forum's criteria * * @param discussion_entity $discussion The discussion to check * @return bool */ public function is_discussion_locked(discussion_entity $discussion) : bool { if ($discussion->is_locked()) { return true; } return $this->is_discussion_time_locked($discussion); } }