weekly release 2.6dev
[moodle.git] / question / type / calculatedmulti / question.php
CommitLineData
cdece95e
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 * Calculated multiple-choice question definition class.
19 *
20 * @package qtype
21 * @subpackage calculatedmulti
22 * @copyright 2011 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
29require_once($CFG->dirroot . '/question/type/multichoice/question.php');
30require_once($CFG->dirroot . '/question/type/calculated/question.php');
31
32
33/**
34 * Represents a calculated multiple-choice multiple-response question.
35 *
36 * @copyright 2011 The Open University
37 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38 */
39class qtype_calculatedmulti_single_question extends qtype_multichoice_single_question
40 implements qtype_calculated_question_with_expressions {
e35ba43c 41
cdece95e
TH
42 /** @var qtype_calculated_dataset_loader helper for loading the dataset. */
43 public $datasetloader;
44
45 /** @var qtype_calculated_variable_substituter stores the dataset we are using. */
46 public $vs;
47
e35ba43c
TH
48 /**
49 * @var bool wheter the dataset item to use should be chose based on attempt
50 * start time, rather than randomly.
51 */
52 public $synchronised;
53
1da821bb 54 public function start_attempt(question_attempt_step $step, $variant) {
c014b989
TH
55 qtype_calculated_question_helper::start_attempt($this, $step, $variant);
56 parent::start_attempt($step, $variant);
cdece95e
TH
57 }
58
59 public function apply_attempt_state(question_attempt_step $step) {
60 qtype_calculated_question_helper::apply_attempt_state($this, $step);
61 parent::apply_attempt_state($step);
62 }
63
64 public function calculate_all_expressions() {
65 qtype_calculatedmulti_calculate_helper::calculate_all_expressions($this);
66 }
c014b989
TH
67
68
69 public function get_num_variants() {
70 return $this->datasetloader->get_number_of_items();
71 }
72
73 public function get_variants_selection_seed() {
74 if (!empty($this->synchronised) &&
409199d6 75 $this->datasetloader->datasets_are_synchronised($this->category)) {
c014b989
TH
76 return 'category' . $this->category;
77 } else {
78 return parent::get_variants_selection_seed();
79 }
80 }
cdece95e
TH
81}
82
83
84/**
85 * Represents a calculated multiple-choice multiple-response question.
86 *
87 * @copyright 2011 The Open University
88 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
89 */
90class qtype_calculatedmulti_multi_question extends qtype_multichoice_multi_question
91 implements qtype_calculated_question_with_expressions {
e35ba43c 92
cdece95e
TH
93 /** @var qtype_calculated_dataset_loader helper for loading the dataset. */
94 public $datasetloader;
95
96 /** @var qtype_calculated_variable_substituter stores the dataset we are using. */
97 public $vs;
98
e35ba43c
TH
99 /**
100 * @var bool wheter the dataset item to use should be chose based on attempt
101 * start time, rather than randomly.
102 */
103 public $synchronised;
104
1da821bb 105 public function start_attempt(question_attempt_step $step, $variant) {
0cba6a8d 106 qtype_calculated_question_helper::start_attempt($this, $step, $variant);
1da821bb 107 parent::start_attempt($step, $variant);
cdece95e
TH
108 }
109
110 public function apply_attempt_state(question_attempt_step $step) {
111 qtype_calculated_question_helper::apply_attempt_state($this, $step);
112 parent::apply_attempt_state($step);
113 }
114
115 public function calculate_all_expressions() {
116 qtype_calculatedmulti_calculate_helper::calculate_all_expressions($this);
117 }
118}
119
120
121/**
122 * Helper to abstract common code between qtype_calculatedmulti_single_question
123 * and qtype_calculatedmulti_multi_question.
124 *
125 * @copyright 2011 The Open University
126 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
127 */
128abstract class qtype_calculatedmulti_calculate_helper {
129 /**
130 * Calculate all the exressions in a qtype_calculatedmulti_single_question
131 * or qtype_calculatedmulti_multi_question.
132 * @param unknown_type $question
133 */
134 public static function calculate_all_expressions(
135 qtype_calculated_question_with_expressions $question) {
136 $question->questiontext = $question->vs->replace_expressions_in_text(
137 $question->questiontext);
138 $question->generalfeedback = $question->vs->replace_expressions_in_text(
139 $question->generalfeedback);
140
141 foreach ($question->answers as $ans) {
142 if ($ans->answer && $ans->answer !== '*') {
143 $ans->answer = $question->vs->replace_expressions_in_text($ans->answer,
144 $ans->correctanswerlength, $ans->correctanswerformat);
145 }
146 $ans->feedback = $question->vs->replace_expressions_in_text($ans->feedback,
147 $ans->correctanswerlength, $ans->correctanswerformat);
148 }
149 }
150}