function quiz_calculate_score in Quiz 6.5
Same name and namespace in other branches
- 8.4 quiz.module \quiz_calculate_score()
- 5.2 quiz.module \quiz_calculate_score()
- 5 quiz.module \quiz_calculate_score()
- 6.6 quiz.module \quiz_calculate_score()
- 6.2 quiz.module \quiz_calculate_score()
- 6.3 quiz.module \quiz_calculate_score()
- 6.4 quiz.module \quiz_calculate_score()
- 7.6 quiz.module \quiz_calculate_score()
- 7 quiz.module \quiz_calculate_score()
- 7.4 quiz.module \quiz_calculate_score()
- 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 1640 - 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,
);
}