MDL-32188 question rendering: let behaviours control mark display.
authorTim Hunt <T.J.Hunt@open.ac.uk>
Wed, 2 Oct 2013 16:32:41 +0000 (17:32 +0100)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Fri, 4 Oct 2013 16:52:21 +0000 (17:52 +0100)
Then use this in the CBM behaviours to change how the question marks are
displayed there.

question/behaviour/rendererbase.php
question/behaviour/upgrade.txt
question/engine/renderer.php
question/engine/upgrade.txt

index 932ee30..203c5b3 100644 (file)
@@ -235,4 +235,40 @@ abstract class qbehaviour_renderer extends plugin_renderer_base {
     public function head_code(question_attempt $qa) {
         return '';
     }
+
+    /**
+     * Generate the display of the marks for this question.
+     * @param question_attempt $qa the question attempt to display.
+     * @param core_question_renderer $qoutput the renderer for standard parts of questions.
+     * @param question_display_options $options controls what should and should not be displayed.
+     * @return HTML fragment.
+     */
+    public function mark_summary(question_attempt $qa, core_question_renderer $qoutput,
+            question_display_options $options) {
+        return $qoutput->standard_mark_summary($qa, $this, $options);
+    }
+
+    /**
+     * Generate the display of the available marks for this question.
+     * @param question_attempt $qa the question attempt to display.
+     * @param core_question_renderer $qoutput the renderer for standard parts of questions.
+     * @param question_display_options $options controls what should and should not be displayed.
+     * @return HTML fragment.
+     */
+    public function marked_out_of_max(question_attempt $qa, core_question_renderer $qoutput,
+            question_display_options $options) {
+        return $qoutput->standard_marked_out_of_max($qa, $options);
+    }
+
+    /**
+     * Generate the display of the marks for this question out of the available marks.
+     * @param question_attempt $qa the question attempt to display.
+     * @param core_question_renderer $qoutput the renderer for standard parts of questions.
+     * @param question_display_options $options controls what should and should not be displayed.
+     * @return HTML fragment.
+     */
+    public function mark_out_of_max(question_attempt $qa, core_question_renderer $qoutput,
+            question_display_options $options) {
+        return $qoutput->standard_mark_out_of_max($qa, $options);
+    }
 }
index c21854f..51d17c0 100644 (file)
@@ -11,17 +11,23 @@ class qbehaviour_mybehaviour_type extends question_behaviour_type {
    question_attempt. That is like the difference between the qtype_mytype and
    the qtype_mytype_question classes.
 
-Practically, what this means is that any of the methods that used to be
-static methods of qbehaviour_mybehaviour class are now normal instance methods
-of the qbehaviour_mybehaviour_type class. Specifically.
+   Practically, what this means is that any of the methods that used to be
+   static methods of qbehaviour_mybehaviour class are now normal instance
+   methods of the qbehaviour_mybehaviour_type class. Specifically.
     2.5 / qbehaviour_mybehaviour -> 2.6 / qbehaviour_mybehaviour_type
     IS_ARCHETYPAL                -> is_archetypal()
     adjust_random_guess_score()  -> adjust_random_guess_score()
     get_unused_display_options() -> get_unused_display_options()
 
-3) The static method is_manual_grade_in_range has move from the
+3) The static method is_manual_grade_in_range has moved from the
    question_behaviour class to the question_engine class.
 
+4) Behaviours can now control how the marks information is displayed in the
+   grey info area to the left of the question. There is a new method
+   mark_summary that you can override, although the default implementation is
+   fine in most cases. it uses the marked_out_of_max and mark_out_of_max methods
+   as appropriate, so you may just wish to override those.
+
 
 === 2.3 ===
 
