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 cm_info;
use core\context\module as module_context;
use core_completion\cm_completion_details;
use core_courseformat\local\overview\overviewitem;
use core_courseformat\output\local\overview\activityname;
use core_courseformat\output\local\overview\overviewpage;
use core_courseformat\base as courseformat;
use grade_item;
use grade_grade;
/**
* Base class for activity overview.
*
* Plugins must extend this class on their \mod_PLUGINNAME\courseformat\overview
* integration to provide overview items about a course module instance.
*
* @package core_courseformat
* @copyright 2025 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class activityoverviewbase {
/** @var cm_info The course module. */
protected module_context $context;
/** @var \stdClass $course */
protected \stdClass $course;
/** @var courseformat $format the course format */
protected courseformat $format;
/**
* Activity Overview Base class constructor.
*
* Overview integrations are meant to use dependency injection.
* Don't create instances of this class directly, use the factory instead.
*
* \core_courseformat\local\overview\overviewfactory::create($cm);
*
* Plugins can override the constructor adding more dependencies such as:
*
* - protected readonly \moodle_database $db -> To access the database.
* - protected readonly \core\clock $clock -> The clock interface to handle time.
*
* However, it is important to note all original dependencies must be kept.
*
* @param cm_info $cm The course module information (loaded by the factory).
*/
public function __construct(
/** @var cm_info The course module. */
protected readonly cm_info $cm,
) {
$this->context = $cm->context;
$this->course = $cm->get_course();
$this->format = courseformat::instance($this->course);
}
/**
* Redirects to the overview page for the activity.
*
* @param int $courseid The course id.
* @param string $modname The module name.
*/
public static function redirect_to_overview_page(int $courseid, string $modname): void {
redirect(overviewpage::get_modname_url($courseid, $modname));
}
/**
* Get the plugin specific overview items for the activity.
*
* Plugins can override this method to provide their own overview items.
*
* The resulting array must be indexed by item shortname.
*
* @return overviewitem[] Array of overview items indexed by item shortname.
*/
public function get_extra_overview_items(): array {
return [];
}
/**
* Get the name of the activity.
*/
final public function get_name_overview(): overviewitem {
return new overviewitem(
name: get_string('name'),
value: $this->cm->name,
content: new activityname($this->cm),
);
}
/**
* Retrieves the due date overview for the activity.
*
* @return overviewitem|null null if module does not have a due date.
*/
public function get_due_date_overview(): ?overviewitem {
return null;
}
/**
* Retrieves the actions overview for the activity.
*
* @return overviewitem|null null if module does not have a main action item.
*/
public function get_actions_overview(): ?overviewitem {
return null;
}
/**
* Retrieves the completion overview for the activity.
*
* @return overviewitem|null null if completion is not enabled.
*/
public function get_completion_overview(): ?overviewitem {
global $USER;
$showcompletionconditions = $this->course->showcompletionconditions == COMPLETION_SHOW_CONDITIONS;
$completiondetails = cm_completion_details::get_instance(
$this->cm,
$USER->id,
$showcompletionconditions
);
if (!$completiondetails->is_tracked_user()) {
return null;
}
$showcompletioninfo = $completiondetails->has_completion() &&
($showcompletionconditions || $completiondetails->show_manual_completion());
if (!$showcompletioninfo) {
return new overviewitem(
name: get_string('completion_status', 'completion'),
value: null,
content: '-',
);
}
$status = $completiondetails->get_overall_completion();
$completionclass = $this->format->get_output_classname('content\\cm\\completion');
/** @var \core_courseformat\output\local\content\cm\completion $completion */
$completion = new $completionclass(
$this->format,
$this->cm->get_section_info(),
$this->cm
);
$completion->set_smallbutton(false);
return new overviewitem(
name: get_string('completion_status', 'completion'),
value: $status,
content: $completion,
);
}
/**
* Retrieves the grades overview items for the activity.
*
* Most activities will have none or one grade. However, some activities
* may have multiple grades, such as workshop or quiz.
*
* It is not recommended to override this method unless the plugin
* has specific requirements. Instead, plugins should override
* get_grade_item_names to provide the grade item names.
*
* @return overviewitem[] Array of overview items representing the grades.
*/
public function get_grades_overviews(): array {
global $CFG, $USER;
// This overview is to see the own grades, users with full gradebook
// access will see all grades in the gradebook.
if (has_capability('moodle/grade:viewall', $this->context)) {
return [];
}
if (!plugin_supports('mod', $this->cm->modname, FEATURE_GRADE_HAS_GRADE, false)) {
return [];
}
require_once($CFG->libdir . '/gradelib.php');
$items = grade_item::fetch_all([
'itemtype' => 'mod',
'itemmodule' => $this->cm->modname,
'iteminstance' => $this->cm->instance,
'courseid' => $this->course->id,
]);
if (empty($items)) {
return [];
}
$itemnames = $this->get_grade_item_names($items);
$result = [];
foreach ($items as $item) {
// Plugins may decide to hide a specific grade item by not setting a name.
if (empty($itemnames[$item->id])) {
continue;
}
$gradegrade = grade_grade::fetch(['itemid' => $item->id, 'userid' => $USER->id]);
if ((!$gradegrade || ($gradegrade->is_hidden() && !has_capability('moodle/grade:viewhidden', $this->context)))) {
if ($item->is_gradable()) {
$result[] = new overviewitem(
name: $itemnames[$item->id],
value: '-',
content: '-',
);
}
continue;
}
$result[] = new overviewitem(
name: $itemnames[$item->id],
value: $gradegrade->finalgrade,
content: grade_format_gradevalue($gradegrade->finalgrade, $item),
);
}
return $result;
}
/**
* Retrieves the grade item names for the activity.
*
* By default, the overview will display the grade if the activities
* has only one grade item. The name of the grade item will be 'Grade'.
* For plugins with multiple grade items, the plugin must override this method
* and provide names for each grade item that want to be displayed.
*
* @param grade_item[] $items
* @return array<integer, string> the grade item names indexed by item id.
*/
protected function get_grade_item_names(array $items): array {
if (count($items) == 1) {
return [reset($items)->id => get_string('gradenoun')];
}
return [];
}
}