diff --git a/question/type/calculatedmulti/edit_calculatedmulti_form.php b/question/type/calculatedmulti/edit_calculatedmulti_form.php
index eec57e327019e..7924b8f3e2476 100644
--- a/question/type/calculatedmulti/edit_calculatedmulti_form.php
+++ b/question/type/calculatedmulti/edit_calculatedmulti_form.php
@@ -260,91 +260,80 @@ public function validation($data, $files) {
get_string('atleastonewildcard', 'qtype_calculated');
}
}
- if ($data['multichoice'] == 1) {
- foreach ($answers as $key => $answer) {
- $trimmedanswer = trim($answer);
- if ($trimmedanswer != '' || $answercount == 0) {
- //verifying for errors in {=...} in answer text;
- $qanswer = '';
- $qanswerremaining = $trimmedanswer;
- $possibledatasets = $this->qtypeobj->find_dataset_names($trimmedanswer);
- foreach ($possibledatasets as $name => $value) {
- $qanswerremaining = str_replace('{'.$name.'}', '1', $qanswerremaining);
- }
+ $totalfraction = 0;
+ $maxfraction = -1;
+ foreach ($answers as $key => $answer) {
+ $trimmedanswer = trim($answer);
+ $fraction = (float) $data['fraction'][$key];
+ if (empty($trimmedanswer) && $trimmedanswer != '0' && empty($fraction)) {
+ continue;
+ }
+ if (empty($trimmedanswer)) {
+ $errors['fraction['.$key.']'] = get_string('errgradesetanswerblank', 'qtype_multichoice');
+ }
+ if ($trimmedanswer != '' || $answercount == 0) {
+ //verifying for errors in {=...} in answer text;
+ $qanswer = '';
+ $qanswerremaining = $trimmedanswer;
+ $possibledatasets = $this->qtypeobj->find_dataset_names($trimmedanswer);
+ foreach ($possibledatasets as $name => $value) {
+ $qanswerremaining = str_replace('{'.$name.'}', '1', $qanswerremaining);
+ }
- while (preg_match('~\{=([^[:space:]}]*)}~', $qanswerremaining, $regs1)) {
- $qanswersplits = explode($regs1[0], $qanswerremaining, 2);
- $qanswer = $qanswer . $qanswersplits[0];
- $qanswerremaining = $qanswersplits[1];
- if (!empty($regs1[1]) && $formulaerrors =
- qtype_calculated_find_formula_errors($regs1[1])) {
- if (!isset($errors['answer['.$key.']'])) {
- $errors['answer['.$key.']'] = $formulaerrors.':'.$regs1[1];
- } else {
- $errors['answer['.$key.']'] .= '
'.$formulaerrors.':'.$regs1[1];
- }
+ while (preg_match('~\{=([^[:space:]}]*)}~', $qanswerremaining, $regs1)) {
+ $qanswersplits = explode($regs1[0], $qanswerremaining, 2);
+ $qanswer = $qanswer . $qanswersplits[0];
+ $qanswerremaining = $qanswersplits[1];
+ if (!empty($regs1[1]) && $formulaerrors =
+ qtype_calculated_find_formula_errors($regs1[1])) {
+ if (!isset($errors['answer['.$key.']'])) {
+ $errors['answer['.$key.']'] = $formulaerrors.':'.$regs1[1];
+ } else {
+ $errors['answer['.$key.']'] .= '
'.$formulaerrors.':'.$regs1[1];
}
}
}
- if ($trimmedanswer != '') {
- if ('2' == $data['correctanswerformat'][$key] &&
- '0' == $data['correctanswerlength'][$key]) {
- $errors['correctanswerlength['.$key.']'] =
- get_string('zerosignificantfiguresnotallowed', 'qtype_calculated');
- }
- if (!is_numeric($data['tolerance'][$key])) {
- $errors['tolerance['.$key.']'] =
- get_string('mustbenumeric', 'qtype_calculated');
- }
- if ($data['fraction'][$key] == 1) {
- $maxgrade = true;
- }
-
- $answercount++;
+ }
+ if ($trimmedanswer != '') {
+ if ('2' == $data['correctanswerformat'][$key] &&
+ '0' == $data['correctanswerlength'][$key]) {
+ $errors['correctanswerlength['.$key.']'] =
+ get_string('zerosignificantfiguresnotallowed', 'qtype_calculated');
}
- //check grades
- $totalfraction = 0;
- $maxfraction = 0;
- if ($answer != '') {
- if ($data['fraction'][$key] > 0) {
- $totalfraction += $data['fraction'][$key];
- }
- if ($data['fraction'][$key] > $maxfraction) {
- $maxfraction = $data['fraction'][$key];
- }
+ if (!is_numeric($data['tolerance'][$key])) {
+ $errors['tolerance['.$key.']'] =
+ get_string('mustbenumeric', 'qtype_calculated');
}
- }
- if ($answercount == 0) {
- $errors['answer[0]'] = get_string('notenoughanswers', 'qtype_multichoice', 2);
- $errors['answer[1]'] = get_string('notenoughanswers', 'qtype_multichoice', 2);
- } else if ($answercount == 1) {
- $errors['answer[1]'] = get_string('notenoughanswers', 'qtype_multichoice', 2);
-
- }
-
- /// Perform sanity checks on fractional grades
- if ($data['single']) {
- if ($maxfraction > 0.999) {
- $maxfraction = $maxfraction * 100;
- $errors['fraction[0]'] =
- get_string('errfractionsnomax', 'qtype_multichoice', $maxfraction);
+ if ($data['fraction'][$key] > 0) {
+ $totalfraction += $data['fraction'][$key];
}
- } else {
- $totalfraction = round($totalfraction, 2);
- if ($totalfraction != 1) {
- $totalfraction = $totalfraction * 100;
- $errors['fraction[0]'] =
- get_string('errfractionsaddwrong', 'qtype_multichoice', $totalfraction);
+ if ($data['fraction'][$key] > $maxfraction) {
+ $maxfraction = $data['fraction'][$key];
}
+
+ $answercount++;
}
+ }
+ if ($answercount == 0) {
+ $errors['answer[0]'] = get_string('notenoughanswers', 'qtype_multichoice', 2);
+ $errors['answer[1]'] = get_string('notenoughanswers', 'qtype_multichoice', 2);
+ } else if ($answercount == 1) {
+ $errors['answer[1]'] = get_string('notenoughanswers', 'qtype_multichoice', 2);
- if ($answercount == 0) {
- $errors['answer[0]'] = get_string('atleastoneanswer', 'qtype_calculated');
+ }
+ /// Perform sanity checks on fractional grades
+ if ($data['single']== 1 ) {
+ if ($maxfraction != 1) {
+ $errors['fraction[0]'] = get_string('errfractionsnomax', 'qtype_multichoice',
+ $maxfraction * 100);
}
- if ($maxgrade == false) {
- $errors['fraction[0]'] = get_string('fractionsnomax', 'question');
+ } else {
+ $totalfraction = round($totalfraction, 2);
+ if ($totalfraction != 1) {
+ $totalfraction = $totalfraction * 100;
+ $errors['fraction[0]'] =
+ get_string('errfractionsaddwrong', 'qtype_multichoice', $totalfraction);
}
-
}
return $errors;
}
diff --git a/question/type/calculatedmulti/question.php b/question/type/calculatedmulti/question.php
index 35c9155a6853f..a6ff02abcaffd 100644
--- a/question/type/calculatedmulti/question.php
+++ b/question/type/calculatedmulti/question.php
@@ -103,7 +103,7 @@ class qtype_calculatedmulti_multi_question extends qtype_multichoice_multi_quest
public $synchronised;
public function start_attempt(question_attempt_step $step, $variant) {
- qtype_calculated_question_helper::start_attempt($this, $step);
+ qtype_calculated_question_helper::start_attempt($this, $step, $variant);
parent::start_attempt($step, $variant);
}