Ejemplo n.º 1
0
 /**
  * Called when a user answered a question to perform a redirect after POST.
  * This is called for security reasons to prevent users sending a form twice.
  * --> description up to date ??
  *
  * @access public
  */
 protected function redirectQuestionCmd()
 {
     global $ilUser;
     // check the test restrictions to access the test in case one
     // of the test navigation commands was called by an external script
     // e.g. $ilNavigationHistory
     $executable = $this->object->isExecutable($this->testSession, $ilUser->getId());
     if (!$executable["executable"]) {
         ilUtil::sendInfo($executable["errormessage"], TRUE);
         $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
     }
     switch ($_GET["activecommand"]) {
         case "next":
             $this->sequence = $this->calculateSequence();
             if ($this->sequence === FALSE) {
                 if ($this->object->getListOfQuestionsEnd()) {
                     $allObligationsAnswered = ilObjTest::allObligationsAnswered($this->testSession->getTestId(), $this->testSession->getActiveId(), $this->testSession->getPass());
                     if ($this->object->areObligationsEnabled() && !$allObligationsAnswered) {
                         $this->ctrl->redirect($this, "outQuestionSummaryWithObligationsInfo");
                     }
                     $this->outQuestionSummaryCmd();
                 } else {
                     $this->ctrl->redirect($this, "finishTest");
                 }
             } else {
                 $this->testSession->setLastSequence($this->sequence);
                 $this->testSession->saveToDb();
                 $this->outTestPage(false);
             }
             break;
         case "previous":
             $this->sequence = $this->calculateSequence();
             $this->testSession->setLastSequence($this->sequence);
             $this->testSession->saveToDb();
             if ($this->sequence === FALSE) {
                 $this->ctrl->redirect($this, "outIntroductionPage");
             } else {
                 $this->outTestPage(false);
             }
             break;
         case "postpone":
             $this->sequence = $this->calculateSequence();
             $nextSequence = $this->testSequence->getNextSequence($this->sequence);
             $this->testSequence->postponeSequence($this->sequence);
             $this->testSequence->saveToDb();
             $this->testSession->setLastSequence($nextSequence);
             $this->testSession->saveToDb();
             $this->sequence = $nextSequence;
             $this->outTestPage(false);
             break;
         case "setmarked":
             $this->sequence = $this->calculateSequence();
             $this->testSession->setLastSequence($this->sequence);
             $this->testSession->saveToDb();
             $q_id = $this->testSequence->getQuestionForSequence($_GET["sequence"]);
             $this->object->setQuestionSetSolved(1, $q_id, $ilUser->getId());
             $this->outTestPage(false);
             break;
         case "resetmarked":
             $this->sequence = $this->calculateSequence();
             $this->testSession->setLastSequence($this->sequence);
             $this->testSession->saveToDb();
             $q_id = $this->testSequence->getQuestionForSequence($_GET["sequence"]);
             $this->object->setQuestionSetSolved(0, $q_id, $ilUser->getId());
             $this->outTestPage(false);
             break;
         case "directfeedback":
             $this->sequence = $this->calculateSequence();
             $this->testSession->setLastSequence($this->sequence);
             $this->testSession->saveToDb();
             $this->outTestPage(true);
             break;
         case "handleQuestionAction":
             $this->sequence = $this->calculateSequence();
             $this->testSession->setLastSequence($this->sequence);
             $this->testSession->saveToDb();
             $this->outTestPage(false);
             break;
         case "summary":
             $this->ctrl->redirect($this, "outQuestionSummary");
             break;
         case "summary_obligations":
             $this->ctrl->redirect($this, "outQuestionSummaryWithObligationsInfo");
             break;
         case "summary_obligations_only":
             $this->ctrl->redirect($this, "outObligationsOnlySummary");
             break;
         case "start":
             $_SESSION['tst_pass_finish'] = 0;
             // ensure existing test session
             $this->testSession->setUserId($ilUser->getId());
             $this->testSession->setAnonymousId($_SESSION["tst_access_code"][$this->object->getTestId()]);
             $this->testSession->setObjectiveOrientedContainerId($this->getObjectiveOrientedContainerId());
             $this->testSession->saveToDb();
             $active_id = $this->testSession->getActiveId();
             $this->ctrl->setParameter($this, "active_id", $active_id);
             $shuffle = $this->object->getShuffleQuestions();
             if ($this->object->isRandomTest()) {
                 $this->generateRandomTestPassForActiveUser();
                 $this->object->loadQuestions();
                 $shuffle = FALSE;
                 // shuffle is already done during the creation of the random questions
             }
             assQuestion::_updateTestPassResults($active_id, $this->testSession->getPass(), $this->object->areObligationsEnabled(), null, $this->object->id);
             // ensure existing test sequence
             if (!$this->testSequence->hasSequence()) {
                 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
                 $this->testSequence->saveToDb();
             }
             if ($this->testSession->isObjectiveOriented()) {
                 $this->testSequence->loadFromDb();
                 $this->testSequence->loadQuestions();
                 $this->filterTestSequenceByObjectives($this->testSession, $this->testSequence);
             }
             $active_time_id = $this->object->startWorkingTime($this->testSession->getActiveId(), $this->testSession->getPass());
             $_SESSION["active_time_id"] = $active_time_id;
             if ($this->object->getListOfQuestionsStart()) {
                 $this->ctrl->setParameter($this, "activecommand", "summary");
                 $this->ctrl->redirect($this, "redirectQuestion");
             } else {
                 $this->ctrl->setParameter($this, "sequence", $this->sequence);
                 $this->ctrl->setParameter($this, "activecommand", "gotoquestion");
                 $this->ctrl->saveParameter($this, "tst_javascript");
                 $this->ctrl->redirect($this, "redirectQuestion");
             }
             break;
         case "resume":
             $_SESSION['tst_pass_finish'] = 0;
             $active_id = $this->testSession->getActiveId();
             $this->ctrl->setParameter($this, "active_id", $active_id);
             if ($this->object->isRandomTest()) {
                 if (!$this->testSequence->hasRandomQuestionsForPass($active_id, $this->testSession->getPass())) {
                     // create a new set of random questions
                     $this->generateRandomTestPassForActiveUser();
                 }
             }
             $shuffle = $this->object->getShuffleQuestions();
             if ($this->object->isRandomTest()) {
                 $shuffle = FALSE;
             }
             assQuestion::_updateTestPassResults($active_id, $this->testSession->getPass(), $this->object->areObligationsEnabled(), null, $this->object->id);
             // ensure existing test sequence
             if (!$this->testSequence->hasSequence()) {
                 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
                 $this->testSequence->saveToDb();
             }
             $this->sequence = $this->testSession->getLastSequence();
             $active_time_id = $this->object->startWorkingTime($active_id, $this->testSession->getPass());
             $_SESSION["active_time_id"] = $active_time_id;
             if ($this->object->getListOfQuestionsStart()) {
                 $this->ctrl->setParameter($this, "activecommand", "summary");
                 $this->ctrl->redirect($this, "redirectQuestion");
             } else {
                 $this->ctrl->setParameter($this, "sequence", $this->sequence);
                 $this->ctrl->setParameter($this, "activecommand", "gotoquestion");
                 $this->ctrl->saveParameter($this, "tst_javascript");
                 $this->ctrl->redirect($this, "redirectQuestion");
             }
             break;
         case 'test_submission_overview':
             require_once './Modules/Test/classes/class.ilTestSubmissionReviewGUI.php';
             $this->ctrl->redirectByClass('ilTestSubmissionReviewGUI', "show");
             break;
         case "back":
         case "gotoquestion":
         default:
             $_SESSION['tst_pass_finish'] = 0;
             if (array_key_exists("tst_javascript", $_GET)) {
                 $ilUser->writePref("tst_javascript", $_GET["tst_javascript"]);
             }
             $this->sequence = $this->calculateSequence();
             if (strlen($_GET['gotosequence'])) {
                 $this->sequence = $_GET['gotosequence'];
             }
             $this->testSession->setLastSequence($this->sequence);
             $this->testSession->saveToDb();
             $this->outTestPage(false);
             break;
     }
 }
 /**
 * Called when a user answered a question to perform a redirect after POST.
 * This is called for security reasons to prevent users sending a form twice.
 *
 * @access public
 */
 function redirectQuestion()
 {
     global $ilUser;
     // check the test restrictions to access the test in case one
     // of the test navigation commands was called by an external script
     // e.g. $ilNavigationHistory
     $executable = $this->object->isExecutable($ilUser->getId());
     if (!$executable["executable"]) {
         ilUtil::sendInfo($executable["errormessage"], TRUE);
         $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
     }
     switch ($_GET["activecommand"]) {
         case "next":
             $this->sequence = $this->calculateSequence();
             if ($this->sequence === FALSE) {
                 if ($this->object->getListOfQuestionsEnd()) {
                     $allObligationsAnswered = ilObjTest::allObligationsAnswered($this->object->getTestSession()->getTestId(), $this->object->getTestSession()->getActiveId(), $this->object->getTestSession()->getPass());
                     if ($this->object->areObligationsEnabled() && !$allObligationsAnswered) {
                         $this->ctrl->redirect($this, "outQuestionSummaryWithObligationsInfo");
                     }
                     $this->outQuestionSummary();
                 } else {
                     $this->ctrl->redirect($this, "finishTest");
                 }
             } else {
                 $this->object->getTestSession()->setLastSequence($this->sequence);
                 $this->object->getTestSession()->saveToDb();
                 $this->outTestPage();
             }
             break;
         case "previous":
             $this->sequence = $this->calculateSequence();
             $this->object->getTestSession()->setLastSequence($this->sequence);
             $this->object->getTestSession()->saveToDb();
             if ($this->sequence === FALSE) {
                 $this->ctrl->redirect($this, "outIntroductionPage");
             } else {
                 $this->outTestPage();
             }
             break;
         case "postpone":
             $this->sequence = $this->calculateSequence();
             $nextSequence = $this->object->getTestSequence()->getNextSequence($this->sequence);
             $this->object->getTestSequence()->postponeSequence($this->sequence);
             $this->object->getTestSequence()->saveToDb();
             $this->object->getTestSession()->setLastSequence($nextSequence);
             $this->object->getTestSession()->saveToDb();
             $this->sequence = $nextSequence;
             $this->outTestPage();
             break;
         case "setmarked":
             $this->sequence = $this->calculateSequence();
             $this->object->getTestSession()->setLastSequence($this->sequence);
             $this->object->getTestSession()->saveToDb();
             $q_id = $this->object->getTestSequence()->getQuestionForSequence($_GET["sequence"]);
             $this->object->setQuestionSetSolved(1, $q_id, $ilUser->getId());
             $this->outTestPage();
             break;
         case "resetmarked":
             $this->sequence = $this->calculateSequence();
             $this->object->getTestSession()->setLastSequence($this->sequence);
             $this->object->getTestSession()->saveToDb();
             $q_id = $this->object->getTestSequence()->getQuestionForSequence($_GET["sequence"]);
             $this->object->setQuestionSetSolved(0, $q_id, $ilUser->getId());
             $this->outTestPage();
             break;
         case "directfeedback":
             $this->sequence = $this->calculateSequence();
             $this->object->getTestSession()->setLastSequence($this->sequence);
             $this->object->getTestSession()->saveToDb();
             $this->outTestPage();
             break;
         case "selectImagemapRegion":
             $this->sequence = $this->calculateSequence();
             $this->object->getTestSession()->setLastSequence($this->sequence);
             $this->object->getTestSession()->saveToDb();
             $this->outTestPage();
             break;
         case "summary":
             $this->ctrl->redirect($this, "outQuestionSummary");
             break;
         case "summary_obligations":
             $this->ctrl->redirect($this, "outQuestionSummaryWithObligationsInfo");
             break;
         case "summary_obligations_only":
             $this->ctrl->redirect($this, "outObligationsOnlySummary");
             break;
         case "start":
             $_SESSION['tst_pass_finish'] = 0;
             $this->object->createTestSession();
             $active_id = $this->object->getTestSession()->getActiveId();
             assQuestion::_updateTestPassResults($active_id, $this->object->getTestSession()->getPass(), $this->object->areObligationsEnabled());
             $this->ctrl->setParameter($this, "active_id", $active_id);
             $shuffle = $this->object->getShuffleQuestions();
             if ($this->object->isRandomTest()) {
                 $this->object->generateRandomQuestions($this->object->getTestSession()->getActiveId());
                 $this->object->loadQuestions();
                 $shuffle = FALSE;
                 // shuffle is already done during the creation of the random questions
             }
             $this->object->createTestSequence($active_id, 0, $shuffle);
             $active_time_id = $this->object->startWorkingTime($this->object->getTestSession()->getActiveId(), $this->object->getTestSession()->getPass());
             $_SESSION["active_time_id"] = $active_time_id;
             if ($this->object->getListOfQuestionsStart()) {
                 $this->ctrl->setParameter($this, "activecommand", "summary");
                 $this->ctrl->redirect($this, "redirectQuestion");
             } else {
                 $this->ctrl->setParameter($this, "sequence", $this->sequence);
                 $this->ctrl->setParameter($this, "activecommand", "gotoquestion");
                 $this->ctrl->saveParameter($this, "tst_javascript");
                 $this->ctrl->redirect($this, "redirectQuestion");
             }
             break;
         case "resume":
             $_SESSION['tst_pass_finish'] = 0;
             $active_id = $this->object->getTestSession()->getActiveId();
             $this->ctrl->setParameter($this, "active_id", $active_id);
             if ($this->object->isRandomTest()) {
                 if (!$this->object->hasRandomQuestionsForPass($active_id, $this->object->getTestSession()->getPass())) {
                     // create a new set of random questions
                     $this->object->generateRandomQuestions($active_id, $this->object->getTestSession()->getPass());
                 }
             }
             $shuffle = $this->object->getShuffleQuestions();
             if ($this->object->isRandomTest()) {
                 $shuffle = FALSE;
             }
             $this->object->createTestSequence($active_id, $this->object->getTestSession()->getPass(), $shuffle);
             $this->sequence = $this->object->getTestSession()->getLastSequence();
             $active_time_id = $this->object->startWorkingTime($active_id, $this->object->getTestSession()->getPass());
             $_SESSION["active_time_id"] = $active_time_id;
             if ($this->object->getListOfQuestionsStart()) {
                 $this->ctrl->setParameter($this, "activecommand", "summary");
                 $this->ctrl->redirect($this, "redirectQuestion");
             } else {
                 $this->ctrl->setParameter($this, "sequence", $this->sequence);
                 $this->ctrl->setParameter($this, "activecommand", "gotoquestion");
                 $this->ctrl->saveParameter($this, "tst_javascript");
                 $this->ctrl->redirect($this, "redirectQuestion");
             }
             break;
         case "back":
         case "gotoquestion":
         default:
             $_SESSION['tst_pass_finish'] = 0;
             if (array_key_exists("tst_javascript", $_GET)) {
                 $ilUser->writePref("tst_javascript", $_GET["tst_javascript"]);
             }
             $this->sequence = $this->calculateSequence();
             if (strlen($_GET['gotosequence'])) {
                 $this->sequence = $_GET['gotosequence'];
             }
             $this->object->getTestSession()->setLastSequence($this->sequence);
             $this->object->getTestSession()->saveToDb();
             $this->outTestPage();
             break;
     }
 }
