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 * Calculated multiple-choice question definition class.
21 * @subpackage calculatedmulti
22 * @copyright 2011 The Open University
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27 defined('MOODLE_INTERNAL') || die();
29 require_once($CFG->dirroot . '/question/type/multichoice/question.php');
30 require_once($CFG->dirroot . '/question/type/calculated/question.php');
34 * Represents a calculated multiple-choice multiple-response question.
36 * @copyright 2011 The Open University
37 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39 class qtype_calculatedmulti_single_question extends qtype_multichoice_single_question
40 implements qtype_calculated_question_with_expressions {
42 /** @var qtype_calculated_dataset_loader helper for loading the dataset. */
43 public $datasetloader;
45 /** @var qtype_calculated_variable_substituter stores the dataset we are using. */
49 * @var bool wheter the dataset item to use should be chose based on attempt
50 * start time, rather than randomly.
54 public function start_attempt(question_attempt_step $step, $variant) {
55 qtype_calculated_question_helper::start_attempt($this, $step, $variant);
56 parent::start_attempt($step, $variant);
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);
64 public function calculate_all_expressions() {
65 qtype_calculatedmulti_calculate_helper::calculate_all_expressions($this);
68 public function get_num_variants() {
69 return $this->datasetloader->get_number_of_items();
72 public function get_variants_selection_seed() {
73 if (!empty($this->synchronised) &&
74 $this->datasetloader->datasets_are_synchronised($this->category)) {
75 return 'category' . $this->category;
77 return parent::get_variants_selection_seed();
84 * Represents a calculated multiple-choice multiple-response question.
86 * @copyright 2011 The Open University
87 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
89 class qtype_calculatedmulti_multi_question extends qtype_multichoice_multi_question
90 implements qtype_calculated_question_with_expressions {
92 /** @var qtype_calculated_dataset_loader helper for loading the dataset. */
93 public $datasetloader;
95 /** @var qtype_calculated_variable_substituter stores the dataset we are using. */
99 * @var bool wheter the dataset item to use should be chose based on attempt
100 * start time, rather than randomly.
102 public $synchronised;
104 public function start_attempt(question_attempt_step $step, $variant) {
105 qtype_calculated_question_helper::start_attempt($this, $step, $variant);
106 parent::start_attempt($step, $variant);
109 public function apply_attempt_state(question_attempt_step $step) {
110 qtype_calculated_question_helper::apply_attempt_state($this, $step);
111 parent::apply_attempt_state($step);
114 public function calculate_all_expressions() {
115 qtype_calculatedmulti_calculate_helper::calculate_all_expressions($this);
118 public function get_num_variants() {
119 return $this->datasetloader->get_number_of_items();
122 public function get_variants_selection_seed() {
123 if (!empty($this->synchronised) &&
124 $this->datasetloader->datasets_are_synchronised($this->category)) {
125 return 'category' . $this->category;
127 return parent::get_variants_selection_seed();
134 * Helper to abstract common code between qtype_calculatedmulti_single_question
135 * and qtype_calculatedmulti_multi_question.
137 * @copyright 2011 The Open University
138 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
140 abstract class qtype_calculatedmulti_calculate_helper {
142 * Calculate all the exressions in a qtype_calculatedmulti_single_question
143 * or qtype_calculatedmulti_multi_question.
144 * @param unknown_type $question
146 public static function calculate_all_expressions(
147 qtype_calculated_question_with_expressions $question) {
148 $question->questiontext = $question->vs->replace_expressions_in_text(
149 $question->questiontext);
150 $question->generalfeedback = $question->vs->replace_expressions_in_text(
151 $question->generalfeedback);
153 foreach ($question->answers as $ans) {
154 if ($ans->answer && $ans->answer !== '*') {
155 $ans->answer = $question->vs->replace_expressions_in_text($ans->answer,
156 $ans->correctanswerlength, $ans->correctanswerformat);
158 $ans->feedback = $question->vs->replace_expressions_in_text($ans->feedback,
159 $ans->correctanswerlength, $ans->correctanswerformat);