MDL-47494 gapselect: Bug fixes: #2009
authorTim Hunt <T.J.Hunt@open.ac.uk>
Thu, 24 Nov 2011 16:43:12 +0000 (16:43 +0000)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Thu, 24 Nov 2011 16:43:12 +0000 (16:43 +0000)
1. Automatic display of right answer did not work if question text
contained images.

2. A choice of '0' was rejected by the form validation.

3. Hard coded strings moved to lang strings.

question/type/gapselect/edit_form_base.php
question/type/gapselect/lang/en/qtype_gapselect.php
question/type/gapselect/questionbase.php
question/type/gapselect/rendererbase.php

index 829a62d..c9cc714 100644 (file)
@@ -215,7 +215,7 @@ class qtype_gapselect_edit_form_base extends question_edit_form {
     private function validate_slots($questiontext, $choices) {
         $error = 'Please check the Question text: ';
         if (!$questiontext) {
-            return $error . 'The question text is empty!';
+            return get_string('errorquestiontextblank', 'qtype_gapselect');
         }
 
         $matches = array();
@@ -223,32 +223,32 @@ class qtype_gapselect_edit_form_base extends question_edit_form {
         $slots = $matches[0];
 
         if (!$slots) {
-            return $error . 'The question text is not in the correct format!';
+            return get_string('errornoslots', 'qtype_gapselect');
         }
 
-        $output = array();
+        $cleanedslots = array();
         foreach ($slots as $slot) {
             // The 2 is for'[[' and 4 is for '[[]]'.
-            $output[] = substr($slot, 2, (strlen($slot)-4));
+            $cleanedslots[] = substr($slot, 2, (strlen($slot)-4));
         }
+        $slots = $cleanedslots;
 
-        $slots = $output;
         $found = false;
         foreach ($slots as $slot) {
             $found = false;
             foreach ($choices as $key => $choice) {
                 if ($slot == $key + 1) {
-                    if (!$choice['answer']) {
-                        return " Please check Choices: The choice <b>$slot</b> empty.";
+                    if ($choice['answer'] === '') {
+                        return get_string('errorblankchoice', 'qtype_gapselect',
+                                html_writer::tag('b', $slot));
                     }
                     $found = true;
                     break;
                 }
             }
             if (!$found) {
-                return $error . '<b>' . $slot . '</b> was not found in Choices! ' .
-                        '(only the choice numbers that exist in choices are allowed ' .
-                        'to be used a place holders!';
+                return get_string('errormissingchoice', 'qtype_gapselect',
+                        html_writer::tag('b', $slot));
             }
         }
         return false;
index fd25df2..69c4486 100644 (file)
@@ -30,6 +30,10 @@ $string['choices'] = 'Choices';
 $string['choicex'] = 'Choice {no}';
 $string['correctansweris'] = 'The correct answer is: {$a}';
 $string['editinggapselect'] = 'Editing a select missing words question';
+$string['errorblankchoice'] = 'Please check the Choices: Choice {$a} is empty.';
+$string['errormissingchoice'] = 'Please check the Question text: {$a} was not found in Choices! Only the choice numbers that exist in choices are allowed to be used a place holders.';
+$string['errornoslots'] = 'The question text must contain placeholders like [[1]] to show where the missing words go.';
+$string['errorquestiontextblank'] = 'You must enter some question text.';
 $string['gapselect'] = 'Select missing words';
 $string['gapselect_help'] = 'Type in some question text like "The [[1]] jumped over the [[2]]", then enter the possible words to go in gaps 1 and 2 underneath.';
 $string['gapselectsummary'] = 'Missing words in some text are filled in using dropdown menus.';
index 1b2ed41..b561c27 100644 (file)
@@ -119,8 +119,8 @@ abstract class qtype_gapselect_question_base extends question_graded_automatical
         foreach ($this->places as $place => $group) {
             if (array_key_exists($this->field($place), $response) &&
                     $response[$this->field($place)]) {
-                $choices[] = '{' . html_to_text($this->get_selected_choice(
-                        $group, $response[$this->field($place)])->text, 0, false) . '}';
+                $choices[] = '{' . $this->summarise_choice(
+                        $this->get_selected_choice($group, $response[$this->field($place)])) . '}';
                 $allblank = false;
             } else {
                 $choices[] = '{}';
@@ -132,6 +132,15 @@ abstract class qtype_gapselect_question_base extends question_graded_automatical
         return implode(' ', $choices);
     }
 
+    /**
+     * Convert a choice to plain text.
+     * @param qtype_gapselect_choice $choice one of the choices for a place.
+     * @return a plain text summary of the choice.
+     */
+    public function summarise_choice($choice) {
+        return $this->html_to_text($choice->text, FORMAT_PLAIN);
+    }
+
     public function get_random_guess_score() {
         $accum = 0;
 
index 4ededd3..0ffe7dd 100644 (file)
@@ -104,7 +104,9 @@ abstract class qtype_elements_embedded_in_question_text_renderer
         }
 
         if (!empty($correctanswer)) {
-            return get_string('correctansweris', 'qtype_gapselect', $correctanswer);
+            return get_string('correctansweris', 'qtype_gapselect',
+                    $question->format_text($correctanswer, $question->questiontextformat,
+                            $qa, 'question', 'questiontext', $question->id));
         }
     }
 }