233 lines
7.4 KiB
PHP
233 lines
7.4 KiB
PHP
<?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/>.
|
|
|
|
namespace core_courseformat;
|
|
|
|
use coding_exception;
|
|
use core_courseformat\base as course_format;
|
|
use renderer_base;
|
|
use stdClass;
|
|
use course_modinfo;
|
|
use JsonSerializable;
|
|
|
|
/**
|
|
* Class to track state actions.
|
|
*
|
|
* The methods from this class should be executed via "stateactions" methods.
|
|
*
|
|
* Each format plugin could extend this class to provide new updates to the frontend
|
|
* mutation module.
|
|
* Extended classes should be located in "format_XXX\course" namespace and
|
|
* extends {@see \core_courseformat\stateupdates}.
|
|
*
|
|
* @package core_course
|
|
* @copyright 2021 Ferran Recio <ferran@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class stateupdates implements JsonSerializable {
|
|
|
|
/** @var course_format format the course format */
|
|
protected $format;
|
|
|
|
/** @var renderer_base renderer format renderer */
|
|
protected $output;
|
|
|
|
/** @var array the tracked updates */
|
|
protected $updates;
|
|
|
|
/**
|
|
* State update class constructor.
|
|
*
|
|
* @param course_format $format Course format.
|
|
*/
|
|
public function __construct(course_format $format) {
|
|
global $PAGE;
|
|
|
|
$this->format = $format;
|
|
$this->output = $this->format->get_renderer($PAGE);
|
|
$this->updates = [];
|
|
}
|
|
|
|
/**
|
|
* Return the data to serialize the current track in JSON.
|
|
*
|
|
* @return stdClass the statement data structure
|
|
*/
|
|
public function jsonSerialize(): array {
|
|
return $this->updates;
|
|
}
|
|
|
|
/**
|
|
* Add track about a general course state change.
|
|
*/
|
|
public function add_course_put(): void {
|
|
$courseclass = $this->format->get_output_classname('state\\course');
|
|
$currentstate = new $courseclass($this->format);
|
|
$this->add_update('course', 'put', $currentstate->export_for_template($this->output));
|
|
}
|
|
|
|
/**
|
|
* Add track about a section state put.
|
|
*
|
|
* @param int $sectionid The affected section id.
|
|
*/
|
|
public function add_section_put(int $sectionid): void {
|
|
$this->create_or_put_section($sectionid, 'put');
|
|
}
|
|
|
|
/**
|
|
* Add track about a new section created.
|
|
*
|
|
* @param int $sectionid The affected section id.
|
|
*/
|
|
public function add_section_create(int $sectionid): void {
|
|
$this->create_or_put_section($sectionid, 'create');
|
|
}
|
|
|
|
/**
|
|
* Add track about section created or put.
|
|
*
|
|
* @param int $sectionid The affected section id.
|
|
* @param string $action The action to track for the section ('create' or 'put').
|
|
*/
|
|
protected function create_or_put_section(int $sectionid, string $action): void {
|
|
if ($action != 'create' && $action != 'put') {
|
|
throw new coding_exception(
|
|
"Invalid action passed ($action) to create_or_put_section. Only 'create' and 'put' are valid."
|
|
);
|
|
}
|
|
$course = $this->format->get_course();
|
|
$modinfo = course_modinfo::instance($course);
|
|
$format = $this->format;
|
|
|
|
$section = $modinfo->get_section_info_by_id($sectionid, MUST_EXIST);
|
|
|
|
if (!$format->is_section_visible($section)) {
|
|
return;
|
|
}
|
|
|
|
$sectionclass = $format->get_output_classname('state\\section');
|
|
$currentstate = new $sectionclass($this->format, $section);
|
|
|
|
$this->add_update('section', $action, $currentstate->export_for_template($this->output));
|
|
|
|
// If the section is delegated to a component, give the component oportunity to add updates.
|
|
$delegated = $section->get_component_instance();
|
|
if ($delegated) {
|
|
$delegated->put_section_state_extra_updates($section, $this);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add track about a section deleted.
|
|
*
|
|
* @deprecated since Moodle 4.1 MDL-74925 - please call add_section_remove() instead.
|
|
* @param int $sectionid The affected section id.
|
|
*/
|
|
public function add_section_delete(int $sectionid): void {
|
|
debugging('add_section_delete() is deprecated. Please use add_section_remove() instead.', DEBUG_DEVELOPER);
|
|
|
|
$this->add_update('section', 'remove', (object)['id' => $sectionid]);
|
|
}
|
|
|
|
/**
|
|
* Add track about a section removed.
|
|
*
|
|
* @param int $sectionid The affected section id.
|
|
*/
|
|
public function add_section_remove(int $sectionid): void {
|
|
$this->add_update('section', 'remove', (object)['id' => $sectionid]);
|
|
}
|
|
|
|
/**
|
|
* Add track about a course module state update.
|
|
*
|
|
* @param int $cmid the affected course module id
|
|
*/
|
|
public function add_cm_put(int $cmid): void {
|
|
$this->create_or_put_cm($cmid, 'put');
|
|
}
|
|
|
|
/**
|
|
* Add track about a course module created.
|
|
*
|
|
* @param int $cmid the affected course module id
|
|
*/
|
|
public function add_cm_create(int $cmid): void {
|
|
$this->create_or_put_cm($cmid, 'create', true);
|
|
}
|
|
|
|
/**
|
|
* Add track about section created or put.
|
|
*
|
|
* @param int $cmid The affected course module id.
|
|
* @param string $action The action to track for the section ('create' or 'put').
|
|
*/
|
|
protected function create_or_put_cm(int $cmid, string $action): void {
|
|
$modinfo = course_modinfo::instance($this->format->get_course());
|
|
|
|
$cm = $modinfo->get_cm($cmid);
|
|
$section = $modinfo->get_section_info_by_id($cm->section);
|
|
$format = $this->format;
|
|
|
|
if (!$section->uservisible || !$cm->is_visible_on_course_page()) {
|
|
return;
|
|
}
|
|
|
|
$cmclass = $format->get_output_classname('state\\cm');
|
|
$currentstate = new $cmclass($this->format, $section, $cm);
|
|
|
|
$this->add_update('cm', $action, $currentstate->export_for_template($this->output));
|
|
}
|
|
|
|
/**
|
|
* Add track about a course module deleted.
|
|
*
|
|
* @deprecated since Moodle 4.1 MDL-74925 - please call add_cm_remove() instead.
|
|
* @param int $cmid the affected course module id
|
|
*/
|
|
public function add_cm_delete(int $cmid): void {
|
|
debugging('add_cm_delete() is deprecated. Please use add_cm_remove() instead.', DEBUG_DEVELOPER);
|
|
|
|
$this->add_update('cm', 'remove', (object)['id' => $cmid]);
|
|
}
|
|
|
|
/**
|
|
* Add track about a course module removed.
|
|
*
|
|
* @param int $cmid the affected course module id
|
|
*/
|
|
public function add_cm_remove(int $cmid): void {
|
|
$this->add_update('cm', 'remove', (object)['id' => $cmid]);
|
|
}
|
|
|
|
/**
|
|
* Add a valid update message to the update list.
|
|
*
|
|
* @param string $name the update name
|
|
* @param string $action the update action (usually update, create, remove)
|
|
* @param stdClass $fields the object fields
|
|
*/
|
|
protected function add_update(string $name, string $action, stdClass $fields): void {
|
|
$this->updates[] = (object)[
|
|
'name' => $name,
|
|
'action' => $action,
|
|
'fields' => $fields,
|
|
];
|
|
}
|
|
|
|
}
|