2 // This file is part of Moodle - http://moodle.org/
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.
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.
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/>.
18 * Defines the question behaviour type base class
21 * @subpackage questionbehaviours
22 * @copyright 2012 The Open University
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27 defined('MOODLE_INTERNAL') ||
die();
31 * This class represents the type of behaviour, rather than the instance of the
32 * behaviour which control a particular question attempt.
34 * @copyright 2012 The Open University
35 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
37 abstract class question_behaviour_type
{
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.
48 public function is_archetypal() {
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.
58 public function get_unused_display_options() {
63 * With this behaviour, is it possible that a question might finish as the student
64 * interacts with it, without a call to the {@link question_attempt::finish()} method?
65 * @return bool whether with this behaviour, questions may finish naturally.
67 public function can_questions_finish_during_the_attempt() {
72 * Adjust a random guess score for a question using this model. You have to
73 * do this without knowing details of the specific question, or which usage
75 * @param number $fraction the random guess score from the question type.
76 * @return number the adjusted fraction.
78 public function adjust_random_guess_score($fraction) {
83 * Get summary information about a queston usage.
85 * Behaviours are not obliged to do anything here, but this is an opportunity
86 * to provide additional information that can be displayed in places like
87 * at the top of the quiz review page.
89 * In the return value, the array keys should be identifiers of the form
90 * qbehaviour_behaviourname_meaningfullkey. For qbehaviour_deferredcbm_highsummary.
91 * The values should be arrays with two items, title and content. Each of these
92 * should be either a string, or a renderable.
94 * To understand how to implement this method, look at the CBM behaviours,
95 * and their unit tests.
97 * @param question_usage_by_activity $quba the usage to provide summary data for.
98 * @return array as described above.
100 public function summarise_usage(question_usage_by_activity
$quba,
101 question_display_options
$options) {
106 * Does this question behaviour accept multiple submissions of responses within one attempt eg. multiple tries for the
107 * interactive or adaptive question behaviours.
111 public function allows_multiple_submitted_responses() {
118 * This class exists to allow behaviours that worked in Moodle 2.3 to continue
119 * to work. It implements the question_behaviour_type API for the other behaviour
120 * as much as possible in a backwards-compatible way.
122 * @copyright 2012 The Open University
123 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
125 class question_behaviour_type_fallback
extends question_behaviour_type
{
127 /** @var string the behaviour class name. */
128 protected $behaviourclass;
131 * @param string $behaviourtype the type of behaviour we are providing a fallback for.
133 public function __construct($behaviour) {
134 question_engine
::load_behaviour_class($behaviour);
135 $this->behaviourclass
= 'qbehaviour_' . $behaviour;
138 public function is_archetypal() {
139 return constant($this->behaviourclass
. '::IS_ARCHETYPAL');
143 * Override this method if there are some display options that do not make
144 * sense 'during the attempt'.
145 * @return array of {@link question_display_options} field names, that are
146 * not relevant to this behaviour before a 'finish' action.
148 public function get_unused_display_options() {
149 return call_user_func(array($this->behaviourclass
, 'get_unused_display_options'));
153 * Adjust a random guess score for a question using this model. You have to
154 * do this without knowing details of the specific question, or which usage
156 * @param number $fraction the random guess score from the question type.
157 * @return number the adjusted fraction.
159 public function adjust_random_guess_score($fraction) {
160 return call_user_func(array($this->behaviourclass
, 'adjust_random_guess_score'),