-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathrule.php
129 lines (111 loc) · 5.23 KB
/
rule.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
<?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/>.
/**
* Implementaton of the quizaccess_offlinemode plugin.
*
* @package quizaccess_offlinemode
* @copyright 2011 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once($CFG->dirroot . '/mod/quiz/accessrule/accessrulebase.php');
/**
* The access rule class implementation for the quizaccess_offlinemode plugin.
*
* A rule that hijacks the standard attempt.php page, and replaces it with
* different script which loads all the questions at once and then allows the
* student to keep working, even if the network connection is lost. However,
* if the network is working, responses are saved back to the server.
*
* @copyright 2014 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class quizaccess_offlinemode extends quiz_access_rule_base {
/** @var string the URL path to our replacement attempt script. */
const ATTEMPT_URL = '/mod/quiz/accessrule/offlinemode/attempt.php';
public static function make(quiz $quizobj, $timenow, $canignoretimelimits) {
if (empty($quizobj->get_quiz()->offlinemode_enabled) ||
!self::is_compatible_behaviour($quizobj->get_quiz()->preferredbehaviour)) {
return null;
}
return new self($quizobj, $timenow);
}
public static function add_settings_form_fields(
mod_quiz_mod_form $quizform, MoodleQuickForm $mform) {
$config = get_config('quizaccess_offlinemode');
$mform->addElement('selectyesno', 'offlinemode_enabled',
get_string('offlinemodeenabled', 'quizaccess_offlinemode'));
$mform->addHelpButton('offlinemode_enabled',
'offlinemodeenabled', 'quizaccess_offlinemode');
$mform->setDefault('offlinemode_enabled', !empty($config->defaultenabled));
$mform->setAdvanced('offlinemode_enabled', !empty($config->defaultenabled_adv));
foreach (question_engine::get_behaviour_options(null) as $behaviour => $notused) {
if (!self::is_compatible_behaviour($behaviour)) {
$mform->disabledIf('offlinemode_enabled', 'preferredbehaviour',
'eq', $behaviour);
}
}
}
/**
* Given the quiz "How questions behave" setting, can the fault-tolerant mode work
* with that behaviour?
* @param string $behaviour the internal name (e.g. 'interactive') of an archetypal behaviour.
* @return boolean whether fault-tolerant mode can be used.
*/
public static function is_compatible_behaviour($behaviour) {
$unusedoptions = question_engine::get_behaviour_unused_display_options($behaviour);
// Sorry, double negative here. The heuristic is that:
// The behaviour is compatible if we don't need to show specific feedback during the attempt.
return in_array('specificfeedback', $unusedoptions);
}
public static function save_settings($quiz) {
global $DB;
if (empty($quiz->offlinemode_enabled)) {
$DB->delete_records('quizaccess_offlinemode', array('quizid' => $quiz->id));
} else {
if (!$DB->record_exists('quizaccess_offlinemode', array('quizid' => $quiz->id))) {
$record = new stdClass();
$record->quizid = $quiz->id;
$record->enabled = 1;
$DB->insert_record('quizaccess_offlinemode', $record);
}
}
}
public static function delete_settings($quiz) {
global $DB;
$DB->delete_records('quizaccess_offlinemode', array('quizid' => $quiz->id));
}
public static function get_settings_sql($quizid) {
return array(
'COALESCE(offlinemode.enabled, 0) AS offlinemode_enabled',
'LEFT JOIN {quizaccess_offlinemode} offlinemode ON offlinemode.quizid = quiz.id',
array());
}
public function description() {
if (!$this->quizobj->has_capability('quizaccess/offlinemode:uploadresponses')) {
return '';
}
return get_string('description', 'quizaccess_offlinemode',
html_writer::link(new moodle_url('/mod/quiz/accessrule/offlinemode/upload.php',
array('id' => $this->quizobj->get_cmid())),
get_string('descriptionlink', 'quizaccess_offlinemode')));
}
public function setup_attempt_page($page) {
if ($page->pagetype == 'mod-quiz-attempt' || $page->pagetype == 'mod-quiz-summary') {
redirect(new moodle_url(self::ATTEMPT_URL, $page->url->params()));
}
}
}