Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.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 qbank_usage;

/**
 * Helper class for usage.
 *
 * @package    qbank_usage
 * @copyright  2021 Catalyst IT Australia Pty Ltd
 * @author     Safat Shahin <safatshahin@catalyst-au.net>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class helper {

    /**
     * Get the usage count for a question.
     *
     * @param \question_definition $question
> * @param bool $specificversion Count usages just for this version of the question?
* @return int */
< public static function get_question_entry_usage_count($question) {
> public static function get_question_entry_usage_count($question, bool $specificversion = false) {
global $DB;
< $sql = 'SELECT COUNT(*) FROM (' . self::question_usage_sql() . ') quizid';
> $sql = 'SELECT COUNT(*) FROM (' . self::question_usage_sql($specificversion) . ') quizid';
< return $DB->count_records_sql($sql, [$question->id, $question->questionbankentryid, 'mod_quiz', 'slot']);
> $params = [$question->id, $question->questionbankentryid, 'mod_quiz', 'slot']; > if ($specificversion) { > $params[] = $question->id; > } > > return $DB->count_records_sql($sql, $params);
} /** * Get the sql for usage data. *
> * @param bool $specificversion Count usages just for this version of the question?
* @return string */
< public static function question_usage_sql(): string { < $sqlset = "(". self::get_question_attempt_usage_sql() .")".
> public static function question_usage_sql(bool $specificversion = false): string { > $sqlset = "(". self::get_question_attempt_usage_sql($specificversion) .")".
"UNION".
< "(". self::get_question_bank_usage_sql() .")";
> "(". self::get_question_bank_usage_sql($specificversion) .")";
return $sqlset; } /** * Get question attempt count for the question. * * @param int $questionid * @param int $quizid * @return int */ public static function get_question_attempts_count_in_quiz(int $questionid, $quizid = null): int { global $DB; if ($quizid) { $sql = 'SELECT COUNT(qatt.id) FROM {quiz} qz JOIN {quiz_attempts} qa ON qa.quiz = qz.id JOIN {question_usages} qu ON qu.id = qa.uniqueid JOIN {question_attempts} qatt ON qatt.questionusageid = qu.id JOIN {question} q ON q.id = qatt.questionid WHERE qatt.questionid = :questionid AND qa.preview = 0 AND qz.id = :quizid'; $param = ['questionid' => $questionid, 'quizid' => $quizid]; } else { $sql = 'SELECT COUNT(qatt.id) FROM {quiz_slots} qs JOIN {quiz_attempts} qa ON qa.quiz = qs.quizid JOIN {question_usages} qu ON qu.id = qa.uniqueid JOIN {question_attempts} qatt ON qatt.questionusageid = qu.id JOIN {question} q ON q.id = qatt.questionid WHERE qatt.questionid = ? AND qa.preview = 0'; $param = ['questionid' => $questionid]; } return $DB->count_records_sql($sql, $param); } /** * Get the question bank usage sql. * * The resulting string which represents a sql query has then to be * called accompanying a $params array which includes the necessary * parameters in the correct order which are the question id, then * the component and finally the question area. *
> * @param bool $specificversion Count usages just for this version of the question?
* @return string */
< public static function get_question_bank_usage_sql(): string {
> public static function get_question_bank_usage_sql(bool $specificversion = false): string {
$sql = "SELECT qz.id as quizid, qz.name as modulename, qz.course as courseid FROM {quiz_slots} slot JOIN {quiz} qz ON qz.id = slot.quizid JOIN {question_references} qr ON qr.itemid = slot.id JOIN {question_bank_entries} qbe ON qbe.id = qr.questionbankentryid JOIN {question_versions} qv ON qv.questionbankentryid = qbe.id WHERE qv.questionbankentryid = ? AND qr.component = ? AND qr.questionarea = ?";
> return $sql; > if ($specificversion) { } > // Only get results where the reference matches the specific question ID that was requested, > // or the question ID that's requested is the latest version, and the reference is set to null (always latest version). /** > $sql .= " AND qv.questionid = ? * Get the question attempt usage sql. > AND ( * > qv.version = qr.version * The resulting string which represents a sql query has then to be > OR ( * called accompanying a $params array which includes the necessary > qr.version IS NULL * parameter, the question id. > AND qv.version = ( * > SELECT MAX(qv1.version) * @return string > FROM {question_versions} qv1 */ > WHERE qv1.questionbankentryid = qbe.id public static function get_question_attempt_usage_sql(): string { > ) $sql = "SELECT qz.id as quizid, > ) qz.name as modulename, > )"; qz.course as courseid > }
FROM {quiz} qz
> * @param bool $specificversion Count usages just for this version of the question?
< public static function get_question_attempt_usage_sql(): string {
> public static function get_question_attempt_usage_sql(bool $specificversion = false): string {
JOIN {question_usages} qu ON qu.id = qa.uniqueid
< JOIN {question_attempts} qatt ON qatt.questionusageid = qu.id
> JOIN {question_attempts} qatt ON qatt.questionusageid = qu.id"; > if ($specificversion) { > $sql .= "
JOIN {question} q ON q.id = qatt.questionid WHERE qa.preview = 0 AND q.id = ?";
> } else { return $sql; > $sql .= " } > JOIN {question_versions} qv ON qv.questionid = qatt.questionid > JOIN {question_versions} qv2 ON qv.questionbankentryid = qv2.questionbankentryid > WHERE qa.preview = 0 /** > AND qv2.questionid = ?"; * Get the question last used sql. > }
* * @return string */ public static function get_question_last_used_sql(): string { $sql = "SELECT MAX(qa.timemodified) as lastused FROM {quiz} qz JOIN {quiz_attempts} qa ON qa.quiz = qz.id JOIN {question_usages} qu ON qu.id = qa.uniqueid JOIN {question_attempts} qatt ON qatt.questionusageid = qu.id JOIN {question} q ON q.id = qatt.questionid WHERE qa.preview = 0 AND q.id = ?"; return $sql; } }