Esempio n. 1
0
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) {
Esempio n. 2
0
 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;
 }
Esempio n. 3
0
 /**
  * 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
 }
Esempio n. 4
0
         $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']);
 }
Esempio n. 5
0
}
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']);