function initATest($testid, $existing_resultid = 0, $existing_answered_questionids = array()) { global $g_db, $G_SESSION, $lngstr, $srv_settings, $g_vars; $i_now = time(); $i_rSet1 = $g_db->SelectLimit("SELECT * FROM " . $srv_settings['table_prefix'] . "tests WHERE testid=" . $testid . " AND test_enabled=1 AND test_datestart<=" . $i_now . " AND test_dateend>" . $i_now, 1); if (!$i_rSet1) { showDBError(__FILE__, 1); } else { if (!$i_rSet1->EOF) { $i_isallowed = $i_rSet1->fields['test_forall']; if (!$i_isallowed) { //9917//9917 $i_isallowed = getRecordCount($srv_settings['table_prefix'] . 'groups_users, ' . $srv_settings['table_prefix'] . 'groups_tests', "(" . $srv_settings['table_prefix'] . "groups_tests.testid=" . $i_rSet1->fields['testid'] . " AND " . $srv_settings['table_prefix'] . "groups_tests.groupid=" . $srv_settings['table_prefix'] . "groups_users.groupid AND " . $srv_settings['table_prefix'] . "groups_users.id=" . $G_SESSION['id'] . ")") > 0; } if ($i_isallowed) { $i_isallowed = $i_rSet1->fields['test_price'] <= 0 || getRecordCount($srv_settings['table_prefix'] . 'tests_own', 'testid=' . $testid . ' AND id=' . $G_SESSION['id']) > 0; } if ($i_isallowed) { $yt_questionids = array(); $i_rSet2 = $g_db->Execute("SELECT " . $srv_settings['table_prefix'] . "tests_questions.questionid, " . $srv_settings['table_prefix'] . "tests_questions.test_sectionid, " . $srv_settings['table_prefix'] . "questions.subjectid, " . $srv_settings['table_prefix'] . "questions.question_points, " . $srv_settings['table_prefix'] . "questions.question_type FROM " . $srv_settings['table_prefix'] . "tests_questions, " . $srv_settings['table_prefix'] . "questions WHERE testid=" . $testid . " AND " . $srv_settings['table_prefix'] . "tests_questions.questionid=" . $srv_settings['table_prefix'] . "questions.questionid ORDER BY " . $srv_settings['table_prefix'] . "tests_questions.test_questionid"); if (!$i_rSet2) { showDBError(__FILE__, 2); } else { $i_questioncounter = 0; $yt_pointsmax = 0; while (!$i_rSet2->EOF) { if ($i_rSet2->fields['question_type'] != QUESTION_TYPE_RANDOM) { $yt_questionids[$i_questioncounter + 1] = $i_rSet2->fields['questionid']; $yt_pointsmax += $i_rSet2->fields['question_points']; $i_questioncounter++; } else { $i_questioncount_by_subjectid = getRecordCount($srv_settings['table_prefix'] . 'questions', "subjectid=" . $i_rSet2->fields['subjectid'] . " AND question_type NOT IN (" . QUESTION_TYPE_RANDOM . ")" . ($yt_questionids ? " AND questionid NOT IN (" . implode(',', $yt_questionids) . ")" : "")); if ($i_questioncount_by_subjectid > 0) { srand((double) microtime() * 10000000); $i_rSet3 = $g_db->SelectLimit("SELECT questionid, question_points FROM " . $srv_settings['table_prefix'] . "questions WHERE subjectid=" . $i_rSet2->fields['subjectid'] . " AND question_type NOT IN (" . QUESTION_TYPE_RANDOM . ")" . ($yt_questionids ? " AND questionid NOT IN (" . implode(',', $yt_questionids) . ")" : ""), 1, rand(0, $i_questioncount_by_subjectid - 1)); if (!$i_rSet3) { showDBError(__FILE__, 3); } else { if (!$i_rSet3->EOF) { $yt_questionids[$i_questioncounter + 1] = $i_rSet3->fields['questionid']; $yt_pointsmax += $i_rSet3->fields['question_points']; $i_questioncounter++; } $i_rSet3->Close(); } } else { showError(__FILE__, $lngstr['err_no_questions_left_in_bank']); } } $i_rSet2->MoveNext(); } $i_rSet2->Close(); } $yt_questioncount = $i_questioncounter; if ($yt_questioncount > 0) { for ($i = 0; $i < $yt_questioncount; $i++) { $yt_questions[$i] = $i + 1; } if ($i_rSet1->fields['test_shuffleq']) { $yt_questions_2 = array(); if (!empty($existing_answered_questionids)) { foreach ($existing_answered_questionids as $key => $val) { foreach ($yt_questionids as $key2 => $val2) { if ($val2 == $val) { $i_questionno = $key2; break; } } $yt_questions_2[$key] = $i_questionno; unset($yt_questions[$i_questionno - 1]); } } $yt_questions = array_merge($yt_questions_2, getShuffledArray($yt_questions)); } $yt_shufflea = (bool) $i_rSet1->fields['test_shufflea']; $i_testtime = (int) $i_rSet1->fields['test_time']; $yt_test_timeforceout = (bool) $i_rSet1->fields['test_timeforceout']; if ($i_testtime < 0) { $i_testtime = 0; } $G_SESSION['testid'] = $testid; if ($existing_resultid > 0) { $G_SESSION['resultid'] = $existing_resultid; } else { if ($g_db->Execute("INSERT INTO " . $srv_settings['table_prefix'] . "results (testid,id,result_datestart) VALUES (" . $testid . "," . $G_SESSION['id'] . "," . $i_now . ")") === false) { showDBError(__FILE__, 5); } $G_SESSION['resultid'] = $g_db->Insert_ID($srv_settings['table_prefix'] . 'results', 'resultid'); } $G_SESSION['yt_name'] = $i_rSet1->fields['test_name']; $G_SESSION['yt_result_etemplateid'] = $i_rSet1->fields['result_etemplateid']; if ($i_rSet1->fields['result_etemplateid'] > 0) { $G_SESSION['yt_result_email'] = trim($i_rSet1->fields['test_result_email']); $G_SESSION['yt_result_emailtouser'] = $i_rSet1->fields['test_result_emailtouser']; } $G_SESSION['yt_teststart'] = $i_now; $G_SESSION['yt_testtime'] = $i_testtime; $G_SESSION['yt_timeforceout'] = $yt_test_timeforceout; $G_SESSION['yt_attempts'] = $i_rSet1->fields['test_attempts']; $G_SESSION['yt_pointsmax'] = $yt_pointsmax; $G_SESSION['yt_questioncount'] = $yt_questioncount; $G_SESSION['yt_questions'] = $yt_questions; $G_SESSION['yt_questionids'] = $yt_questionids; $G_SESSION['yt_answers'] = array(); $G_SESSION['yt_shufflea'] = $yt_shufflea; $G_SESSION['yt_test_qsperpage'] = $i_rSet1->fields['test_qsperpage']; $G_SESSION['yt_test_showqfeedback'] = (bool) $i_rSet1->fields['test_showqfeedback']; $G_SESSION['yt_result_showanswers'] = (bool) $i_rSet1->fields['test_result_showanswers']; $G_SESSION['yt_result_showpoints'] = (bool) $i_rSet1->fields['test_result_showpoints']; $G_SESSION['yt_result_showgrade'] = (bool) $i_rSet1->fields['test_result_showgrade']; $G_SESSION['yt_result_showgradefeedback'] = (bool) $i_rSet1->fields['test_result_showgradefeedback']; $G_SESSION['yt_result_showhtml'] = (bool) $i_rSet1->fields['test_result_showhtml'] && $i_rSet1->fields['rtemplateid'] > 0; $G_SESSION['yt_result_showpdf'] = (bool) $i_rSet1->fields['test_result_showpdf'] && $i_rSet1->fields['rtemplateid'] > 0; $G_SESSION['yt_result_rtemplateid'] = $i_rSet1->fields['test_result_rtemplateid']; $G_SESSION['yt_reportgradecondition'] = $i_rSet1->fields['test_reportgradecondition']; $G_SESSION['yt_gscaleid'] = (int) $i_rSet1->fields['gscaleid']; $G_SESSION['yt_prevtestid'] = (int) $i_rSet1->fields['test_prevtestid']; $G_SESSION['yt_nexttestid'] = (int) $i_rSet1->fields['test_nexttestid']; $G_SESSION['yt_other_repeatuntilcorrect'] = (bool) $i_rSet1->fields['test_other_repeatuntilcorrect']; $G_SESSION['yt_contentprotection'] = (int) $i_rSet1->fields['test_contentprotection']; $G_SESSION['yt_canreview'] = (int) $i_rSet1->fields['test_canreview']; $G_SESSION['yt_subjects'] = array(); $G_SESSION['yt_questionno'] = 1; $G_SESSION['yt_got_answers'] = 0; $G_SESSION['yt_got_points'] = 0; $G_SESSION['yt_points_pending'] = 0; if (!empty($i_rSet1->fields['test_instructions'])) { $G_SESSION['yt_state'] = TEST_STATE_TESTINTRO; } else { $G_SESSION['yt_state'] = TEST_STATE_QSHOW; } eventOnBeforeTestStart(); return true; } else { $g_vars['page']['errors'] = $lngstr['err_no_questions']; return false; } } else { $g_vars['page']['notifications'] = $lngstr['inf_cant_passtest']; return false; } } else { $g_vars['page']['errors'] = $lngstr['err_no_tests']; return false; } $i_rSet1->Close(); } }
function readTestQuestion($i_questionno, $i_questionid) { global $g_db, $G_SESSION, $lngstr, $srv_settings, $g_vars; $i_rSet2 = $g_db->Execute("SELECT * FROM " . $srv_settings['table_prefix'] . "questions WHERE questionid=" . $i_questionid); if (!$i_rSet2) { showDBError('readTestQuestion', 1); } else { if (!$i_rSet2->EOF) { $g_vars['page']['question'][$i_questionno]['text'] = $i_rSet2->fields['question_text']; $g_vars['page']['question'][$i_questionno]['type'] = $i_rSet2->fields['question_type']; $g_vars['page']['question'][$i_questionno]['shuffle'] = $i_rSet2->fields['question_shufflea']; } else { $g_vars['page']['errors'] = sprintf($lngstr['err_no_question_id_in_db'], $i_questionid); $g_vars['page']['errors_fatal'] = true; return false; } $i_rSet2->Close(); } $i_answer_text = array(); $i_answer_feedback = array(); $g_vars['page']['question'][$i_questionno]['answer_count'] = 0; $g_vars['page']['question'][$i_questionno]['correct_answer_count'] = 0; $i_rSet3 = $g_db->Execute("SELECT answer_text, answer_feedback, answer_correct FROM " . $srv_settings['table_prefix'] . "answers WHERE questionid=" . $i_questionid . " ORDER BY answerid"); if (!$i_rSet3) { showDBError('readTestQuestion', 2); } else { while (!$i_rSet3->EOF) { $g_vars['page']['question'][$i_questionno]['answer_count']++; $i_answer_text[$g_vars['page']['question'][$i_questionno]['answer_count']] = $i_rSet3->fields['answer_text']; $i_answer_feedback[$g_vars['page']['question'][$i_questionno]['answer_count']] = $i_rSet3->fields['answer_feedback']; $g_vars['page']['question'][$i_questionno]['correct_answer_count'] += $i_rSet3->fields['answer_correct'] ? 1 : 0; $i_rSet3->MoveNext(); } $i_rSet3->Close(); switch ($g_vars['page']['question'][$i_questionno]['type']) { case QUESTION_TYPE_MULTIPLECHOICE: case QUESTION_TYPE_TRUEFALSE: case QUESTION_TYPE_MULTIPLEANSWER: if ($g_vars['page']['question'][$i_questionno]['answer_count']) { if (!isset($G_SESSION['yt_answers'][$i_questionno])) { $i_answer_order = array(); for ($i = 0; $i < $g_vars['page']['question'][$i_questionno]['answer_count']; $i++) { $i_answer_order[$i] = $i + 1; } if ($g_vars['page']['question'][$i_questionno]['answer_count'] > 1 && $g_vars['page']['question'][$i_questionno]['type'] != QUESTION_TYPE_TRUEFALSE) { if ($G_SESSION['yt_shufflea'] && $g_vars['page']['question'][$i_questionno]['shuffle'] == IGT_SHUFFLE_ANSWERS_INHERIT || $g_vars['page']['question'][$i_questionno]['shuffle'] == IGT_SHUFFLE_ANSWERS_DO) { $i_answer_order = getShuffledArray($i_answer_order); } else { if ($g_vars['page']['question'][$i_questionno]['shuffle'] == IGT_SHUFFLE_ANSWERS_EXCEPT_FIRST) { array_shift($i_answer_order); $i_answer_order = getShuffledArray($i_answer_order); array_unshift($i_answer_order, 1); } else { if ($g_vars['page']['question'][$i_questionno]['shuffle'] == IGT_SHUFFLE_ANSWERS_EXCEPT_LAST) { array_pop($i_answer_order); $i_answer_order = getShuffledArray($i_answer_order); array_push($i_answer_order, $g_vars['page']['question'][$i_questionno]['answer_count']); } } } } $G_SESSION['yt_answers'][$i_questionno] = $i_answer_order; } foreach ($G_SESSION['yt_answers'][$i_questionno] as $i_id => $i_no) { $g_vars['page']['question'][$i_questionno]['answer'][$i_id + 1]['text'] = $i_answer_text[$i_no]; $g_vars['page']['question'][$i_questionno]['answer'][$i_id + 1]['feedback'] = $i_answer_feedback[$i_no]; if (!$g_vars['page']['has_feedback']) { $g_vars['page']['has_feedback'] = strlen($i_answer_feedback[$i_no]) > 0; } switch ($g_vars['page']['question'][$i_questionno]['type']) { case QUESTION_TYPE_MULTIPLECHOICE: case QUESTION_TYPE_TRUEFALSE: if ($G_SESSION['yt_state'] == TEST_STATE_QREVIEW) { $nSelectedAnswer = (int) getRecordItem($srv_settings['table_prefix'] . 'results_answers', 'result_answer_text', 'resultid=' . $G_SESSION['resultid'] . ' AND questionid=' . $i_questionid); $bIsSelected = $nSelectedAnswer == $i_no; } else { $nSelectedAnswer = isset($_POST['answer']) && isset($_POST['answer'][$i_questionno]) ? $_POST['answer'][$i_questionno] : 0; $bIsSelected = $nSelectedAnswer == $i_id + 1; } break; case QUESTION_TYPE_MULTIPLEANSWER: if ($G_SESSION['yt_state'] == TEST_STATE_QREVIEW) { $nSelectedAnswers = explode(QUESTION_TYPE_MULTIPLEANSWER_BREAK, getRecordItem($srv_settings['table_prefix'] . 'results_answers', 'result_answer_text', 'resultid=' . $G_SESSION['resultid'] . ' AND questionid=' . $i_questionid)); $bIsSelected = is_array($nSelectedAnswers) && in_array($i_no, $nSelectedAnswers); } else { $nSelectedAnswers = isset($_POST['answer']) && isset($_POST['answer'][$i_questionno]) ? $_POST['answer'][$i_questionno] : array(); $bIsSelected = is_array($nSelectedAnswers) && in_array($i_id + 1, $nSelectedAnswers); } break; } $g_vars['page']['question'][$i_questionno]['answer'][$i_id + 1]['selected'] = $bIsSelected; } } else { $g_vars['page']['errors'] = sprintf($lngstr['err_no_answers_in_question'], $i_questionid); $g_vars['page']['errors_fatal'] = true; return false; } break; case QUESTION_TYPE_FILLINTHEBLANK: case QUESTION_TYPE_ESSAY: $g_vars['page']['question'][$i_questionno]['answer_count'] = 1; $g_vars['page']['question'][$i_questionno]['answer'][1]['feedback'] = ''; if ($G_SESSION['yt_state'] == TEST_STATE_QREVIEW) { $g_vars['page']['question'][$i_questionno]['answer'][1]['text'] = getRecordItem($srv_settings['table_prefix'] . 'results_answers', 'result_answer_text', 'resultid=' . $G_SESSION['resultid'] . ' AND questionid=' . $i_questionid); } else { $g_vars['page']['question'][$i_questionno]['answer'][1]['text'] = ''; } break; } } return true; }