You are here

function quiz_calculate_score in Quiz 6.6

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

Calculates the score user received on quiz.

Parameters

$quiz: The quiz node.

$rid: Quiz result ID.

Return value

array Contains three elements: question_count, num_correct and percentage_score.

4 calls to quiz_calculate_score()
quiz_admin_results in ./quiz.admin.inc
Quiz Results Admin.
quiz_end_actions in ./quiz.module
Actions to take at the end of a quiz.
quiz_update_total_score in ./quiz.module
Update a score for a quiz.
quiz_user_results in ./quiz.pages.inc

File

./quiz.module, line 1661
Quiz Module

Code

function quiz_calculate_score($quiz, $rid) {

  // Handle personality-style quiz scoring separately:
  if ($quiz->pass_rate == 0) {
    return quiz_calculate_personality_score($quiz, $rid);
  }

  // 1. Get each question for the quiz.

  /*
  $sql = 'SELECT qnr.child_nid, qnr.child_vid , n.type
    FROM {quiz_node_relationship} qnr
    INNER JOIN {node} n ON n.nid = qnr.child_nid
    WHERE qnr.parent_nid = %d';
  $results = db_query($sql, $quiz->nid);
  */
  $sql = 'SELECT question_nid AS child_nid, question_vid AS child_vid, type
  FROM {quiz_node_results_answers}
  LEFT JOIN {node} ON (question_nid = nid AND question_vid = vid)
  WHERE result_id = %d';
  $results = db_query($sql, $rid);

  // 2. Callback into the modules and let them do the scoring.
  $scores = array();
  $count = 0;
  while ($question = db_fetch_object($results)) {

    // Invoke hook_quiz_question_score().
    // We don't use module_invoke() because (1) we don't necessarily want to wed quiz type to
    // module, and (2) this is more efficient -- no NULL checks.
    $mod = quiz_module_for_type($question->type);
    $function = $mod . '_quiz_question_score';
    if (function_exists($function)) {
      $scores[] = $function($quiz, $question->child_nid, $question->child_vid, $rid);
    }
    else {
      drupal_set_message('A quiz question could not be scored: No scoring info is available', 'error');
      $dummy_score = new stdClass();
      $dummy_score->possible = 0;
      $dummy_score->attained = 0;
      $scores[] = $dummy_score;
    }
    ++$count;
  }

  // 3. Sum the results
  $possible_score = 0;
  $total_score = 0;
  $is_evaluated = TRUE;
  foreach ($scores as $score) {
    $possible_score += $score->possible;
    $total_score += $score->attained;
    if (isset($score->is_evaluated)) {

      // Flag the entire quiz if one question has not been
      // evaluated.
      $is_evaluated &= $score->is_evaluated;
    }
  }

  // 4. Return the score
  return array(
    'question_count' => $count,
    'possible_score' => $possible_score,
    'numeric_score' => $total_score,
    'percentage_score' => $possible_score == 0 ? 0 : round($total_score * 100 / $possible_score),
    'is_evaluated' => $is_evaluated,
  );
}