Ejemplo n.º 3
0
 /**
  * Sets the points, a learner has reached answering the question
  * Additionally objective results are updated
  *
  * @param integer $user_id The database ID of the learner
  * @param integer $test_id The database Id of the test containing the question
  * @param integer $points The points the user has reached answering the question
  * @return boolean true on success, otherwise false
  * @access public
  */
 function _setReachedPoints($active_id, $question_id, $points, $maxpoints, $pass, $manualscoring, $obligationsEnabled)
 {
     global $ilDB;
     if ($points <= $maxpoints) {
         if (is_null($pass)) {
             $pass = assQuestion::_getSolutionMaxPass($question_id, $active_id);
         }
         // retrieve the already given points
         $old_points = 0;
         $result = $ilDB->queryF("SELECT points FROM tst_test_result WHERE active_fi = %s AND question_fi = %s AND pass = %s", array('integer', 'integer', 'integer'), array($active_id, $question_id, $pass));
         $manual = $manualscoring ? 1 : 0;
         $rowsnum = $result->numRows();
         if ($rowsnum) {
             $row = $ilDB->fetchAssoc($result);
             $old_points = $row["points"];
             if ($old_points != $points) {
                 $affectedRows = $ilDB->manipulateF("UPDATE tst_test_result SET points = %s, manual = %s, tstamp = %s WHERE active_fi = %s AND question_fi = %s AND pass = %s", array('float', 'integer', 'integer', 'integer', 'integer', 'integer'), array($points, $manual, time(), $active_id, $question_id, $pass));
             }
         } else {
             $next_id = $ilDB->nextId('tst_test_result');
             $affectedRows = $ilDB->manipulateF("INSERT INTO tst_test_result (test_result_id, active_fi, question_fi, points, pass, manual, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s)", array('integer', 'integer', 'integer', 'float', 'integer', 'integer', 'integer'), array($next_id, $active_id, $question_id, $points, $pass, $manual, time()));
         }
         if ($old_points != $points || !$rowsnum) {
             assQuestion::_updateTestPassResults($active_id, $pass, $obligationsEnabled);
             // finally update objective result
             include_once "./Modules/Test/classes/class.ilObjTest.php";
             include_once './Modules/Course/classes/class.ilCourseObjectiveResult.php';
             ilCourseObjectiveResult::_updateObjectiveResult(ilObjTest::_getUserIdFromActiveId($active_id), $question_id, $points);
             include_once "./Modules/Test/classes/class.ilObjAssessmentFolder.php";
             if (ilObjAssessmentFolder::_enabledAssessmentLogging()) {
                 global $lng, $ilUser;
                 include_once "./Modules/Test/classes/class.ilObjTestAccess.php";
                 $username = ilObjTestAccess::_getParticipantData($active_id);
                 assQuestion::_logAction(sprintf($lng->txtlng("assessment", "log_answer_changed_points", ilObjAssessmentFolder::_getLogLanguage()), $username, $old_points, $points, $ilUser->getFullname() . " (" . $ilUser->getLogin() . ")"), $active_id, $question_id);
             }
         }
         return TRUE;
     } else {
         return FALSE;
     }
 }
 protected function startTestCmd()
 {
     global $ilUser;
     // ensure existing test session
     $this->testSession->setRefId($this->object->getRefId());
     $this->testSession->setTestId($this->object->getTestId());
     $this->testSession->setUserId($ilUser->getId());
     $this->testSession->setAnonymousId($_SESSION['tst_access_code'][$this->object->getTestId()]);
     $this->testSession->setCurrentQuestionId(null);
     // no question "came up" yet
     $this->testSession->saveToDb();
     $this->ctrl->setParameter($this, 'active_id', $this->testSession->getActiveId());
     assQuestion::_updateTestPassResults($this->testSession->getActiveId(), $this->testSession->getPass());
     $_SESSION['active_time_id'] = $this->object->startWorkingTime($this->testSession->getActiveId(), $this->testSession->getPass());
     $this->ctrl->saveParameter($this, 'tst_javascript');
     if ($this->dynamicQuestionSetConfig->isTaxonomyFilterEnabled()) {
         $this->ctrl->redirect($this, self::CMD_SHOW_QUESTION_SELECTION);
     }
     $this->ctrl->redirect($this, self::CMD_SHOW_QUESTION);
 }
 /**
  * Returns TRUE if the user with the user id $user_id passed the test with the object id $a_obj_id
  *
  * @param int $user_id The user id
  * @param int $a_obj_id The object id
  * @return boolean TRUE if the user passed the test, FALSE otherwise
  */
 public static function _isPassed($user_id, $a_obj_id)
 {
     global $ilDB;
     $result = $ilDB->queryF("SELECT tst_result_cache.* FROM tst_result_cache, tst_active, tst_tests WHERE tst_active.test_fi = tst_tests.test_id AND tst_active.user_fi = %s AND tst_tests.obj_fi = %s AND tst_result_cache.active_fi = tst_active.active_id", array('integer', 'integer'), array($user_id, $a_obj_id));
     if (!$result->numRows()) {
         $result = $ilDB->queryF("SELECT tst_active.active_id FROM tst_active, tst_tests WHERE tst_active.test_fi = tst_tests.test_id AND tst_active.user_fi = %s AND tst_tests.obj_fi = %s", array('integer', 'integer'), array($user_id, $a_obj_id));
         $row = $ilDB->fetchAssoc($result);
         if ($row['active_id'] > 0) {
             include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
             assQuestion::_updateTestResultCache($row['active_id']);
         } else {
             return false;
         }
     }
     $result = $ilDB->queryF("SELECT tst_result_cache.* FROM tst_result_cache, tst_active, tst_tests WHERE tst_active.test_fi = tst_tests.test_id AND tst_active.user_fi = %s AND tst_tests.obj_fi = %s AND tst_result_cache.active_fi = tst_active.active_id", array('integer', 'integer'), array($user_id, $a_obj_id));
     if (!$result->numRows()) {
         $result = $ilDB->queryF("SELECT tst_pass_result.*, tst_tests.pass_scoring, tst_tests.random_test, tst_tests.test_id FROM tst_pass_result, tst_active, tst_tests WHERE tst_active.test_fi = tst_tests.test_id AND tst_active.user_fi = %s AND tst_tests.obj_fi = %s AND tst_pass_result.active_fi = tst_active.active_id ORDER BY tst_pass_result.pass", array('integer', 'integer'), array($user_id, $a_obj_id));
         $points = array();
         while ($row = $ilDB->fetchAssoc($result)) {
             array_push($points, $row);
         }
         $reached = 0;
         $max = 0;
         if ($points[0]["pass_scoring"] == 0) {
             $reached = $points[count($points) - 1]["points"];
             $max = $points[count($points) - 1]["maxpoints"];
             if (!$max) {
                 $active_id = $points[count($points) - 1]["active_fi"];
                 $pass = $points[count($points) - 1]["pass"];
                 if (strlen($active_id) && strlen($pass)) {
                     include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
                     $res = assQuestion::_updateTestPassResults($active_id, $pass);
                     $max = $res['maxpoints'];
                     $reached = $res['points'];
                 }
             }
         } else {
             foreach ($points as $row) {
                 if ($row["points"] > $reached) {
                     $reached = $row["points"];
                     $max = $row["maxpoints"];
                     if (!$max) {
                         $active_id = $row["active_fi"];
                         $pass = $row["pass"];
                         if (strlen($active_id) && strlen($pass)) {
                             include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
                             assQuestion::_updateTestPassResults($active_id, $pass);
                             $max = $res['maxpoints'];
                             $reached = $res['points'];
                         }
                     }
                 }
             }
         }
         include_once "./Modules/Test/classes/class.assMarkSchema.php";
         $percentage = !$max ? 0 : $reached / $max * 100.0;
         $mark = ASS_MarkSchema::_getMatchingMarkFromObjId($a_obj_id, $percentage);
         return $mark["passed"] ? TRUE : FALSE;
     } else {
         $row = $ilDB->fetchAssoc($result);
         return $row['passed'] ? true : false;
     }
 }
 protected function startTestCmd()
 {
     global $ilUser;
     $this->testSession->setCurrentQuestionId(null);
     // no question "came up" yet
     $this->testSession->saveToDb();
     $this->ctrl->setParameter($this, 'active_id', $this->testSession->getActiveId());
     assQuestion::_updateTestPassResults($this->testSession->getActiveId(), $this->testSession->getPass(), false, null, $this->object->id);
     $_SESSION['active_time_id'] = $this->object->startWorkingTime($this->testSession->getActiveId(), $this->testSession->getPass());
     $this->ctrl->saveParameter($this, 'tst_javascript');
     if ($this->dynamicQuestionSetConfig->isAnyQuestionFilterEnabled()) {
         $this->ctrl->redirect($this, self::CMD_SHOW_QUESTION_SELECTION);
     }
     $this->ctrl->redirect($this, self::CMD_SHOW_QUESTION);
 }