-
Notifications
You must be signed in to change notification settings - Fork 23
/
lib.php
142 lines (127 loc) · 5.56 KB
/
lib.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?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/>.
/**
* Standard callbacks for qtype_pmatch.
*
* @package qtype_pmatch
* @copyright 2012 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Checks file access for pattern-match questions.
*
* Standard callback for question types.
*
* @param stdClass $course
* @param stdClass $cm
* @param context $context
* @param string $filearea
* @param array $args
* @param bool $forcedownload
* @param array $options
*/
function qtype_pmatch_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options= []) {
global $CFG;
require_once($CFG->libdir . '/questionlib.php');
question_pluginfile($course, $context, 'qtype_pmatch', $filearea, $args, $forcedownload, $options);
}
/**
* Used by the testquestion.php and uploadresponse.php scripts to do some initialisation
* that is needed on all of them.
*
* @param qtype_pmatch_question $question the question.
* @return array page context, and URL parameters.
*/
function qtype_pmatch_setup_question_test_page($question) {
global $PAGE;
$urlparams = ['questionid' => $question->id];
// Were we given a particular context to run the question in?
// This affects things like filter settings, or forced theme or language.
$qcontext = $question->get_context();
if ($cmid = optional_param('cmid', 0, PARAM_INT)) {
$cm = get_coursemodule_from_id(false, $cmid);
require_login($cm->course, false, $cm);
$context = context_module::instance($cmid);
$urlparams['cmid'] = $cmid;
} else if ($courseid = optional_param('courseid', 0, PARAM_INT)) {
require_login($courseid);
$context = context_course::instance($courseid);
$urlparams['courseid'] = $courseid;
} else if ($qcontext->contextlevel == CONTEXT_MODULE) {
$cm = get_coursemodule_from_id(false, $qcontext->instanceid);
require_login($cm->course, false, $cm);
$context = $qcontext;
$urlparams['cmid'] = $cm->id;
} else if ($qcontext->contextlevel == CONTEXT_COURSE) {
require_login($qcontext->instanceid);
$context = $qcontext;
$urlparams['courseid'] = $courseid;
} else {
require_login();
$context = $question->get_context();
$PAGE->set_context($context);
// Note that in the other cases, require_login will set the correct page context.
}
return [$context, $urlparams];
}
/**
* Renders element for inline editing.
*
* @param string $itemtype type of response item.
* @param int $itemid an item id.
* @param mixed $newvalue new given response.
* @return \core\output\inplace_editable the in-place editable response.
*/
function qtype_pmatch_inplace_editable($itemtype, $itemid, $newvalue): \core\output\inplace_editable {
global $CFG, $DB;
require_once($CFG->libdir . '/questionlib.php');
require_once($CFG->dirroot . '/question/type/pmatch/externallib.php');
if ($itemtype === 'responsetable') {
$responses = qtype_pmatch\testquestion_responses::get_responses_by_ids([$itemid]);
$response = $responses[$itemid];
$question = question_bank::load_question($response->questionid);
$context = $question->get_context();
external_api::validate_context($context);
require_capability('moodle/question:editall', $context);
// Clean input and update the record.
$newvalue = trim($newvalue);
if ($newvalue !== $response->response) {
if (!strlen($newvalue) > 0) {
throw new moodle_exception('error:blank', 'qtype_pmatch');
} else {
$duplicated = \qtype_pmatch\testquestion_responses::check_duplicate_response(
$response->questionid, $newvalue);
if ($duplicated) {
throw new moodle_exception('testquestionformduplicateresponse', 'qtype_pmatch');
}
}
$response->response = $newvalue;
$DB->update_record('qtype_pmatch_test_responses',
(object) ['id' => $itemid, 'response' => $newvalue]);
$result = qtype_pmatch_external::update_computed_mark_and_get_row_response($response->id, $question, null);
// An json string pass value to updater.js file.
$responsevalue = json_encode(['html' => $result['html'],
'summary' => get_string('testquestionresultssummary', 'qtype_pmatch', $result['counts'])]);
} else {
$responsevalue = $response->response;
}
// Prepare the element for the output.
$editresponse = get_string('testquestioneditresponse', 'qtype_pmatch');
return new \core\output\inplace_editable('qtype_pmatch', 'responsetable', $response->id,
true, s($response->response), $responsevalue, $editresponse, $editresponse);
}
throw new coding_exception('Unexpected item type in qtype_pmatch_inplace_editable.');
}