From 66d07f81a17d47753b858908f7b1f71b0e71ba17 Mon Sep 17 00:00:00 2001 From: tjhunt Date: Tue, 8 Jul 2008 18:22:18 +0000 Subject: [PATCH] MDL-15538 - Rework attempt.php to use attemptlib.php - I had broken processing of submitted responses. Hopefully it is fixed again now. --- lang/en_utf8/quiz.php | 1 + lib/questionlib.php | 4 ++-- mod/quiz/attempt.php | 24 +++++++++++------------- mod/quiz/attemptlib.php | 8 +++++--- mod/quiz/locallib.php | 4 ++++ 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/lang/en_utf8/quiz.php b/lang/en_utf8/quiz.php index 3d681b5cba..3060013bd7 100644 --- a/lang/en_utf8/quiz.php +++ b/lang/en_utf8/quiz.php @@ -42,6 +42,7 @@ $string['alwaysavailable'] = 'Always available'; $string['analysisoptions'] = 'Analysis options'; $string['analysistitle'] = 'Item Analysis Table'; $string['answer'] = 'Answer'; +$string['answered'] = 'Answered'; $string['answerhowmany'] = 'One or multiple answers?'; $string['answers'] = 'Answers'; $string['answersingleno'] = 'Multiple answers allowed'; diff --git a/lib/questionlib.php b/lib/questionlib.php index ebdf50bab2..670dbb262f 100644 --- a/lib/questionlib.php +++ b/lib/questionlib.php @@ -1040,7 +1040,7 @@ function restore_question_state(&$question, &$state) { * most recent responses are in ->responses. The object * is updated to hold the new ->id. */ -function save_question_session(&$question, &$state) { +function save_question_session($question, $state) { global $QTYPES, $DB; // Check if the state has changed if (!$state->changed && isset($state->id)) { @@ -1336,7 +1336,7 @@ function regrade_question_in_attempt($question, $attempt, $cmoptions, $verbose=f * during grading its ->sumgrades field can be updated * @return boolean Indicates success/failure */ -function question_process_responses(&$question, &$state, $action, $cmoptions, &$attempt) { +function question_process_responses($question, &$state, $action, $cmoptions, &$attempt) { global $QTYPES; // if no responses are set initialise to empty response diff --git a/mod/quiz/attempt.php b/mod/quiz/attempt.php index 885b8a5068..786fec1176 100644 --- a/mod/quiz/attempt.php +++ b/mod/quiz/attempt.php @@ -47,9 +47,6 @@ $attemptobj->get_quizid(), $attemptobj->get_cmid()); } -/// Work out which questions we need. - $attemptobj->preload_questions(); - /// Get the list of questions needed by this page. if ($finishattempt) { $questionids = $attemptobj->get_question_ids(); @@ -107,17 +104,17 @@ /// Process each question in turn $success = true; + $attempt = $attemptobj->get_attempt(); foreach($submittedquestionids as $id) { if (!isset($actions[$id])) { $actions[$id]->responses = array('' => ''); $actions[$id]->event = QUESTION_EVENTOPEN; } $actions[$id]->timestamp = $timenow; + $state = $attemptobj->get_question_state($id); if (question_process_responses($attemptobj->get_question($id), - $attemptobj->get_question_state($id), $actions[$id], - $attemptobj->get_quiz(), $attemptobj->get_attempt())) { - save_question_session($attemptobj->get_question($id), - $attemptobj->get_question_state($id)); + $state, $actions[$id], $attemptobj->get_quiz(), $attempt)) { + save_question_session($attemptobj->get_question($id), $state); } else { $success = false; } @@ -127,11 +124,13 @@ print_error('errorprocessingresponses', 'question', $attemptobj->attempt_url(0, $page)); } - $attempt = $attemptobj->get_attempt(); $attempt->timemodified = $timenow; if (!$DB->update_record('quiz_attempts', $attempt)) { quiz_error($quiz, 'saveattemptfailed'); } + + // For now, reload the states to pick up the changes: + $attemptobj->load_question_states($questionids); } /// Finish attempt if requested @@ -139,16 +138,16 @@ /// Move each question to the closed state. $success = true; + $attempt = $attemptobj->get_attempt(); foreach ($attemptobj->get_questions() as $id => $question) { $action = new stdClass; $action->event = QUESTION_EVENTCLOSE; $action->responses = $attemptobj->get_question_state($id)->responses; $action->timestamp = $attemptobj->get_question_state($id)->timestamp; + $state = $attemptobj->get_question_state($id); if (question_process_responses($attemptobj->get_question($id), - $attemptobj->get_question_state($id), $action, - $attemptobj->get_quiz(), $attemptobj->get_attempt())) { - save_question_session($attemptobj->get_question($id), - $attemptobj->get_question_state($id)); + $state, $action, $attemptobj->get_quiz(), $attempt)) { + save_question_session($attemptobj->get_question($id), $state); } else { $success = false; } @@ -164,7 +163,6 @@ $attemptobj->get_quizid(), $attemptobj->get_cmid()); /// Update the quiz attempt record. - $attempt = $attemptobj->get_attempt(); $attempt->timemodified = $timenow; $attempt->timefinish = $timenow; if (!$DB->update_record('quiz_attempts', $attempt)) { diff --git a/mod/quiz/attemptlib.php b/mod/quiz/attemptlib.php index 3c050d55e9..5ad9179d96 100644 --- a/mod/quiz/attemptlib.php +++ b/mod/quiz/attemptlib.php @@ -7,7 +7,9 @@ * are loaded. *//** */ -require_once("../../config.php"); +if (!defined('MOODLE_INTERNAL')) { + die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page. +} /** * Class for quiz exceptions. Just saves a couple of arguments on the @@ -410,7 +412,7 @@ class quiz_attempt extends quiz { if (!$newstates = get_question_states($questionstoprocess, $this->quiz, $this->attempt)) { throw new moodle_quiz_exception($this, 'cannotrestore'); } - $this->states = $this->states + $newstates; + $this->states = $newstates + $this->states; } // Simple getters ====================================================================== @@ -499,7 +501,7 @@ class quiz_attempt extends quiz { case QUESTION_EVENTSAVE: case QUESTION_EVENTGRADE: - return 'saved'; + return 'answered'; case QUESTION_EVENTCLOSEANDGRADE: case QUESTION_EVENTCLOSE: diff --git a/mod/quiz/locallib.php b/mod/quiz/locallib.php index a0e17ee837..7215e741c3 100644 --- a/mod/quiz/locallib.php +++ b/mod/quiz/locallib.php @@ -16,6 +16,10 @@ * @package quiz */ +if (!defined('MOODLE_INTERNAL')) { + die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page. +} + /** * Include those library functions that are also used by core Moodle or other modules */ -- 2.39.5