From c03d783201a31ddb5686ace68f7442251fac2ef8 Mon Sep 17 00:00:00 2001 From: kaipe Date: Sat, 18 Dec 2004 13:55:18 +0000 Subject: [PATCH] Question type RANDOM now stores responses just like any other question type. Therefore all workarounds are removed from lib.php and an isolated workaround is included in random/questiontype.php in order to ensure backward compability. --- mod/quiz/lib.php | 65 ----------------- .../questiontypes/random/questiontype.php | 70 +++++++++++++++---- 2 files changed, 58 insertions(+), 77 deletions(-) diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index c38beedf1b..fef532eea2 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -795,33 +795,6 @@ function quiz_get_attempt_questions($quiz, $attempt, $attempting = false) { $rawresponses[$qid]->id = insert_record("quiz_responses", $rawresponses[$qid]) or error("Unable to create attemptonlast response for question $qid"); - - /////////////////////////////////////////// - /// WORKAROUND FOR QUESTION TYPE RANDOM /// - /////////////////////////////////////////// - if (RANDOM == $question->qtype) { - $randomqid = $prevresponses[$qid]->answer; - if (empty($prevresponses[$randomqid]) || ereg( - "(^|,)$randomqid(,|$)", $questionsinuse)) { - // Ooops! - // The randomly picked question has been included - // among the fixed ones or did not get any response - // in the previous attempt - either way the raw - // responserecord created above needs to go! - delete_records('quiz_responses', 'id', - $rawresponses[$qid]->id); - unset($rawresponses[$qid]); - - } else if (empty($rawresponses[$randomqid])) { - /// Also copy this response from the previous attempt - $rawresponses[$randomqid] = $prevresponses[$randomqid]; - $rawresponses[$randomqid]->attempt = $attempt->id; - $rawresponses[$randomqid]->id = - insert_record('quiz_responses', $rawresponses[$randomqid]) - or error("Unable to create attemptonlast response for question $qid"); - - } - } ////// END OF WORKAROUND /////// } /* Extract possible response and its wrapped questions */ @@ -858,19 +831,6 @@ function quiz_get_attempt_questions($quiz, $attempt, $attempting = false) { ->convert_to_response_answer_field ($questions[$question->id]->response); - /////////////////////////////////////////// - // WORKAROUND for question type RANDOM: - /////////////////////////////////////////// - if ($question->qtype == RANDOM and ereg( - '^random([0-9]+)-(.*)$', $responserecord->answer, $afields)) { - $responserecord->answer = $afields[1]; - insert_record("quiz_responses", $responserecord) - or error("Unable to create an initial random response for question $question->id"); - - $responserecord->question = $responserecord->answer; - $responserecord->answer = $afields[2]; - } /// End of WORKAROUND ////////////////////// - insert_record("quiz_responses", $responserecord) or error("Unable to create initial response for question $question->id"); @@ -1688,31 +1648,6 @@ function quiz_save_attempt($quiz, $questions, $result, $attemptnum) { $responseanswerfield = $QUIZ_QTYPES[$question->qtype] ->convert_to_response_answer_field($question->response); - /////////////////////////////////////////// - // WORKAROUND for question type RANDOM: - /////////////////////////////////////////// - if ($question->qtype == RANDOM) { - - /// This will update the grade only - /// Everything else must already be in place... - if (!update_record('quiz_responses', $response)) { - notify("Error while saving grade on random response"); - return false; - } - - /// Rescue grade before fetching response record for actual question - $responsegradefield = $response->grade; - - /// Fetch the response record containing - /// the response on the actual question - $response = get_record('quiz_responses', - 'attempt', $attempt->id, 'question', $response->answer); - - $response->grade = $responsegradefield; - ereg('^random[0-9]+-(.*)$', $responseanswerfield, $afields); - $responseanswerfield = $afields[1]; - } /// End of WORKAROUND ////////////////////// - $response->answer = $responseanswerfield; } else { $response->answer = ''; diff --git a/mod/quiz/questiontypes/random/questiontype.php b/mod/quiz/questiontypes/random/questiontype.php index 02b2e4983b..1a7790f5ec 100644 --- a/mod/quiz/questiontypes/random/questiontype.php +++ b/mod/quiz/questiontypes/random/questiontype.php @@ -49,9 +49,6 @@ class quiz_random_qtype extends quiz_default_questiontype { } function convert_to_response_answer_field($questionresponse) { - /// THIS IS PART OF A WORKAROUND AS THIS IS THE ONLY - /// CASE WHERE IT IS NEEDED TO STORE TWO RESPONSE RECORDS... - global $QUIZ_QTYPES; foreach ($questionresponse as $key => $response) { @@ -70,8 +67,7 @@ class quiz_random_qtype extends quiz_default_questiontype { function create_response($question, $nameprefix, $questionsinuse) { // It's for question types like RANDOMSAMATCH and RANDOM that // the true power of the pattern with this function comes to the surface. - // This implementation will stand even after a possible exclusion of - // the funtions extract_response and convert_to_response_answer_field + global $CFG; if (!isset($this->catrandoms[$question->category])) { @@ -110,35 +106,85 @@ class quiz_random_qtype extends quiz_default_questiontype { function extract_response($rawresponse, $nameprefix) { global $QUIZ_QTYPES; + + /// The raw response records for random questions come in two flavours: + /// ---- 1 ---- + /// For responses stored by Moodle version 1.5 and later the answer + /// field has the pattern random#-* where the # part is the numeric + /// question id of the actual question shown in the quiz attempt + /// and * represents the student response to that actual question. + /// ---- 2 ---- + /// For responses stored by older Moodle versions - the answer field is + /// simply the question id of the actual question. The student response + /// to the actual question is stored in a separate response record. + /// ----------------------- + /// This means that prior to Moodle version 1.5, random questions needed + /// two response records for storing the response to a single question. + /// From version 1.5 and later the question type random works like all + /// the other question types in that it now only needs one response + /// record per question. + /// Because updating the old response records to fit the new response + /// record format could need hours of CPU time and the equivalent + /// amount of down time for the Moodle site and because a response + /// storage with two response formats for random question only effect + /// this function, where the response record is translated, this + /// function is now able to handle both types of response record. + + + /*** Pick random question id from the answer field in a way that ***/ + /*** works for both formats: ***/ + if (!ereg('^(random)?([0-9]+)(-(.*))?$', $rawresponse->answer, $answerregs)) { + error("The answer value '$rawresponse->answer' for the response with " + ."id=$rawresponse->id to the random question " + ."$rawresponse->question is malformated." + ." - No response can be extracted!"); + } + $randomquestionid = $answerregs[2]; + if ($randomquestion = get_record('quiz_questions', - 'id', $rawresponse->answer)) { - if ($randomresponse = get_record + 'id', $randomquestionid)) { + + if ($answerregs[1] && $answerregs[3]) { + /**** The raw response is formatted according to + /**** Moodle version 1.5 or later ****/ + $randomresponse = $rawresponse; + $randomresponse->question = $randomquestionid; + $randomresponse->answer = $answerregs[4]; + + } else if ($randomresponse = get_record ('quiz_responses', 'question', $rawresponse->answer, 'attempt', $rawresponse->attempt)) { + /*** The response was stored by an older version of Moodle */ + /*** :-) ***/ + } else { + notify("Error: Cannot find response to random question $randomquestionid"); + unset($randomresponse); + } + + if (isset($randomresponse)) { /// The prefered case: - // The response field for the random question was found - // the response array can be extracted: + /// There is a random question and a response field, from + /// which the response array can be extracted: $response = $QUIZ_QTYPES[$randomquestion->qtype] ->extract_response($randomresponse, quiz_qtype_nameprefix($randomquestion, $nameprefix)); } else { - notify("Error: Cannot find response to random question $randomquestion->id"); /// Instead: workaround by creating a new response: $response = $QUIZ_QTYPES[$randomquestion->qtype] ->create_response($randomquestion, quiz_qtype_nameprefix($randomquestion, $nameprefix), - "$rawresponse->question,$rawresponse->answer"); + "$rawresponse->question,$randomquestionid"); // (That last argument is instead of $questionsinuse. // It is not correct but it would be very messy to // determine the correct value, while very few // question types actually use it and they who do have // good chances to execute properly anyway.) } - $response[$nameprefix] = $randomquestion->id; + $response[$nameprefix] = $randomquestionid; return $response; } else { notify("Error: Unable to find random question $rawresponse->question"); -- 2.39.5