AutorÃa | Ultima modificación | Ver Log |
<?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,
];
}
}