From ceeae340f993ac7c99aa0c6a670dba038ce36016 Mon Sep 17 00:00:00 2001 From: tjhunt Date: Fri, 10 Aug 2007 15:21:29 +0000 Subject: [PATCH] MDL-10799 - Question types do not accurately determine whether their state has changed or not. Merged from MOODLE_18_STABLE. --- question/type/multichoice/questiontype.php | 9 ++------- question/type/questiontype.php | 11 ++++++++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/question/type/multichoice/questiontype.php b/question/type/multichoice/questiontype.php index 965921006d..270592f8ce 100644 --- a/question/type/multichoice/questiontype.php +++ b/question/type/multichoice/questiontype.php @@ -189,8 +189,7 @@ class question_multichoice_qtype extends default_questiontype { if (false === $pos) { // No order of answers is given, so use the default $state->options->order = array_keys($question->options->answers); } else { // Restore the order of the answers - $state->options->order = explode(',', substr($state->responses[''], 0, - $pos)); + $state->options->order = explode(',', substr($state->responses[''], 0, $pos)); $state->responses[''] = substr($state->responses[''], $pos + 1); } // Restore the responses @@ -200,11 +199,7 @@ class question_multichoice_qtype extends default_questiontype { // the $state->responses array is indexed by the answer ids and the // values are also the answer ids (i.e. key = value). if (empty($state->responses[''])) { // No previous responses - if ($question->options->single) { - $state->responses = array('' => ''); - } else { - $state->responses = array(); - } + $state->responses = array('' => ''); } else { if ($question->options->single) { $state->responses = array('' => $state->responses['']); diff --git a/question/type/questiontype.php b/question/type/questiontype.php index a7ad604cd3..354fffddd1 100644 --- a/question/type/questiontype.php +++ b/question/type/questiontype.php @@ -1157,7 +1157,16 @@ class default_questiontype { // Question types may wish to override this (eg. to ignore trailing // white space or to make "7.0" and "7" compare equal). - return $state->responses === $teststate->responses; + // In php neither == nor === compare arrays the way you want. The following + // ensures that the arrays have the same keys, with the same values. + $result = false; + $diff1 = array_diff_assoc($state->responses, $teststate->responses); + if (empty($diff1)) { + $diff2 = array_diff_assoc($teststate->responses, $state->responses); + $result = empty($diff2); + } + + return $result; } /** -- 2.39.5