<?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/>.
/**
* H5P activity participants report
*
* @package mod_h5pactivity
* @since Moodle 3.9
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_h5pactivity\local\report;
use mod_h5pactivity\local\report;
use mod_h5pactivity\local\manager;
use mod_h5pactivity\local\attempt;
use core\dml\sql_join;
use table_sql;
use moodle_url;
use html_writer;
use stdClass;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->libdir.'/tablelib.php');
/**
* Class H5P activity participants report.
*
* @package mod_h5pactivity
* @since Moodle 3.9
* @copyright 2020 Ferran Recio <ferran@moodle.com>
*/
class participants extends table_sql implements report {
/** @var manager the H5P activity manager instance. */
private $manager;
/** @var array the users scored attempts. */
private $scores;
/** @var array the user attempts count. */
private $count;
/**
* Create a new participants report.
*
* @param manager $manager h5pactivitymanager object
> * @param int|bool $currentgroup False if groups not used, 0 for all groups, group id (int) to filter by specific group
*/
< public function __construct(manager $manager) {
> public function __construct(manager $manager, $currentgroup = false) {
parent::__construct('mod_h5pactivity-participants');
$this->manager = $manager;
$this->scores = $manager->get_users_scaled_score();
$this->count = $manager->count_users_attempts();
// Setup table_sql.
$columns = ['fullname', 'timemodified', 'score', 'attempts'];
$headers = [
get_string('fullname'), get_string('date'),
get_string('score', 'mod_h5pactivity'), get_string('attempts', 'mod_h5pactivity'),
];
$this->define_columns($columns);
$this->define_headers($headers);
$this->set_attribute('class', 'generaltable generalbox boxaligncenter boxwidthwide');
$this->sortable(true);
$this->no_sorting('score');
$this->no_sorting('timemodified');
$this->no_sorting('attempts');
$this->pageable(true);
< $capjoin = $this->manager->get_active_users_join(true);
> $capjoin = $this->manager->get_active_users_join(true, $currentgroup);
// Final SQL.
$this->set_sql(
'DISTINCT u.id, u.picture, u.firstname, u.lastname, u.firstnamephonetic, u.lastnamephonetic,
u.middlename, u.alternatename, u.imagealt, u.email',
"{user} u $capjoin->joins",
$capjoin->wheres,
$capjoin->params);
}
/**
* Return the report user record.
*
* Participants report has no specific user.
*
* @return stdClass|null a user or null
*/
public function get_user(): ?stdClass {
return null;
}
/**
* Return the report attempt object.
*
* Participants report has no specific attempt.
*
* @return attempt|null the attempt object or null
*/
public function get_attempt(): ?attempt {
return null;
}
/**
* Print the report.
*/
public function print(): void {
global $PAGE, $OUTPUT;
$this->define_baseurl($PAGE->url);
<
< echo $OUTPUT->heading(get_string('attempts_report', 'mod_h5pactivity'));
$this->out($this->get_page_size(), true);
}
/**
* Warning in case no user has the selected initials letters.
*
*/
public function print_nothing_to_display() {
global $OUTPUT;
echo $this->render_reset_button();
$this->print_initials_bar();
echo $OUTPUT->notification(get_string('noparticipants', 'mod_h5pactivity'), 'warning');
}
/**
* Generate the fullname column.
*
* @param stdClass $user
* @return string
*/
public function col_fullname($user): string {
global $OUTPUT;
$cm = $this->manager->get_coursemodule();
return $OUTPUT->user_picture($user, ['size' => 35, 'courseid' => $cm->course, 'includefullname' => true]);
}
/**
* Generate score column.
*
* @param stdClass $user the user record
* @return string
*/
public function col_score(stdClass $user): string {
$cm = $this->manager->get_coursemodule();
if (isset($this->scores[$user->id])) {
$score = $this->scores[$user->id];
$maxgrade = floatval(100);
$scaled = round($maxgrade * $score->scaled).'%';
if (empty($score->attemptid)) {
return $scaled;
} else {
$url = new moodle_url('/mod/h5pactivity/report.php', ['a' => $cm->instance, 'attemptid' => $score->attemptid]);
return html_writer::link($url, $scaled);
}
}
return '';
}
/**
* Generate attempts count column, if any.
*
* @param stdClass $user the user record
* @return string
*/
public function col_attempts(stdClass $user): string {
$cm = $this->manager->get_coursemodule();
if (isset($this->count[$user->id])) {
$msg = get_string('review_user_attempts', 'mod_h5pactivity', $this->count[$user->id]);
$url = new moodle_url('/mod/h5pactivity/report.php', ['a' => $cm->instance, 'userid' => $user->id]);
return html_writer::link($url, $msg);
}
return '';
}
/**
* Generate attempt timemodified column, if any.
*
* @param stdClass $user the user record
* @return string
*/
public function col_timemodified(stdClass $user): string {
if (isset($this->scores[$user->id])) {
$score = $this->scores[$user->id];
return userdate($score->timemodified);
}
return '';
}
}