You are here

function quiz_store_question_result in Quiz 7.6

Same name and namespace in other branches
  1. 8.4 quiz.module \quiz_store_question_result()
  2. 5.2 quiz.module \quiz_store_question_result()
  3. 6.6 quiz.module \quiz_store_question_result()
  4. 6.2 quiz.module \quiz_store_question_result()
  5. 6.3 quiz.module \quiz_store_question_result()
  6. 6.4 quiz.module \quiz_store_question_result()
  7. 6.5 quiz.module \quiz_store_question_result()
  8. 7 quiz.module \quiz_store_question_result()
  9. 7.4 quiz.module \quiz_store_question_result()
  10. 7.5 quiz.module \quiz_store_question_result()

Store a quiz question result.

Parameters

$quiz: The quiz node

$result: Object with data about the result for a question.

$options: Array with options that affect the behavior of this function. ['set_msg'] - Sets a message if the last question was skipped.

Related topics

2 calls to quiz_store_question_result()
quiz_end_scoring in ./quiz.module
Score a completed quiz.
quiz_question_answering_form_submit in question_types/quiz_question/quiz_question.module
Submit handler for the question answering form.

File

./quiz.module, line 1897
quiz.module Main file for the Quiz module.

Code

function quiz_store_question_result($quiz, $result, $options) {
  if (!isset($result->score)) {
    $result->score = $result->is_correct ? 1 : 0;
  }

  // Points are stored pre-scaled in the quiz_node_results_answers table. We get the scale.
  if ($quiz->randomization < 2) {
    $scale = db_query("SELECT (max_score / (\n                  SELECT max_score\n                  FROM {quiz_question_properties}\n                  WHERE nid = :nid AND vid = :vid\n                )) as scale\n                FROM {quiz_node_relationship}\n                WHERE parent_nid = :parent_nid\n                AND parent_vid = :parent_vid\n                AND child_nid = :child_nid\n                AND child_vid = :child_vid\n               ", array(
      ':nid' => $result->nid,
      ':vid' => $result->vid,
      ':parent_nid' => $quiz->nid,
      ':parent_vid' => $quiz->vid,
      ':child_nid' => $result->nid,
      ':child_vid' => $result->vid,
    ))
      ->fetchField();
  }
  elseif ($quiz->randomization == 2) {
    $scale = db_query("SELECT (max_score_for_random / (\n                  SELECT max_score\n                  FROM {quiz_question_properties}\n                  WHERE nid = :question_nid AND vid = :question_vid\n                )) as scale\n                FROM {quiz_node_properties}\n                WHERE vid = :quiz_vid\n               ", array(
      ':question_nid' => $result->nid,
      ':question_vid' => $result->vid,
      ':quiz_vid' => $quiz->vid,
    ))
      ->fetchField();
  }
  elseif ($quiz->randomization == 3) {
    if (isset($options['question_data']['tid'])) {
      $result->tid = $options['question_data']['tid'];
    }
    $scale = db_query("SELECT (max_score / (\n                  SELECT max_score\n                  FROM {quiz_question_properties}\n                  WHERE nid = :nid AND vid = :vid\n                )) as scale\n                FROM {quiz_terms}\n                WHERE vid = :vid\n                AND tid = :tid\n               ", array(
      ':nid' => $result->nid,
      ':vid' => $result->vid,
      ':vid' => $quiz->vid,
      ':tid' => $result->tid,
    ))
      ->fetchField();
  }
  $points = round($result->score * $scale);

  // Insert result data, or update existing data.
  $result_answer_id = db_query("SELECT result_answer_id\n              FROM {quiz_node_results_answers}\n              WHERE question_nid = :question_nid\n              AND question_vid = :question_vid\n              AND result_id = :result_id", array(
    ':question_nid' => $result->nid,
    ':question_vid' => $result->vid,
    ':result_id' => $result->result_id,
  ))
    ->fetchField();
  $entity = (object) array(
    'result_answer_id' => $result_answer_id,
    'question_nid' => $result->nid,
    'question_vid' => $result->vid,
    'result_id' => $result->result_id,
    'is_correct' => (int) $result->is_correct,
    'points_awarded' => $points,
    'answer_timestamp' => REQUEST_TIME,
    'is_skipped' => (int) $result->is_skipped,
    'is_doubtful' => (int) $result->is_doubtful,
    'number' => $options['question_data']['number'],
    'tid' => $quiz->randomization == 3 && $result->tid ? $result->tid : NULL,
  );
  entity_save('quiz_result_answer', $entity);
}