/** * Handle AJAX actions * * This function is used to perform the necessary ajax actions, * that may be used in tests * <br/>Example: * <code> * $result = eF_getTableData("completed_tests", "*", "id=".$_GET['show_solved_test']); * $showTest = unserialize($result[0]['test']); * $status = $showTest -> getStatus($result[0]['users_LOGIN']); * $testString = $showTest -> toHTMLQuickForm(new HTML_Quickform(), false, true, true); * $testString = $showTest -> toHTMLSolved($testString, true); * if (isset($_GET['ajax'])) { * $showTest -> handleAjaxActions(); * } * </code> * * @since 3.5.2 * @access public */ public function handleAjaxActions() { try { if (isset($_GET['test_score'])) { if (mb_strpos($_GET['test_score'], ",") !== false) { $_GET['test_score'] = str_replace(",", ".", $_GET['test_score']); } if (is_numeric($_GET['test_score']) && $_GET['test_score'] <= 100 && $_GET['test_score'] >= 0) { $this->completedTest['score'] = $_GET['test_score']; foreach ($this->questions as $id => $question) { if ($question->pending) { $this->questions[$id]->pending = 0; $this->questions[$id]->score = $this->completedTest['score']; } } if ($this->test['mastery_score'] && $this->test['mastery_score'] > $this->completedTest['score']) { $this->completedTest['status'] = 'failed'; } else { if ($this->test['mastery_score'] && $this->test['mastery_score'] <= $this->completedTest['score']) { $this->completedTest['status'] = 'passed'; } } $this->completedTest['pending'] = 0; $this->save(); $result = eF_getTableData("completed_tests", "archive", "id=" . $this->completedTest['id']); if (!$result[0]['archive']) { $testUser = EfrontUserFactory::factory($this->completedTest['login']); if ($this->completedTest['status'] == 'failed') { $testUser->setSeenUnit($this->test['content_ID'], $this->test['lessons_ID'], 0); } else { $testUser->setSeenUnit($this->test['content_ID'], $this->test['lessons_ID'], 1); } } echo $this->completedTest['status']; } else { throw new EfrontTestException(_INVALIDSCORE . ': ' . $_GET['test_score'], EfrontTestException::INVALID_SCORE); } exit; } else { if (isset($_GET['test_feedback'])) { $this->completedTest['feedback'] = $_GET['test_feedback']; $this->save(); echo $_GET['test_feedback']; exit; } else { if (isset($_GET['redo_test']) && eF_checkParameter($_GET['redo_test'], 'id')) { $result = eF_getTableData("completed_tests", "tests_ID, users_LOGIN", "id=" . $_GET['redo_test']); $test = new EfrontTest($result[0]['tests_ID']); $test->redo($result[0]['users_LOGIN']); exit; } else { if (isset($_GET['redo_wrong_test']) && eF_checkParameter($_GET['redo_wrong_test'], 'id')) { $result = eF_getTableData("completed_tests", "tests_ID, users_LOGIN", "id=" . $_GET['redo_wrong_test']); $test = new EfrontTest($result[0]['tests_ID']); $test->redoOnlyWrong($result[0]['users_LOGIN']); exit; } else { if (isset($_GET['delete_done_test'])) { if (isset($_GET['all'])) { $this->undo($this->completedTest['login']); //eF_deleteTableData("completed_tests", "users_LOGIN='******'login']."' and tests_ID=".$this -> completedTest['testsId']); } else { $this->undo($this->completedTest['login'], $this->completedTest['id']); //eF_deleteTableData("completed_tests", "id=".$this -> completedTest['id']); } exit; } else { if (isset($_GET['question_score'])) { if (mb_strpos($_GET['question_score'], ",") !== false) { $_GET['question_score'] = str_replace(",", ".", $_GET['question_score']); } if (in_array($_GET['question'], array_keys($this->questions))) { if (is_numeric($_GET['question_score']) && $_GET['question_score'] <= 100 && $_GET['question_score'] >= 0) { $this->questions[$_GET['question']]->score = $_GET['question_score']; $this->questions[$_GET['question']]->scoreInTest = round($_GET['question_score'] * $this->getQuestionWeight($_GET['question']), 3); $this->questions[$_GET['question']]->pending = 0; $score = 0; foreach ($this->questions as $question) { $this->completedTest['scoreInTest'][$question->question['id']] = $question->scoreInTest; $score += $question->scoreInTest; } $this->completedTest['score'] = round($score, 2); $testUser = EfrontUserFactory::factory($this->completedTest['login']); if ($this->test['mastery_score'] && $this->test['mastery_score'] > $this->completedTest['score']) { if ($this->getPotentialScore() < $this->test['mastery_score']) { $this->completedTest['status'] = 'failed'; $flag = 0; //$testUser -> setSeenUnit($this -> test['content_ID'], $this -> test['lessons_ID'], 0); } } else { if ($this->test['mastery_score'] && $this->test['mastery_score'] <= $this->completedTest['score']) { $this->completedTest['status'] = 'passed'; $flag = 1; //$testUser -> setSeenUnit($this -> test['content_ID'], $this -> test['lessons_ID'], 1); } } $this->completedTest['pending'] = 0; foreach ($this->getQuestions(true) as $question) { if ($question->pending) { $this->completedTest['pending'] = 1; } } try { $lesson = new EfrontLesson($this->test['lessons_ID']); $lesson_name = $lesson->lesson['name']; } catch (EfrontLessonException $e) { $lesson_name = _SKILLGAPTESTS; } if (!$this->completedTest['pending']) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::TEST_MARKED, "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' && $this->completedTest['pending'] != 1) { 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'])); } $this->save(); $testUser->setSeenUnit($this->test['content_ID'], $this->test['lessons_ID'], $flag); echo json_encode($this->completedTest); } else { throw new EfrontTestException(_INVALIDSCORE . ': ' . $_GET['test_score'], EfrontTestException::INVALID_SCORE); } } else { throw new EfrontTestException(_INVALIDID . ': ' . $_GET['question'], EfrontTestException::QUESTION_NOT_EXISTS); } exit; } else { if (isset($_GET['question_feedback'])) { if (in_array($_GET['question'], array_keys($this->questions))) { $this->questions[$_GET['question']]->feedback = $_GET['question_feedback']; $this->save(); echo $_GET['question_feedback']; } else { throw new EfrontTestException(_INVALIDID . ': ' . $_GET['question'], EfrontTestException::QUESTION_NOT_EXISTS); } exit; } else { if (isset($_GET['delete_file'])) { $file = new EfrontFile($_GET['delete_file']); $testDirectory = $this->getDirectory(); if (strpos($file['path'], $testDirectory['path']) !== false) { $file->delete(); } exit; } } } } } } } } } catch (Exception $e) { handleAjaxExceptions($e); } }