You are here

function _quiz_resume_existing_quiz in Quiz 6.6

Same name and namespace in other branches
  1. 8.4 quiz.module \_quiz_resume_existing_quiz()
  2. 6.3 quiz.module \_quiz_resume_existing_quiz()
  3. 6.4 quiz.module \_quiz_resume_existing_quiz()
  4. 6.5 quiz.module \_quiz_resume_existing_quiz()
  5. 7 quiz.module \_quiz_resume_existing_quiz()
  6. 7.4 quiz.module \_quiz_resume_existing_quiz()

Resume an in-progress quiz.

This sets the user's session back to the state it was in when the quiz was aborted.

This function should only be called if the quiz needs resuming. Outside logic needs to check that, though.

Parameters

$quiz: The current quiz.

$uid: The ID of the current user.

$rid: The result ID found for the current quiz.

1 call to _quiz_resume_existing_quiz()
quiz_take_quiz in ./quiz.module
Handles quiz taking.

File

./quiz.module, line 2014
Quiz Module

Code

function _quiz_resume_existing_quiz($quiz, $uid, $rid) {

  // Create question list.
  $questions = quiz_build_question_list($quiz);
  $already_answered = array();

  // Now we need to make sure to set previous questions to be correct.
  // This includes corrections for cases where questions were shuffled.
  $sql = "SELECT question_nid AS nid, question_vid AS vid\n    FROM {quiz_node_results_answers} WHERE result_id = %d ORDER BY answer_timestamp";
  $answered_questions = db_query($sql, $rid);
  while ($answered = db_fetch_object($answered_questions)) {
    foreach ($questions as $question) {
      if ($question['vid'] == $answered->vid) {
        $already_answered[] = $answered->vid;
      }
    }
  }
  reset($questions);
  $_SESSION['quiz_' . $quiz->nid]['previous_quiz_questions'] = array();
  $_SESSION['quiz_' . $quiz->nid]['quiz_questions'] = array();
  foreach ($questions as $question) {
    if (in_array($question['vid'], $already_answered)) {
      $_SESSION['quiz_' . $quiz->nid]['previous_quiz_questions'][] = $question;
    }
    else {
      $_SESSION['quiz_' . $quiz->nid]['quiz_questions'][] = $question;
    }
  }
  $_SESSION['quiz_' . $quiz->nid]['result_id'] = $rid;
  $_SESSION['quiz_' . $quiz->nid]['question_number'] = count($_SESSION['quiz_' . $quiz->nid]['previous_quiz_questions']);

  // Timed quizzes are likely to have expired by this point. But we let
  // the quiz_take_quiz handler handle that.
  $_SESSION['quiz_' . $quiz->nid]['question_start_time'] = time();
  $_SESSION['quiz_' . $quiz->nid]['question_duration'] = $quiz->time_limit;
  drupal_set_message(t('Resuming a previous quiz in-progress.'), 'status');
}