moodle-report_usergrades/details.php
Kumi 9923bab2fb
fix: Adds autoload support for external libraries
Integrates Composer's autoloading to streamline library
inclusion, facilitating easier extension and maintenance of
dependencies such as PhpSpreadsheet.
2024-11-25 10:11:20 +01:00

192 lines
9.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
require_once('../../config.php');
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->libdir . '/gradelib.php');
require_once($CFG->libdir . '/tablelib.php');
require_once($CFG->libdir . '/formslib.php');
require_once($CFG->dirroot . '/user/selector/lib.php');
require_once('classes/user_selector.php');
require_once('classes/usergrades_form.php');
require_once('vendor/autoload.php');
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
admin_externalpage_setup('report_usergrades_details', '', null, '', array('capability' => 'report/usergrades:view'));
// Instantiate the form
$mform = new usergrades_form();
// Check if form data is submitted
if ($data = $mform->get_data()) {
$userid = $data->userid;
if (!empty($userid)) {
$user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
$courses = enrol_get_users_courses($user->id, true);
$questions = $DB->get_records('question');
if (isset($data->exportxls)) { // Assume a form field named 'exportxls' for Excel export action
// Create a new Spreadsheet object
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
// Add the user details
$sheet->setCellValue('A' . $row, get_string('username', 'report_usergrades'));
$sheet->setCellValue('B' . $row, $user->username);
$row++;
$sheet->setCellValue('A' . $row, get_string('firstname', 'report_usergrades'));
$sheet->setCellValue('B' . $row, $user->firstname);
$row++;
$sheet->setCellValue('A' . $row, get_string('lastname', 'report_usergrades'));
$sheet->setCellValue('B' . $row, $user->lastname);
$row++;
$sheet->setCellValue('A' . $row, get_string('email', 'report_usergrades'));
$sheet->setCellValue('B' . $row, $user->email);
$row += 2; // Extra space before courses
// Start iterating the courses
foreach ($courses as $course) {
$sheet->setCellValue('A' . $row, get_string('course', 'report_usergrades') . ': ' . $course->fullname);
$row++;
$quizzes = $DB->get_records('quiz', array('course' => $course->id));
if ($quizzes) {
foreach ($quizzes as $quiz) {
$quiz_attempts = $DB->get_records('quiz_attempts', array('quiz' => $quiz->id, 'userid' => $user->id));
if ($quiz_attempts) {
$sheet->setCellValue('A' . $row, get_string('quiz', 'report_usergrades') . ': ' . $quiz->name);
$row++;
foreach ($quiz_attempts as $attempt) {
$sheet->setCellValue('A' . $row, get_string('attempt', 'report_usergrades') . ' ' . $attempt->attempt);
$row++;
$sheet->setCellValue('A' . $row, get_string('question', 'report_usergrades'));
$sheet->setCellValue('B' . $row, get_string('response', 'report_usergrades'));
$sheet->setCellValue('C' . $row, get_string('grade', 'report_usergrades'));
$row++;
$question_usages = $DB->get_records('question_usages', array('id' => $attempt->uniqueid));
foreach ($question_usages as $question_usage) {
$question_attempts = $DB->get_records('question_attempts', array('questionusageid' => $question_usage->id));
foreach ($question_attempts as $question_attempt) {
$question = $questions[$question_attempt->questionid];
$response = $question_attempt->responsesummary;
$question_grades = $DB->get_records('question_attempt_steps', array('questionattemptid' => $question_attempt->id));
foreach ($question_grades as $question_grade) {
if ($question_grade->fraction) {
$sheet->setCellValue('A' . $row, $question->name . ': ' . $question->questiontext);
$sheet->setCellValue('B' . $row, $response);
$sheet->setCellValue('C' . $row, $question_grade->fraction);
$row++;
}
}
}
}
$total_grade = $DB->get_record('quiz_grades', array('quiz' => $quiz->id, 'userid' => $user->id));
$sheet->setCellValue('A' . $row, get_string('totalgrade', 'report_usergrades') . ': ' . $total_grade->grade . ' / ' . $quiz->grade);
$row += 2; // Extra space before next attempt or quiz
}
}
}
}
$row += 2; // Extra space between courses
}
// Create writer and output the file
$writer = new Xlsx($spreadsheet);
$filename = 'user_grades_' . $user->id . '.xlsx';
// Redirect output to a clients web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
exit();
} else {
// HTML output if not exporting
echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('usergradesreport', 'report_usergrades'));
echo $OUTPUT->heading(get_string('userdetails', 'report_usergrades'), 3);
$user_table = new html_table();
$user_table->head = array(get_string('field', 'report_usergrades'), get_string('value', 'report_usergrades'));
$user_table->data[] = array(get_string('username', 'report_usergrades'), $user->username);
$user_table->data[] = array(get_string('firstname', 'report_usergrades'), $user->firstname);
$user_table->data[] = array(get_string('lastname', 'report_usergrades'), $user->lastname);
$user_table->data[] = array(get_string('email', 'report_usergrades'), $user->email);
echo html_writer::table($user_table);
foreach ($courses as $course) {
echo $OUTPUT->heading($course->fullname, 3);
$quizzes = $DB->get_records('quiz', array('course' => $course->id));
if ($quizzes) {
echo $OUTPUT->heading(get_string('quizzes', 'report_usergrades'), 4);
foreach ($quizzes as $quiz) {
$quiz_questions = $DB->get_records('quiz_slots', array('quizid' => $quiz->id));
$quiz_attempts = $DB->get_records('quiz_attempts', array('quiz' => $quiz->id, 'userid' => $user->id));
if ($quiz_attempts) {
echo $OUTPUT->heading($quiz->name, 5);
foreach ($quiz_attempts as $attempt) {
echo $OUTPUT->heading(get_string('attempt', 'report_usergrades') . ' ' . $attempt->attempt, 6);
$attempt_table = new html_table();
$attempt_table->head = array(get_string('question', 'report_usergrades'), get_string('response', 'report_usergrades'), get_string('grade', 'report_usergrades'));
$question_usages = $DB->get_records('question_usages', array('id' => $attempt->uniqueid));
foreach ($question_usages as $question_usage) {
$question_attempts = $DB->get_records('question_attempts', array('questionusageid' => $question_usage->id));
foreach ($question_attempts as $question_attempt) {
$question = $questions[$question_attempt->questionid];
$response = $question_attempt->responsesummary;
$question_grades = $DB->get_records('question_attempt_steps', array('questionattemptid' => $question_attempt->id));
foreach ($question_grades as $question_grade) {
if ($question_grade->fraction) {
$attempt_table->data[] = array($question->name . ': ' . $question->questiontext, $response, $question_grade->fraction);
}
}
}
}
echo html_writer::table($attempt_table);
$total_grade = $DB->get_record('quiz_grades', array('quiz' => $quiz->id, 'userid' => $user->id));
echo $OUTPUT->heading(get_string('totalgrade', 'report_usergrades') . ': ' . $total_grade->grade . ' / ' . $quiz->grade, 6);
}
}
}
}
}
echo $OUTPUT->footer();
}
} else {
echo $OUTPUT->notification(get_string('nouserselected', 'report_usergrades'), 'notifyproblem');
}
} else {
// Show the form
echo $OUTPUT->header();
$mform->display();
echo $OUTPUT->footer();
}