if (G_VERSIONTYPE != 'community') { #cpp#ifndef COMMUNITY if (G_VERSIONTYPE != 'standard') { #cpp#ifndef STANDARD //This file cannot be called directly, only included. if (str_replace(DIRECTORY_SEPARATOR, "/", __FILE__) == $_SERVER['SCRIPT_FILENAME']) { exit; } $loadScripts[] = 'includes/tests'; if (isset($_GET['solve_test']) && eF_checkParameter($_GET['solve_test'], 'id')) { if (isset($_GET['confirm'])) { $form = new HTML_QuickForm("test_form", "post", basename($_SERVER['PHP_SELF']) . '?ctg=lessons&op=tests&solve_test=' . $_GET['solve_test'] . '&confirm=1', "", null, true); if ($form->isSubmitted() && $form->validate()) { // The skillgap test has been solved and submitted $result = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct join completed_tests_blob ctb on ct.id=ctb.completed_tests_ID", "ct.*,ctb.test", "status != 'deleted' and tests_id = '" . $_GET['solve_test'] . "' AND users_LOGIN = '******'login'] . "'"); $testInstance = unserialize($result[0]['test']); $testString = $testInstance->toHTMLQuickForm($form); $testString = $testInstance->toHTML($testString, $remainingTime); $questions = $form->exportValues('question'); $questions = $form->getSubmitValue('question'); $testInstance->completedTest['status'] = 'completed'; $testInstance->complete($questions); eF_updateTableData("users_to_skillgap_tests", array("solved" => "1"), "tests_ID = '" . $_GET['solve_test'] . "' AND users_LOGIN = '******'login'] . "'"); // Check if you should automatically assign lessons and courses to the student if ($testInstance->options['automatic_assignment']) { $analysisResults = $testInstance->analyseSkillGapTest(); foreach ($analysisResults['lessons'] as $lesson) { $currentUser->addLessons($lesson['lesson_ID']); } foreach ($analysisResults['courses'] as $course) {
public static function getQuestionResponseDetails($testStats) { $userQuestions = array(); foreach ($testStats as $value) { foreach ($value as $user => $testAttempts) { foreach ($testAttempts as $testAttempt) { if (is_array($testAttempt) && isset($testAttempt['id'])) { $result = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct join completed_tests_blob ctb on ct.id=ctb.completed_tests_ID", "ct.*,ctb.test", "ct.id=" . $testAttempt['id']); $test = unserialize($result[0]['test']); foreach ($test->questions as $question) { $answers = array(); if ($question instanceof MultipleManyQuestion) { foreach ($question->order as $index) { if ($question->userAnswer[$index]) { $answers[] = $question->options[$index]; } } } elseif ($question instanceof MatchQuestion || $question instanceof DragDropQuestion) { foreach ($question->order as $index) { $answers[] = $question->options[$index] . ' → ' . $question->answer[$question->userAnswer[$index]]; } } elseif ($question instanceof TrueFalseQuestion) { if ($question->userAnswer === false) { $answers[] = _NORESPONSE; } else { $answers[] = $question->userAnswer ? _TRUE : _FALSE; } } elseif ($question instanceof EmptySpacesQuestion) { $occurences = preg_match_all("/###(\\d*)/", $question->question['plain_text'], $matches); for ($i = 0; $i < $occurences; $i++) { $question->question['plain_text'] = preg_replace("/###(\\d*)/", "<b>" . $question->userAnswer[$i] . "</b>", $question->question['plain_text'], 1); } $answers[] = $question->question['plain_text']; } elseif ($question instanceof MultipleOneQuestion) { foreach ($question->order as $index) { if ($question->userAnswer == $index) { if ($question->userAnswer === false) { $answers[] = _NORESPONSE; } else { $answers[] = $question->options[$index]; } } } } elseif ($question instanceof RawTextQuestion) { $answers[] = $question->userAnswer; } $userQuestions[$question->question['id']][$user][] = implode("<br/>", $answers); } } } } } return $userQuestions; }
/** * Complete test * * This function is used to complete the current test. The user answers are * submitted, the test is graded and the results are stored. * <br/>Example: * <code> * $test = new EfrontTest(23); * $testInstance = new EfrontCompletedTest($test, 'jdoe'); * $testInstance -> complete($userAnswers); * </code> * * @param array $userAnswers The user answers, in an array where keys are question ids and values are answers * @since 3.5.2 * @access public * @todo check if folder exists, handle uploaded files */ public function complete($userAnswers) { $resultCompleted = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct join completed_tests_blob ctb on ct.id=ctb.completed_tests_ID", "ctb.test", "archive=1 AND users_LOGIN='******'s_login'] . "' AND tests_ID=" . $this->test['id'], "timestamp desc", "", "1"); $recentlyCompleted = unserialize($resultCompleted[0]['test']); //Assign user answers to each question object, as a member foreach ($userAnswers as $id => $answer) { $this->questions[$id]->userAnswer = $answer; } if ($recentlyCompleted->redoOnlyWrong == 1) { foreach ($recentlyCompleted->questions as $key => $value) { if ($value->score == 100) { $this->questions[$key] = $value; } } } //Correct each question and handle uploaded files, if any (@todo) $this->completedTest['score'] = 0; //Added to check EC-73 foreach ($this->questions as $id => $question) { $results = $question->correct(); //Get the results, which is the score and the right/wrong answers if ($question->question['type'] == 'raw_text') { $question->handleQuestionFiles($this->getDirectory()); if (!$question->settings['force_correct'] || $question->settings['force_correct'] == 'manual') { //changed to mark as pending the test again when redoOnlyWrong is set and this question was not 100% correct before if ($results['score'] != 1) { $this->completedTest['pending'] = 1; $question->pending = 1; } } elseif ($question->settings['force_correct'] == 'none' || $question->settings['force_correct'] == 1) { //1 is for backwards compatibility $results['score'] = 1; } } $question->score = round($results['score'] * 100, 2); $question->results = $results['correct']; $this->completedTest['score'] += $results['score'] * $this->getQuestionWeight($id); //the total test score $question->scoreInTest = round($question->score * $this->getQuestionWeight($id), 3); //Score in test is the question score, weighted with the question's weight in the test } $this->completedTest['score'] > 1 ? $this->completedTest['score'] = 100 : ($this->completedTest['score'] = round($this->completedTest['score'] * 100, 2)); //Due to roundings, overall score may go slightly above 100. so, truncate it to 100 //Set the test status if ($this->test['mastery_score'] && $this->completedTest['score'] >= $this->test['mastery_score']) { $this->completedTest['status'] = 'passed'; } else { if ($this->test['mastery_score'] && $this->completedTest['score'] < $this->test['mastery_score']) { $this->completedTest['status'] = 'failed'; } else { $this->completedTest['status'] = 'completed'; } } $this->time['spent'] = $this->time['spent'] + time() - $this->time['resume']; try { $lesson = new EfrontLesson($this->test['lessons_ID']); $lesson_name = $lesson->lesson['name']; } catch (EfrontLessonException $e) { $lesson_name = _SKILLGAPTESTS; } EfrontEvent::triggerEvent(array("type" => EfrontEvent::TEST_COMPLETION, "users_LOGIN" => $this->completedTest['login'], "lessons_ID" => $this->test['lessons_ID'], "lessons_name" => $lesson_name, "entity_ID" => $this->test['id'], "entity_name" => $this->test['name'])); if ($this->completedTest['status'] == 'failed') { EfrontEvent::triggerEvent(array("type" => EfrontEvent::TEST_FAILURE, "users_LOGIN" => $this->completedTest['login'], "lessons_ID" => $this->test['lessons_ID'], "lessons_name" => $lesson_name, "entity_ID" => $this->test['id'], "entity_name" => $this->test['name'])); } if ($this->options['duration'] && $this->time['spent'] > $this->options['duration']) { $this->time['spent'] = $this->options['duration']; //MAke sure that the spent time does not appear longer than the test duration } $this->time['end'] = time(); $this->save(); //Save the test }
$courses = eF_filterData($courses, $_GET['filter']); } $smarty->assign("T_COURSES_SIZE", sizeof($courses)); if (isset($_GET['limit']) && eF_checkParameter($_GET['limit'], 'int')) { isset($_GET['offset']) && eF_checkParameter($_GET['offset'], 'int') ? $offset = $_GET['offset'] : ($offset = 0); $courses = array_slice($courses, $offset, $limit); } //foreach ($courses as $key => $course) { //$courses[$key]['languages_NAME'] = $languages[$course['languages_NAME']]; //} $smarty->assign("T_COURSES_DATA", $courses); $smarty->display($_SESSION['s_type'] . '.tpl'); exit; } // We change a bit the following typical query to acquire the latest options values for the test - in case a threshold has been changed $result = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct JOIN completed_tests_blob ctb on ct.id=ctb.completed_tests_ID JOIN tests t ON t.id = ct.tests_ID", "ct.*, ctb.test, t.options", "ct.status != 'deleted' and ct.id = '" . $_GET['show_solved_test'] . "'"); $completedTest = unserialize($result[0]['test']); // Take the most recent set general threshold for this test $temp = unserialize($result[0]['options']); $completedTest->options['general_threshold'] = $temp['general_threshold']; $smarty->assign("T_TEST_DATA", $completedTest); if ($_SESSION['s_type'] == 'administrator') { $user = eF_getTableData("users", "*", "login = '******'user'] . "'"); } else { $user = eF_getTableData("users", "*", "login = '******'s_login'] . "'"); } $smarty->assign("T_USER_INFO", $user[0]); $analysisResults = $completedTest->analyseSkillGapTest(); if (!empty($analysisResults['testSkills'])) { $smarty->assign("T_SKILLSGAP", $analysisResults['testSkills']); }
} try { if (isset($_GET['test_id']) && eF_checkParameter($_GET['test_id'], 'id') && eF_checkParameter($_GET['user'], 'login')) { $test = new EfrontTest($_GET['test_id']); $doneTests = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct join completed_tests_blob ctb on ct.id=ctb.completed_tests_ID", "ct.*,ctb.test", "status != 'deleted' and users_LOGIN = '******'user'] . "' and tests_ID=" . $test->test['id']); // $test -> setDone($_GET['user']); } else { if (isset($_GET['content_id']) && eF_checkParameter($_GET['content_id'], 'id') && eF_checkParameter($_GET['user'], 'login')) { $test = new EfrontTest($_GET['content_id'], true); $doneTests = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct join completed_tests_blob ctb on ct.id=ctb.completed_tests_ID", "ct.*,ctb.test", "status != 'deleted' and users_LOGIN = '******'user'] . "' and tests_ID=" . $test->test['id']); // $test -> setDone($_GET['user']); } else { if (isset($_GET['done_test_id']) && eF_checkParameter($_GET['done_test_id'], 'id')) { $result = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct join completed_tests_blob ctb on ct.id=ctb.completed_tests_ID", "ct.*,ctb.test", "status != 'deleted' and ct.id=" . $_GET['done_test_id']); $test = new EfrontTest($result[0]['tests_ID']); $doneTests = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct join completed_tests_blob ctb on ct.id=ctb.completed_tests_ID", "ct.*,ctb.test", "status != 'deleted' and users_LOGIN = '******'users_LOGIN'] . "' and tests_ID=" . $test->test['id']); $_GET['user'] = $result[0]['users_LOGIN']; // $test -> setDone($result[0]['users_LOGIN']); } else { throw new Exception(_INVALIDID); } } } //Reorder done tests in a per-id fashion $temp = array(); foreach ($doneTests as $value) { $temp[$value['id']] = $value; } $doneTests = $temp; if (isset($_GET['show_solved_test']) && in_array($_GET['show_solved_test'], array_keys($doneTests)) && eF_checkParameter($_GET['show_solved_test'], 'id')) { $showTest = unserialize($doneTests[$_GET['show_solved_test']]['test']);