MDL-40992 quiz: let students to redo questions within an attempt
[moodle.git] / question / behaviour / behaviourtypebase.php
CommitLineData
f3460297
TH
1<?php
2// This file is part of Moodle - http://moodle.org/
3//
4// Moodle is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// Moodle is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
16
17/**
18 * Defines the question behaviour type base class
19 *
20 * @package core
21 * @subpackage questionbehaviours
22 * @copyright 2012 The Open University
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24 */
25
26
27defined('MOODLE_INTERNAL') || die();
28
29
30/**
31 * This class represents the type of behaviour, rather than the instance of the
32 * behaviour which control a particular question attempt.
33 *
34 * @copyright 2012 The Open University
35 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36 */
37abstract class question_behaviour_type {
38 /**
39 * Certain behaviours are definitive of a way that questions can behave when
40 * attempted. For example deferredfeedback model, interactive model, etc.
41 * These are the options that should be listed in the user-interface, and
42 * for these behaviours this method should return true. Other behaviours are
43 * more implementation details, for example the informationitem behaviours,
44 * or a special subclass like interactive_adapted_for_my_qtype. These
45 * behaviours should return false.
46 * @return bool whether this is an archetypal behaviour.
47 */
48 public function is_archetypal() {
49 return false;
50 }
51
52 /**
53 * Override this method if there are some display options that do not make
54 * sense 'during the attempt'.
55 * @return array of {@link question_display_options} field names, that are
56 * not relevant to this behaviour before a 'finish' action.
57 */
58 public function get_unused_display_options() {
59 return array();
60 }
61
62 /**
63 * Adjust a random guess score for a question using this model. You have to
64 * do this without knowing details of the specific question, or which usage
65 * it is in.
66 * @param number $fraction the random guess score from the question type.
67 * @return number the adjusted fraction.
68 */
69 public function adjust_random_guess_score($fraction) {
70 return $fraction;
71 }
474aa125
TH
72
73 /**
74 * Get summary information about a queston usage.
75 *
76 * Behaviours are not obliged to do anything here, but this is an opportunity
77 * to provide additional information that can be displayed in places like
78 * at the top of the quiz review page.
79 *
80 * In the return value, the array keys should be identifiers of the form
81 * qbehaviour_behaviourname_meaningfullkey. For qbehaviour_deferredcbm_highsummary.
82 * The values should be arrays with two items, title and content. Each of these
83 * should be either a string, or a renderable.
84 *
85 * To understand how to implement this method, look at the CBM behaviours,
86 * and their unit tests.
87 *
88 * @param question_usage_by_activity $quba the usage to provide summary data for.
474aa125
TH
89 * @return array as described above.
90 */
91 public function summarise_usage(question_usage_by_activity $quba,
92 question_display_options $options) {
93 return array();
94 }
99caa248
JP
95
96 /**
97 * Does this question behaviour accept multiple submissions of responses within one attempt eg. multiple tries for the
98 * interactive or adaptive question behaviours.
99 *
100 * @return bool
101 */
102 public function allows_multiple_submitted_responses() {
103 return false;
104 }
1700bd4d
K
105
106 /**
107 * Allow user to reattmpt graded question during a quiz attempt
108 * @return boolean
109 */
110 public function user_can_reattempt_graded_question() {
111 return false;
112 }
f3460297
TH
113}
114
115
116/**
117 * This class exists to allow behaviours that worked in Moodle 2.3 to continue
118 * to work. It implements the question_behaviour_type API for the other behaviour
119 * as much as possible in a backwards-compatible way.
120 *
121 * @copyright 2012 The Open University
122 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
123 */
124class question_behaviour_type_fallback extends question_behaviour_type {
125
126 /** @var string the behaviour class name. */
127 protected $behaviourclass;
128
129 /**
130 * @param string $behaviourtype the type of behaviour we are providing a fallback for.
131 */
132 public function __construct($behaviour) {
133 question_engine::load_behaviour_class($behaviour);
134 $this->behaviourclass = 'qbehaviour_' . $behaviour;
135 }
136
137 public function is_archetypal() {
138 return constant($this->behaviourclass . '::IS_ARCHETYPAL');
139 }
140
141 /**
142 * Override this method if there are some display options that do not make
143 * sense 'during the attempt'.
144 * @return array of {@link question_display_options} field names, that are
145 * not relevant to this behaviour before a 'finish' action.
146 */
147 public function get_unused_display_options() {
148 return call_user_func(array($this->behaviourclass, 'get_unused_display_options'));
149 }
150
151 /**
152 * Adjust a random guess score for a question using this model. You have to
153 * do this without knowing details of the specific question, or which usage
154 * it is in.
155 * @param number $fraction the random guess score from the question type.
156 * @return number the adjusted fraction.
157 */
158 public function adjust_random_guess_score($fraction) {
159 return call_user_func(array($this->behaviourclass, 'adjust_random_guess_score'),
160 $fraction);
161 }
162}