index f6793d4..b07317f 100644 (file)
@@ -115,7 +115,7 @@ class core_question_renderer extends plugin_renderer_base {
         $output = '';
         $output .= $this->number($number);
         $output .= $this->status($qa, $behaviouroutput, $options);
-        $output .= $this->mark_summary($qa, $options);
+        $output .= $this->mark_summary($qa, $behaviouroutput, $options);
         $output .= $this->question_flag($qa, $options->flags);
         $output .= $this->edit_question_link($qa, $options);
         return $output;
@@ -173,30 +173,59 @@ class core_question_renderer extends plugin_renderer_base {
     /**
      * Generate the display of the marks for this question.
      * @param question_attempt $qa the question attempt to display.
+     * @param qbehaviour_renderer $behaviouroutput the behaviour renderer, which can generate a custom display.
      * @param question_display_options $options controls what should and should not be displayed.
      * @return HTML fragment.
      */
-    protected function mark_summary(question_attempt $qa, question_display_options $options) {
+    protected function mark_summary(question_attempt $qa, qbehaviour_renderer $behaviouroutput, question_display_options $options) {
+        return html_writer::nonempty_tag('div',
+                $behaviouroutput->mark_summary($qa, $this, $options),
+                array('class' => 'grade'));
+    }
+
+    /**
+     * Generate the display of the marks for this question.
+     * @param question_attempt $qa the question attempt to display.
+     * @param question_display_options $options controls what should and should not be displayed.
+     * @return HTML fragment.
+     */
+    public function standard_mark_summary(question_attempt $qa, qbehaviour_renderer $behaviouroutput, question_display_options $options) {
         if (!$options->marks) {
             return '';
-        }
 
-        if ($qa->get_max_mark() == 0) {
-            $summary = get_string('notgraded', 'question');
+        } else if ($qa->get_max_mark() == 0) {
+            return get_string('notgraded', 'question');
 
         } else if ($options->marks == question_display_options::MAX_ONLY ||
                 is_null($qa->get_fraction())) {
-            $summary = get_string('markedoutofmax', 'question',
-                    $qa->format_max_mark($options->markdp));
+            return $behaviouroutput->marked_out_of_max($qa, $this, $options);
 
         } else {
-            $a = new stdClass();
-            $a->mark = $qa->format_mark($options->markdp);
-            $a->max = $qa->format_max_mark($options->markdp);
-            $summary = get_string('markoutofmax', 'question', $a);
+            return $behaviouroutput->mark_out_of_max($qa, $this, $options);
         }
+    }
+
+    /**
+     * Generate the display of the available marks for this question.
+     * @param question_attempt $qa the question attempt to display.
+     * @param question_display_options $options controls what should and should not be displayed.
+     * @return HTML fragment.
+     */
+    public function standard_marked_out_of_max(question_attempt $qa, question_display_options $options) {
+        return get_string('markedoutofmax', 'question', $qa->format_max_mark($options->markdp));
+    }
 
-        return html_writer::tag('div', $summary, array('class' => 'grade'));
+    /**
+     * Generate the display of the marks for this question out of the available marks.
+     * @param question_attempt $qa the question attempt to display.
+     * @param question_display_options $options controls what should and should not be displayed.
+     * @return HTML fragment.
+     */
+    public function standard_mark_out_of_max(question_attempt $qa, question_display_options $options) {
+        $a = new stdClass();
+        $a->mark = $qa->format_mark($options->markdp);
+        $a->max = $qa->format_max_mark($options->markdp);
+        return get_string('markoutofmax', 'question', $a);
     }
 
     /**
index ec993f6..04d1f23 100644 (file)
@@ -4,4 +4,13 @@ This files describes API changes for the core question system.
 === 2.4 ===
 
 1) The method question_behaviour::is_manual_grade_in_range and move and become
-question_engine::is_manual_grade_in_range.
\ No newline at end of file
+question_engine::is_manual_grade_in_range.
+
+2) The arguments to core_question_renderer::mark_summary changed from
+($qa, $options) to ($qa, $behaviouroutput, $options). If you have overridden
+that method you will need to update your code.
+
+
+=== Earlier changes ===
+
+* Were not documented in this way. Sorry.