Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
<?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); } }