From: vyshane Date: Thu, 14 Dec 2006 02:32:32 +0000 (+0000) Subject: Changes for MDL-7467. X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=e0c256473de647a3a8a67260d6ac91804fd9de43;p=moodle.git Changes for MDL-7467. The images show each possible answer's "correctness": Green tick - correct answer Amber tick - partially correct answer Red cross - wrong answer Each image will have the appropriate alt text. The answer that the student has picked is highlited by changing the background colour: light green, light amber or light yellow, depending on the correctness of the chosen answer. In addition to this, the image for that answer is much bigger in size than for the other possible answers. The alt text for this image will indicate that this answer was picked. This way, the visual cues, the relative importance of each answer (chosen/non-chosen), and the relative relationships (correct/wrong) are kept. The chosen answer is emphasised by the background highlighting, by the bigger size of the icon, and by the alt text as well. I think this covers all the bases. --- diff --git a/question/type/match/display.html b/question/type/match/display.html index e9c3101d75..828262a740 100644 --- a/question/type/match/display.html +++ b/question/type/match/display.html @@ -17,11 +17,14 @@ control; ?> -feedback)) { ?> + + feedbackimg; ?> + + feedback)) { ?> feedback; ?> - + diff --git a/question/type/match/questiontype.php b/question/type/match/questiontype.php index 766aa200c2..fb382778f6 100644 --- a/question/type/match/questiontype.php +++ b/question/type/match/questiontype.php @@ -284,10 +284,15 @@ class question_match_qtype extends default_questiontype { and $options->correct_responses and isset($correctanswers[$subquestion->id]) and ($correctanswers[$subquestion->id] == $response)) { - $a->class = ' highlight '; + $a->class = ' correct '; + $a->feedbackimg = ''.get_string('correct', 'quiz').''; + } else if ($response) { + $a->class = ' incorrect '; + $a->feedbackimg = ''.get_string('incorrect', 'quiz').''; } else { - $a->class = ''; - } + $a->class = ' '; + $a->feedbackimg = ' '; + } $a->control = choose_from_menu($answers, $menuname, $response, 'choose', '', 0, true, $options->readonly); diff --git a/question/type/multianswer/questiontype.php b/question/type/multianswer/questiontype.php index c23b2f50c7..e8aa50bd4c 100644 --- a/question/type/multianswer/questiontype.php +++ b/question/type/multianswer/questiontype.php @@ -237,6 +237,7 @@ class embedded_cloze_qtype extends default_questiontype { // Determine feedback popup if any $popup = ''; $style = ''; + $feedbackimg = ''; if ($options->feedback) { $chosenanswer = null; switch ($wrapped->qtype) { @@ -278,19 +279,21 @@ class embedded_cloze_qtype extends default_questiontype { if (!empty($chosenanswer) && $options->correct_responses) { if (!isset($chosenanswer->fraction) || $chosenanswer->fraction <= 0.0) { - // The response must have been totally wrong: + // The response must have been totally wrong. $style = 'class="incorrect"'; - + $feedbackimg = ''.get_string('incorrect', 'quiz').''; } else if ($chosenanswer->fraction >= 1.0) { - // The response was correct!! + // The response was correct. $style = 'class="correct"'; - + $feedbackimg = ''.get_string('correct', 'quiz').''; } else { - // This response did at least give some credit: - $style = 'class="partialcorrect"'; + // This response did at least give some credit. + $style = 'class="partiallycorrect"'; + $feedbackimg = ''.get_string('partiallycorrect', 'quiz').''; } } else { $style = ''; + $feedbackimg = ''; } } @@ -303,6 +306,7 @@ class embedded_cloze_qtype extends default_questiontype { if (!empty($feedback) && $USER->screenreader) { echo "pixpath/i/feedback.gif\" alt=\"$feedback\" />"; } + echo $feedbackimg; break; case 'multichoice': $outputoptions = ''; // Default empty option @@ -311,22 +315,26 @@ class embedded_cloze_qtype extends default_questiontype { ? ' selected="selected" ' : ''; $outputoptions .= ""; } - // In the next line, $readonly is invalid HTML, but it works in - // all browsers. $disabled would be valid, but then the JS for - // displaying the feedback does not work. Of course, we should - // not be relying on JS (for accessibility reasons), but that is - //a bigger problem. - echo "'; - if (!empty($feedback) && $USER->screenreader) { + // In the next line, $readonly is invalid HTML, but it works in + // all browsers. $disabled would be valid, but then the JS for + // displaying the feedback does not work. Of course, we should + // not be relying on JS (for accessibility reasons), but that is + // a bigger problem. + // + // The span is used for safari, which does not allow styling of + // selects. + echo "'; + if (!empty($feedback) && $USER->screenreader) { echo "pixpath/i/feedback.gif\" alt=\"$feedback\" />"; - } - break; - default: - error("Unable to recognize questiontype ($wrapped->qtype) of - question part $positionkey."); - break; + } + echo $feedbackimg; + break; + default: + error("Unable to recognize questiontype ($wrapped->qtype) of + question part $positionkey."); + break; } echo ""; // MDL-7497 } diff --git a/question/type/multichoice/display.html b/question/type/multichoice/display.html index 83960bc132..5e4f66d6cd 100644 --- a/question/type/multichoice/display.html +++ b/question/type/multichoice/display.html @@ -20,6 +20,7 @@ diff --git a/question/type/multichoice/questiontype.php b/question/type/multichoice/questiontype.php index 01b2bc64fa..6e4d1f7a3c 100644 --- a/question/type/multichoice/questiontype.php +++ b/question/type/multichoice/questiontype.php @@ -283,34 +283,58 @@ class question_multichoice_qtype extends default_questiontype { $answer = &$answers[$aid]; $qnumchar = chr(ord('a') + $key); $checked = ''; - + $chosen = false; + if ($question->options->single) { $type = 'type="radio"'; $name = "name=\"{$question->name_prefix}\""; if (isset($state->responses['']) and $aid == $state->responses['']) { $checked = 'checked="checked"'; + $chosen = true; } } else { $type = ' type="checkbox" '; $name = "name=\"{$question->name_prefix}{$aid}\""; - $checked = isset($state->responses[$aid]) - ? 'checked="checked"' : ''; + if (isset($state->responses[$aid])) { + $checked = 'checked="checked"'; + $chosen = true; + } } $a = new stdClass; $a->id = $question->name_prefix . $aid; + $a->class = ''; + $a->feedbackimg = ''; // Print the control $a->control = "id\" $name $checked $type value=\"$aid\"" . " alt=\"" . s($answer->answer) . '" />'; - // Print the text by the control highlighting if correct responses - // should be shown and the current answer is the correct answer in - // the single selection case or has a positive score in the multiple - // selection case - $a->class = ($options->readonly && $options->correct_responses && - is_array($correctanswers) && in_array($aid, $correctanswers)) ? - 'highlight' : ''; + if ($options->readonly) { + // Means we need to display answer correctness. + if ($answer->fraction == 1) { + if ($chosen) { + $a->class = 'correct'; + $a->feedbackimg = ''.get_string('correct', 'quiz').''; + } else { + $a->feedbackimg = ''.get_string('correct', 'quiz').''; + } + } else if ($answer->fraction > 0 && $answer->fraction < 1) { + if ($chosen) { + $a->class = 'partiallycorrect'; + $a->feedbackimg = ''.get_string('partiallycorrect', 'quiz').''; + } else { + $a->feedbackimg = ''.get_string('partiallycorrect', 'quiz').''; + } + } else { + if ($chosen) { + $a->class = 'incorrect'; + $a->feedbackimg = ''.get_string('incorrect', 'quiz').''; + } else { + $a->feedbackimg = ''.get_string('incorrect', 'quiz').''; + } + } + } // Print the answer text $a->text = format_text("$qnumchar. $answer->answer", FORMAT_MOODLE, $formatoptions, $cmoptions->course); diff --git a/question/type/shortanswer/display.html b/question/type/shortanswer/display.html index d7f3f38295..6f1bbb478b 100644 --- a/question/type/shortanswer/display.html +++ b/question/type/shortanswer/display.html @@ -12,7 +12,8 @@
- size="80"/> + size="80"/> +
diff --git a/question/type/shortanswer/questiontype.php b/question/type/shortanswer/questiontype.php index c18c22d60a..114f5ab5d7 100644 --- a/question/type/shortanswer/questiontype.php +++ b/question/type/shortanswer/questiontype.php @@ -146,14 +146,28 @@ class question_shortanswer_qtype extends default_questiontype { $inputname = ' name="'.$nameprefix.'" '; $feedback = ''; + $class = ''; + $feedbackimg = ''; + if ($options->feedback) { foreach($question->options->answers as $answer) { - if($this->test_response($question, $state, $answer)) { - if ($answer->feedback) { + if ($this->test_response($question, $state, $answer)) { + // Answer was correct or partially correct. + if ($answer->fraction == 1) { + $class = 'correct'; + $feedbackimg = ''.get_string('correct', 'quiz').''; + } else { + $class = 'partiallycorrect'; + $feedbackimg = ''.get_string('partiallycorrect', 'quiz').''; + } + if ($answer->feedback) { $feedback = format_text($answer->feedback, true, $formatoptions, $cmoptions->course); } break; - } + } else { + $class = 'incorrect'; + $feedbackimg = ''.get_string('incorrect', 'quiz').''; + } } } @@ -366,7 +380,7 @@ class question_shortanswer_qtype extends default_questiontype { print_string('partiallycorrect', 'quiz'); // MDL-7496 if ($correctanswer) { - echo ('
'); + echo ('
'); print_string('correctansweris', 'quiz', s($correctanswer)); echo ('
'); } @@ -375,7 +389,7 @@ class question_shortanswer_qtype extends default_questiontype { // MDL-7496 print_string('incorrect', 'quiz'); if ($correctanswer) { - echo ('
'); + echo ('
'); print_string('correctansweris', 'quiz', s($correctanswer)); echo ('
'); } diff --git a/question/type/truefalse/display.html b/question/type/truefalse/display.html index 85ec4fc9aa..e60642507a 100644 --- a/question/type/truefalse/display.html +++ b/question/type/truefalse/display.html @@ -14,9 +14,11 @@
> + > +
diff --git a/question/type/truefalse/questiontype.php b/question/type/truefalse/questiontype.php index ff28787019..1877b11e09 100644 --- a/question/type/truefalse/questiontype.php +++ b/question/type/truefalse/questiontype.php @@ -155,18 +155,41 @@ class question_truefalse_qtype extends default_questiontype { $falseanswer = &$answers[$question->options->falseanswer]; $correctanswer = ($trueanswer->fraction == 1) ? $trueanswer : $falseanswer; + $trueclass = ''; + $falseclass = ''; + $truefeedbackimg = ''; + $falsefeedbackimg = ''; + // Work out which radio button to select (if any) $truechecked = ($state->responses[''] == $trueanswer->id) ? ' checked="checked"' : ''; $falsechecked = ($state->responses[''] == $falseanswer->id) ? ' checked="checked"' : ''; - // Work out which answer is correct if we need to highlight it - if ($options->correct_responses) { - $trueclass = ($trueanswer->fraction) ? ' class="highlight"' : ''; - $falseclass = ($falseanswer->fraction) ? ' class="highlight"' : ''; - } else { - $trueclass = ''; - $falseclass = ''; - } + // Work out visual feedback for answer correctness. + if ($truechecked) { + if ($correctanswer == $trueanswer) { + $trueclass = ' class="correct"'; + $falseclass = ''; + $truefeedbackimg = ''.get_string('correct', 'quiz').''; + $falsefeedbackimg = ''.get_string('incorrect', 'quiz').''; + } else if ($correctanswer == $falseanswer) { + $trueclass = ''; + $falseclass = ' class="correct"'; + $truefeedbackimg = ''.get_string('incorrect', 'quiz').''; + $falsefeedbackimg = ''.get_string('correct', 'quiz').''; + } + } else if ($falsechecked) { + if ($correctanswer == $trueanswer) { + $trueclass = ''; + $falseclass = ' class="incorrect"'; + $truefeedbackimg = ''.get_string('correct', 'quiz').''; + $falsefeedbackimg = ''.get_string('incorrect', 'quiz').''; + } else if ($correctanswer == $falseanswer) { + $trueclass = ' class="incorrect"'; + $falseclass = ''; + $truefeedbackimg = ''.get_string('incorrect', 'quiz').''; + $falsefeedbackimg = ''.get_string('correct', 'quiz').''; + } + } $inputname = ' name="'.$question->name_prefix.'" '; $trueid = $question->name_prefix.'true';