Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is 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/>.

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));
    }

    /**
     * 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, ]; } }