. namespace mod_subsection; use cm_info; use context_module; use completion_info; use core_courseformat\formatactions; use mod_subsection\event\course_module_viewed; use moodle_page; use section_info; use stdClass; /** * Class manager for subsection * * @package mod_subsection * @copyright 2023 Amaia Anabitarte * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class manager { /** Module name. */ const MODULE = 'subsection'; /** The plugin name. */ const PLUGINNAME = 'mod_subsection'; /** @var string plugin path. */ public $path; /** @var stdClass course_module record. */ private $instance; /** @var context_module the current context. */ private $context; /** @var cm_info course_modules record. */ private $cm; /** * Class constructor. * * @param cm_info $cm course module info object * @param stdClass $instance activity instance object. */ public function __construct(cm_info $cm, stdClass $instance) { global $CFG; $this->cm = $cm; $this->instance = $instance; $this->context = context_module::instance($cm->id); $this->instance->cmidnumber = $cm->idnumber; $this->path = $CFG->dirroot . '/mod/' . self::MODULE; } /** * Create a manager instance from an instance record. * * @param stdClass $instance an activity record * @return manager */ public static function create_from_instance(stdClass $instance): self { $cm = get_coursemodule_from_instance(self::MODULE, $instance->id); // Ensure that $this->cm is a cm_info object. $cm = cm_info::create($cm); return new self($cm, $instance); } /** * Create a manager instance from a course_modules record. * * @param stdClass|cm_info $cm an activity record * @return manager */ public static function create_from_coursemodule($cm): self { global $DB; // Ensure that $this->cm is a cm_info object. $cm = cm_info::create($cm); $instance = $DB->get_record(self::MODULE, ['id' => $cm->instance], '*', MUST_EXIST); return new self($cm, $instance); } /** * Create a manager instance from a record id. * * @param int $courseid the course id * @param int $id an activity id * @return manager */ public static function create_from_id(int $courseid, int $id): self { $cm = get_coursemodule_from_instance('subsection', $id, $courseid); return self::create_from_coursemodule($cm); } /** * Create a manager instance from a subsection_record entry. * * @param stdClass $record the subsection_record record * @return manager */ public static function create_from_data_record($record): self { global $DB; $instance = $DB->get_record(self::MODULE, ['id' => $record->dataid], '*', MUST_EXIST); $cm = get_coursemodule_from_instance(self::MODULE, $instance->id); $cm = cm_info::create($cm); return new self($cm, $instance); } /** * Return the current context. * * @return context_module */ public function get_context(): context_module { return $this->context; } /** * Return the current instance. * * @return stdClass the instance record */ public function get_instance(): stdClass { return $this->instance; } /** * Return the current cm_info. * * @return cm_info the course module */ public function get_coursemodule(): cm_info { return $this->cm; } /** * Return the current module renderer. * * @param moodle_page|null $page the current page * @return \mod_subsection_renderer the module renderer */ public function get_renderer(?moodle_page $page = null): \mod_subsection_renderer { global $PAGE; $page = $page ?? $PAGE; return $page->get_renderer(self::PLUGINNAME); } /** * Trigger module viewed event and set the module viewed for completion. * * @param stdClass $course course object */ public function set_module_viewed(stdClass $course) { global $CFG; require_once($CFG->libdir . '/completionlib.php'); // Trigger module viewed event. $event = course_module_viewed::create([ 'objectid' => $this->instance->id, 'context' => $this->context, ]); $event->add_record_snapshot('course', $course); $event->add_record_snapshot('course_modules', $this->cm); $event->add_record_snapshot(self::MODULE, $this->instance); $event->trigger(); // Completion. $completion = new completion_info($course); $completion->set_module_viewed($this->cm); } /** * Get the delegated section info. * * @return section_info|null the delegated section info */ public function get_delegated_section_info(): ?section_info { $delegatedsection = $this->cm->get_delegated_section_info(); if (!$delegatedsection) { // Some restorations can produce a situation where the section is not found. // In that case, we create a new one. $delegatedsection = formatactions::section($this->cm->course)->create_delegated( self::PLUGINNAME, $this->cm->instance, (object) [ 'name' => $this->cm->name, 'visible' => $this->cm->visible, 'availability' => (!empty($this->cm->availability)) ? $this->cm->availability : null, ], ); } return $delegatedsection; } }