MDL-40481 quiz responses report needs cols need text_sorting
authorTim Hunt <T.J.Hunt@open.ac.uk>
Fri, 1 Nov 2013 17:59:53 +0000 (17:59 +0000)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Tue, 5 Nov 2013 14:13:53 +0000 (14:13 +0000)
lib/tablelib.php
mod/quiz/report/responses/responses_table.php

index 4c1e2fc..657c72e 100644 (file)
@@ -218,6 +218,8 @@ class flexible_table {
 
     /**
      * Use text sorting functions for this column (required for text columns with Oracle).
+     * Be warned that you cannot use this with column aliases. You can only do this
+     * with real columns. See MDL-40481 for an example.
      * @param string column name
      */
     function text_sorting($column) {
index a5a0c09..6dc1268 100644 (file)
@@ -91,10 +91,16 @@ class quiz_responses_table extends quiz_attempts_report_table {
 
         $stepdata = $this->lateststeps[$attempt->usageid][$slot];
 
-        if (is_null($stepdata->$field)) {
+        if (property_exists($stepdata, $field . 'full')) {
+            $value = $stepdata->{$field . 'full'};
+        } else {
+            $value = $stepdata->$field;
+        }
+
+        if (is_null($value)) {
             $summary = '-';
         } else {
-            $summary = trim($stepdata->$field);
+            $summary = trim($value);
         }
 
         if ($this->is_downloading() || $field != 'responsesummary') {
@@ -136,8 +142,21 @@ class quiz_responses_table extends quiz_attempts_report_table {
      * @param string $alias the table alias for latest state information relating to that slot.
      */
     protected function get_required_latest_state_fields($slot, $alias) {
-        return "$alias.questionsummary AS question$slot,
-                $alias.rightanswer AS right$slot,
-                $alias.responsesummary AS response$slot";
+        global $DB;
+        $sortableresponse = $DB->sql_order_by_text("{$alias}.questionsummary");
+        if ($sortableresponse === "{$alias}.questionsummary") {
+            // Can just order by text columns. No complexity needed.
+            return "{$alias}.questionsummary AS question{$slot},
+                    {$alias}.rightanswer AS right{$slot},
+                    {$alias}.responsesummary AS response{$slot}";
+        } else {
+            // Work-around required.
+            return $DB->sql_order_by_text("{$alias}.questionsummary") . " AS question{$slot},
+                    {$alias}.questionsummary AS question{$slot}full,
+                    " . $DB->sql_order_by_text("{$alias}.rightanswer") . " AS right{$slot},
+                    {$alias}.rightanswer AS right{$slot}full,
+                    " . $DB->sql_order_by_text("{$alias}.responsesummary") . " AS response{$slot},
+                    {$alias}.responsesummary AS response{$slot}full";
+        }
     }
 }