Example #1
0
 function &getSequenceSummary($obligationsFilter = false)
 {
     $correctedsequence = $this->getCorrectedSequence();
     $result_array = array();
     include_once "./Modules/Test/classes/class.ilObjTest.php";
     $solved_questions = ilObjTest::_getSolvedQuestions($this->active_id);
     $key = 1;
     foreach ($correctedsequence as $sequence) {
         $question =& ilObjTest::_instanciateQuestion($this->getQuestionForSequence($sequence));
         if (is_object($question)) {
             $worked_through = $question->_isWorkedThrough($this->active_id, $question->getId(), $this->pass);
             $solved = 0;
             if (array_key_exists($question->getId(), $solved_questions)) {
                 $solved = $solved_questions[$question->getId()]["solved"];
             }
             $is_postponed = $this->isPostponedQuestion($question->getId());
             $row = array("nr" => "{$key}", "title" => $question->getTitle(), "qid" => $question->getId(), "visited" => $worked_through, "solved" => $solved ? "1" : "0", "description" => $question->getComment(), "points" => $question->getMaximumPoints(), "worked_through" => $worked_through, "postponed" => $is_postponed, "sequence" => $sequence, "obligatory" => ilObjTest::isQuestionObligatory($question->getId()), 'isAnswered' => $question->isAnswered($this->active_id, $this->pass));
             if (!$obligationsFilter || $row['obligatory']) {
                 array_push($result_array, $row);
             }
             $key++;
         }
     }
     return $result_array;
 }
 /**
  * Creates the learners output of a question
  */
 protected function outWorkingForm($sequence = "", $test_id, $postpone_allowed, $directfeedback = false)
 {
     global $ilUser;
     if (!$this->isValidSequenceElement($sequence)) {
         $sequence = $this->testSequence->getFirstSequence();
     }
     $_SESSION["active_time_id"] = $this->object->startWorkingTime($this->testSession->getActiveId(), $this->testSession->getPass());
     $this->populateContentStyleBlock();
     $this->populateSyntaxStyleBlock();
     if ($this->object->getListOfQuestions()) {
         $this->showSideList();
     }
     $questionId = $this->testSequence->getQuestionForSequence($sequence);
     if (!(int) $questionId && $this->testSession->isObjectiveOriented()) {
         ilUtil::sendFailure(sprintf($this->lng->txt('tst_objective_oriented_test_pass_without_questions'), $this->object->getTitle()), true);
         $this->performCustomRedirect();
     }
     $question_gui = $this->object->createQuestionGUI("", $questionId);
     if (!is_object($question_gui)) {
         global $ilLog;
         $ilLog->write("INV SEQ: active={$this->testSession->getActiveId()} qId={$questionId} seq={$sequence} " . serialize($this->testSequence));
         $ilLog->logStack('INV SEQ');
         $this->ctrl->setParameter($this, 'gotosequence', $this->testSequence->getFirstSequence());
         $this->ctrl->setParameter($this, 'activecommand', 'gotoquestion');
         $this->ctrl->redirect($this, 'redirectQuestion');
     }
     $question_gui->setTargetGui($this);
     if ($this->object->getJavaScriptOutput()) {
         $question_gui->object->setOutputType(OUTPUT_JAVASCRIPT);
     }
     $is_postponed = $this->testSequence->isPostponedQuestion($question_gui->object->getId());
     $this->ctrl->setParameter($this, "sequence", "{$sequence}");
     $formaction = $this->ctrl->getFormAction($this, "gotoQuestion");
     $question_gui->setSequenceNumber($this->testSequence->getPositionOfSequence($sequence));
     $question_gui->setQuestionCount($this->testSequence->getUserQuestionCount());
     // output question
     $user_post_solution = FALSE;
     if (array_key_exists("previouspost", $_SESSION)) {
         $user_post_solution = $_SESSION["previouspost"];
         unset($_SESSION["previouspost"]);
     }
     // Determine $answer_feedback: It should hold a boolean stating if answer-specific-feedback is to be given.
     // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Answer-Specific Feedback"
     // $directfeedback holds a boolean stating if the instant feedback was requested using the "Check" button.
     $answer_feedback = FALSE;
     if ($directfeedback && $this->object->getSpecificAnswerFeedback()) {
         $answer_feedback = TRUE;
     }
     if ($this->isParticipantsAnswerFixed($questionId)) {
         $solutionoutput = $question_gui->getSolutionOutput($this->testSession->getActiveId(), NULL, FALSE, false, true, $answer_feedback, false, FALSE, true);
         $pageoutput = $question_gui->outQuestionPage("", $this->testSequence->isPostponedQuestion($questionId), $this->testSession->getActiveId(), $solutionoutput);
         $this->tpl->setVariable("QUESTION_OUTPUT", $pageoutput);
         $this->tpl->setVariable("FORMACTION", $formaction);
         $directfeedback = true;
     } else {
         // Answer specific feedback is rendered into the display of the test question with in the concrete question types outQuestionForTest-method.
         // Notation of the params prior to getting rid of this crap in favor of a class
         $question_gui->outQuestionForTest($formaction, $this->testSession->getActiveId(), NULL, $is_postponed, $user_post_solution, $answer_feedback);
         // The display of specific inline feedback and specific feedback in an own block is to honor questions, which
         // have the possibility to embed the specific feedback into their output while maintaining compatibility to
         // questions, which do not have such facilities. E.g. there can be no "specific inline feedback" for essay
         // questions, while the multiple-choice questions do well.
         $this->fillQuestionRelatedNavigation($question_gui);
     }
     if ($directfeedback) {
         // This controls if the solution should be shown.
         // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Solutions"
         if ($this->object->getInstantFeedbackSolution()) {
             $show_question_inline_score = $this->determineInlineScoreDisplay();
             // Notation of the params prior to getting rid of this crap in favor of a class
             $solutionoutput = $question_gui->getSolutionOutput($this->testSession->getActiveId(), NULL, FALSE, $show_question_inline_score, FALSE, FALSE, TRUE, FALSE, FALSE);
             $this->populateSolutionBlock($solutionoutput);
         }
         // This controls if the score should be shown.
         // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Results (Only Points)"
         if ($this->object->getAnswerFeedbackPoints()) {
             $reachedPoints = $question_gui->object->getAdjustedReachedPoints($this->testSession->getActiveId(), NULL);
             $maxPoints = $question_gui->object->getMaximumPoints();
             $this->populateScoreBlock($reachedPoints, $maxPoints);
         }
         // This controls if the generic feedback should be shown.
         // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Solutions"
         if ($this->object->getGenericAnswerFeedback()) {
             $this->populateGenericFeedbackBlock($question_gui);
         }
         // This controls if the specific feedback should be shown.
         // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Answer-Specific Feedback"
         if ($this->object->getSpecificAnswerFeedback()) {
             $this->populateSpecificFeedbackBlock($question_gui);
         }
     }
     $this->populatePreviousButtons($sequence);
     if ($postpone_allowed && !$is_postponed) {
         $this->populatePostponeButtons();
     }
     if ($this->object->getListOfQuestions()) {
         $this->populateSummaryButtons();
     }
     if ($this->object->getShowCancel()) {
         $this->populateCancelButtonBlock();
     }
     if ($this->isLastQuestionInSequence($question_gui)) {
         if ($this->object->getListOfQuestionsEnd()) {
             $this->populateNextButtonsLeadingToSummary();
         } else {
             $this->populateNextButtonsLeadingToEndOfTest();
         }
     } else {
         $this->populateNextButtonsLeadingToQuestion();
     }
     if ($this->object->getShowMarker()) {
         include_once "./Modules/Test/classes/class.ilObjTest.php";
         $solved_array = ilObjTest::_getSolvedQuestions($this->testSession->getActiveId(), $question_gui->object->getId());
         $solved = 0;
         if (count($solved_array) > 0) {
             $solved = array_pop($solved_array);
             $solved = $solved["solved"];
         }
         if ($solved == 1) {
             $this->populateQuestionMarkingBlockAsMarked();
         } else {
             $this->populateQuestionMarkingBlockAsUnmarked();
         }
     }
     $this->populateCharSelector();
     if ($this->object->getJavaScriptOutput()) {
         $this->tpl->setVariable("JAVASCRIPT_TITLE", $this->lng->txt("disable_javascript"));
         $this->ctrl->setParameter($this, "tst_javascript", "0");
         $this->tpl->setVariable("JAVASCRIPT_URL", $this->ctrl->getLinkTarget($this, "gotoQuestion"));
     } else {
         $this->tpl->setVariable("JAVASCRIPT_TITLE", $this->lng->txt("enable_javascript"));
         $this->ctrl->setParameter($this, "tst_javascript", "1");
         $this->tpl->setVariable("JAVASCRIPT_URL", $this->ctrl->getLinkTarget($this, "gotoQuestion"));
     }
     if ($question_gui->object->requiresJsSwitch() && !$this->object->getForceJS()) {
         $this->tpl->touchBlock("jsswitch");
     }
     $this->tpl->addJavaScript(ilUtil::getJSLocation("autosave.js", "Modules/Test"));
     $this->tpl->setVariable("AUTOSAVE_URL", $this->ctrl->getFormAction($this, "autosave", "", true));
     if ($question_gui->isAutosaveable() && $this->object->getAutosave()) {
         $this->tpl->touchBlock('autosave');
         //$this->tpl->setVariable("BTN_SAVE", "Zwischenspeichern");
         //$this->tpl->setVariable("CMD_SAVE", "gotoquestion_{$sequence}");
         //$this->tpl->setVariable("AUTOSAVEFORMACTION", str_replace("&", "&", $this->ctrl->getFormAction($this)));
         $this->tpl->setVariable("AUTOSAVEFORMACTION", str_replace("&", "&", $this->ctrl->getLinkTarget($this, "autosave")));
         $this->tpl->setVariable("AUTOSAVEINTERVAL", $this->object->getAutosaveIval());
     }
     if ($this->object->areObligationsEnabled() && ilObjTest::isQuestionObligatory($question_gui->object->getId())) {
         $this->tpl->touchBlock('question_obligatory');
         $this->tpl->setVariable('QUESTION_OBLIGATORY', $this->lng->txt('required_field'));
     }
 }
Example #3
0
 /**
  * Calculates the question results from a previously saved question solution
  *
  * @final
  * @global ilDB $ilDB
  * @global ilObjUser $ilUser
  * @param integer $active_id Active id of the user
  * @param integer $pass Test pass
  */
 public final function calculateResultsFromSolution($active_id, $pass = NULL, $obligationsEnabled = false)
 {
     global $ilDB, $ilUser;
     if (is_null($pass)) {
         include_once "./Modules/Test/classes/class.ilObjTest.php";
         $pass = ilObjTest::_getPass($active_id);
     }
     // determine reached points for submitted solution
     $reached_points = $this->calculateReachedPoints($active_id, $pass);
     // deduct points for requested hints from reached points
     require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
     $questionHintTracking = new ilAssQuestionHintTracking($this->getId(), $active_id, $pass);
     $requestsStatisticData = $questionHintTracking->getRequestStatisticDataByQuestionAndTestpass();
     $reached_points = $reached_points - $requestsStatisticData->getRequestsPoints();
     // adjust reached points regarding to tests scoring options
     $reached_points = $this->adjustReachedPointsByScoringOptions($reached_points, $active_id, $pass);
     if ($obligationsEnabled && ilObjTest::isQuestionObligatory($this->getId())) {
         $isAnswered = $this->isAnswered($active_id, $pass);
     } else {
         $isAnswered = true;
     }
     if (is_null($reached_points)) {
         $reached_points = 0;
     }
     $this->getProcessLocker()->requestUserQuestionResultUpdateLock();
     $query = "\n\t\t\tDELETE FROM\t\ttst_test_result\n\t\t\t\n\t\t\tWHERE\t\t\tactive_fi = %s\n\t\t\tAND\t\t\t\tquestion_fi = %s\n\t\t\tAND\t\t\t\tpass = %s\n\t\t";
     $types = array('integer', 'integer', 'integer');
     $values = array($active_id, $this->getId(), $pass);
     if ($this->getStep() !== NULL) {
         $query .= "\n\t\t\t\tAND\t\t\t\tstep = %s\n\t\t\t";
         $types[] = 'integer';
         $values[] = $this->getStep();
     }
     $affectedRows = $ilDB->manipulateF($query, $types, $values);
     $next_id = $ilDB->nextId("tst_test_result");
     $fieldData = array('test_result_id' => array('integer', $next_id), 'active_fi' => array('integer', $active_id), 'question_fi' => array('integer', $this->getId()), 'pass' => array('integer', $pass), 'points' => array('float', $reached_points), 'tstamp' => array('integer', time()), 'hint_count' => array('integer', $requestsStatisticData->getRequestsCount()), 'hint_points' => array('float', $requestsStatisticData->getRequestsPoints()), 'answered' => array('integer', $isAnswered));
     if ($this->getStep() !== NULL) {
         $fieldData['step'] = array('integer', $this->getStep());
     }
     $ilDB->insert('tst_test_result', $fieldData);
     $this->getProcessLocker()->releaseUserQuestionResultUpdateLock();
     include_once "./Modules/Test/classes/class.ilObjAssessmentFolder.php";
     if (ilObjAssessmentFolder::_enabledAssessmentLogging()) {
         $this->logAction(sprintf($this->lng->txtlng("assessment", "log_user_answered_question", ilObjAssessmentFolder::_getLogLanguage()), $reached_points), $active_id, $this->getId());
     }
     // update test pass results
     $this->_updateTestPassResults($active_id, $pass, $obligationsEnabled, $this->getProcessLocker());
     // Update objective status
     include_once 'Modules/Course/classes/class.ilCourseObjectiveResult.php';
     ilCourseObjectiveResult::_updateObjectiveResult($ilUser->getId(), $active_id, $this->getId());
 }
 /**
  * Creates the learners output of a question
  */
 protected function outWorkingForm($sequence = "", $test_id, $postpone_allowed, $directfeedback = false)
 {
     global $ilUser;
     $_SESSION["active_time_id"] = $this->object->startWorkingTime($this->testSession->getActiveId(), $this->testSession->getPass());
     $this->populateContentStyleBlock();
     $this->populateSyntaxStyleBlock();
     $question_gui = $this->object->createQuestionGUI("", $this->testSession->getCurrentQuestionId());
     $question_gui->setTargetGui($this);
     $question_gui->setQuestionCount($this->testSequence->getLastPositionIndex());
     $question_gui->setSequenceNumber($this->testSequence->getCurrentPositionIndex($this->testSession->getCurrentQuestionId()));
     $this->ctrl->setParameter($this, 'sequence', $this->testSession->getCurrentQuestionId());
     if ($this->object->getJavaScriptOutput()) {
         $question_gui->object->setOutputType(OUTPUT_JAVASCRIPT);
     }
     $is_postponed = $this->testSequence->isPostponedQuestion($question_gui->object->getId());
     $formaction = $this->ctrl->getFormAction($this);
     // output question
     $user_post_solution = FALSE;
     if (isset($_SESSION['previouspost'])) {
         $user_post_solution = $_SESSION['previouspost'];
         unset($_SESSION['previouspost']);
     }
     global $ilNavigationHistory;
     $ilNavigationHistory->addItem($_GET["ref_id"], $this->ctrl->getLinkTarget($this, "resumePlayer"), "tst");
     // Determine $answer_feedback: It should hold a boolean stating if answer-specific-feedback is to be given.
     // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Answer-Specific Feedback"
     // $directfeedback holds a boolean stating if the instant feedback was requested using the "Check" button.
     $answer_feedback = FALSE;
     if ($directfeedback && $this->object->getSpecificAnswerFeedback()) {
         $answer_feedback = TRUE;
     }
     // Answer specific feedback is rendered into the display of the test question with in the concrete question types outQuestionForTest-method.
     // Notation of the params prior to getting rid of this crap in favor of a class
     $question_gui->outQuestionForTest($formaction, $this->testSession->getActiveId(), NULL, $is_postponed, $user_post_solution, $answer_feedback);
     // The display of specific inline feedback and specific feedback in an own block is to honor questions, which
     // have the possibility to embed the specific feedback into their output while maintaining compatibility to
     // questions, which do not have such facilities. E.g. there can be no "specific inline feedback" for essay
     // questions, while the multiple-choice questions do well.
     $this->fillQuestionRelatedNavigation($question_gui);
     if ($directfeedback) {
         // This controls if the solution should be shown.
         // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Solutions"
         if ($this->object->getInstantFeedbackSolution()) {
             $show_question_inline_score = $this->determineInlineScoreDisplay();
             // Notation of the params prior to getting rid of this crap in favor of a class
             $solutionoutput = $question_gui->getSolutionOutput($this->testSession->getActiveId(), NULL, TRUE, $show_question_inline_score, FALSE, FALSE, TRUE, FALSE, FALSE);
             $this->populateSolutionBlock($solutionoutput);
         }
         // This controls if the score should be shown.
         // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Results (Only Points)"
         if ($this->object->getAnswerFeedbackPoints()) {
             $reachedPoints = $question_gui->object->getAdjustedReachedPoints($this->testSession->getActiveId(), NULL);
             $maxPoints = $question_gui->object->getMaximumPoints();
             $this->populateScoreBlock($reachedPoints, $maxPoints);
         }
         // This controls if the generic feedback should be shown.
         // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Solutions"
         if ($this->object->getGenericAnswerFeedback()) {
             $this->populateGenericFeedbackBlock($question_gui);
         }
         // This controls if the specific feedback should be shown.
         // It gets the parameter "Scoring and Results" -> "Instant Feedback" -> "Show Answer-Specific Feedback"
         if ($this->object->getSpecificAnswerFeedback()) {
             $this->populateSpecificFeedbackBlock($question_gui);
         }
     }
     $this->populatePreviousButtons($this->testSession->getCurrentQuestionId());
     if ($postpone_allowed) {
         $this->populatePostponeButtons();
     }
     if ($this->object->getShowCancel()) {
         $this->populateCancelButtonBlock();
     }
     if ($this->isLastQuestionInSequence($question_gui)) {
         if ($this->object->getListOfQuestionsEnd()) {
             $this->populateNextButtonsLeadingToSummary();
         } else {
             $this->populateNextButtonsLeadingToEndOfTest();
         }
     } else {
         $this->populateNextButtonsLeadingToQuestion();
     }
     if ($this->dynamicQuestionSetConfig->isTaxonomyFilterEnabled()) {
         $this->populateQuestionSelectionButtons();
     }
     if ($this->object->getShowMarker()) {
         include_once "./Modules/Test/classes/class.ilObjTest.php";
         $solved_array = ilObjTest::_getSolvedQuestions($this->testSession->getActiveId(), $question_gui->object->getId());
         $solved = 0;
         if (count($solved_array) > 0) {
             $solved = array_pop($solved_array);
             $solved = $solved["solved"];
         }
         if ($solved == 1) {
             $this->populateQuestionMarkingBlockAsMarked();
         } else {
             $this->populateQuestionMarkingBlockAsUnmarked();
         }
     }
     if ($this->object->getJavaScriptOutput()) {
         $this->tpl->setVariable("JAVASCRIPT_IMAGE", ilUtil::getImagePath("javascript_disable.png"));
         $this->tpl->setVariable("JAVASCRIPT_IMAGE_ALT", $this->lng->txt("disable_javascript"));
         $this->tpl->setVariable("JAVASCRIPT_IMAGE_TITLE", $this->lng->txt("disable_javascript"));
         $this->ctrl->setParameter($this, "tst_javascript", "0");
         $this->tpl->setVariable("JAVASCRIPT_URL", $this->ctrl->getLinkTarget($this, "gotoQuestion"));
     } else {
         $this->tpl->setVariable("JAVASCRIPT_IMAGE", ilUtil::getImagePath("javascript.png"));
         $this->tpl->setVariable("JAVASCRIPT_IMAGE_ALT", $this->lng->txt("enable_javascript"));
         $this->tpl->setVariable("JAVASCRIPT_IMAGE_TITLE", $this->lng->txt("enable_javascript"));
         $this->ctrl->setParameter($this, "tst_javascript", "1");
         $this->tpl->setVariable("JAVASCRIPT_URL", $this->ctrl->getLinkTarget($this, "gotoQuestion"));
     }
     if ($question_gui->object->supportsJavascriptOutput()) {
         $this->tpl->touchBlock("jsswitch");
     }
     $this->tpl->addJavaScript(ilUtil::getJSLocation("autosave.js", "Modules/Test"));
     $this->tpl->setVariable("AUTOSAVE_URL", $this->ctrl->getFormAction($this, "autosave", "", true));
     if ($question_gui->isAutosaveable() && $this->object->getAutosave()) {
         $this->tpl->touchBlock('autosave');
         //$this->tpl->setVariable("BTN_SAVE", "Zwischenspeichern");
         //$this->tpl->setVariable("CMD_SAVE", "gotoquestion_{$sequence}");
         //$this->tpl->setVariable("AUTOSAVEFORMACTION", str_replace("&", "&", $this->ctrl->getFormAction($this)));
         $this->tpl->setVariable("AUTOSAVEFORMACTION", str_replace("&", "&", $this->ctrl->getLinkTarget($this, "autosave")));
         $this->tpl->setVariable("AUTOSAVEINTERVAL", $this->object->getAutosaveIval());
     }
     if ($this->object->areObligationsEnabled() && ilObjTest::isQuestionObligatory($question_gui->object->getId())) {
         $this->tpl->touchBlock('question_obligatory');
         $this->tpl->setVariable('QUESTION_OBLIGATORY', $this->lng->txt('required_field'));
     }
 }
 /**
  * output question page
  */
 function outQuestionPage($a_temp_var, $a_postponed = false, $active_id = "", $html = "")
 {
     $postponed = "";
     if ($a_postponed) {
         $postponed = " (" . $this->lng->txt("postponed") . ")";
     }
     include_once "./Services/COPage/classes/class.ilPageObject.php";
     include_once "./Services/COPage/classes/class.ilPageObjectGUI.php";
     $this->lng->loadLanguageModule("content");
     //$page =& new ilPageObject("qpl", $this->object->getId());
     $page_gui =& new ilPageObjectGUI("qpl", $this->object->getId());
     $page_gui->setTemplateTargetVar($a_temp_var);
     $page_gui->setFileDownloadLink("ilias.php?baseClass=ilObjTestGUI&cmd=downloadFile" . "&ref_id=" . $_GET["ref_id"]);
     $page_gui->setFullscreenLink("ilias.php?baseClass=ilObjTestGUI&cmd=fullscreen" . "&ref_id=" . $_GET["ref_id"]);
     $page_gui->setEnabledPageFocus(false);
     if (strlen($html)) {
         $page_gui->setQuestionHTML(array($this->object->getId() => $html));
     }
     $page_gui->setSourcecodeDownloadScript("ilias.php?baseClass=ilObjTestGUI&ref_id=" . $_GET["ref_id"]);
     $page_gui->setOutputMode("presentation");
     include_once "./Modules/Test/classes/class.ilObjTest.php";
     $title_output = ilObjTest::_getTitleOutput($active_id);
     if ($this->object->areObligationsToBeConsidered() && ilObjTest::isQuestionObligatory($this->object->getId())) {
         $obligatoryString = ' *';
     } else {
         $obligatoryString = '';
     }
     switch ($title_output) {
         case 1:
             $page_gui->setPresentationTitle(sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . " - " . $this->object->getTitle() . $postponed . $obligatoryString);
             break;
         case 2:
             $page_gui->setPresentationTitle(sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . $postponed . $obligatoryString);
             break;
         case 0:
         default:
             $maxpoints = $this->object->getMaximumPoints();
             if ($maxpoints == 1) {
                 $maxpoints = " (" . $maxpoints . " " . $this->lng->txt("point") . ")";
             } else {
                 $maxpoints = " (" . $maxpoints . " " . $this->lng->txt("points") . ")";
             }
             $page_gui->setPresentationTitle(sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . " - " . $this->object->getTitle() . $postponed . $maxpoints . $obligatoryString);
             break;
     }
     $presentation = $page_gui->presentation();
     if (strlen($maxpoints)) {
         $presentation = str_replace($maxpoints, "<em>{$maxpoints}</em>", $presentation);
     }
     // bugfix for non XHTML conform img tags in ILIAS Learning Module Editor
     $presentation = preg_replace("/src=\".\\//ims", "src=\"" . ILIAS_HTTP_PATH . "/", $presentation);
     return $presentation;
 }
 /**
  * output question page
  */
 function outQuestionPage($a_temp_var, $a_postponed = false, $active_id = "", $html = "")
 {
     $postponed = "";
     if ($a_postponed) {
         $postponed = " (" . $this->lng->txt("postponed") . ")";
     }
     include_once "./Modules/TestQuestionPool/classes/class.ilAssQuestionPageGUI.php";
     $this->lng->loadLanguageModule("content");
     $page_gui = new ilAssQuestionPageGUI($this->object->getId());
     $page_gui->setTemplateTargetVar($a_temp_var);
     if (strlen($html)) {
         $page_gui->setQuestionHTML(array($this->object->getId() => $html));
     }
     $page_gui->setOutputMode("presentation");
     include_once "./Modules/Test/classes/class.ilObjTest.php";
     $title_output = ilObjTest::_getTitleOutput($active_id);
     if ($this->object->areObligationsToBeConsidered() && ilObjTest::isQuestionObligatory($this->object->getId())) {
         $obligatoryString = ' *';
     } else {
         $obligatoryString = '';
     }
     switch ($title_output) {
         case 1:
             $page_gui->setPresentationTitle(sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . " - " . $this->object->getTitle() . $postponed . $obligatoryString);
             break;
         case 2:
             $page_gui->setPresentationTitle(sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . $postponed . $obligatoryString);
             break;
         case 0:
         default:
             $maxpoints = $this->object->getMaximumPoints();
             if ($maxpoints == 1) {
                 $maxpoints = " (" . $maxpoints . " " . $this->lng->txt("point") . ")";
             } else {
                 $maxpoints = " (" . $maxpoints . " " . $this->lng->txt("points") . ")";
             }
             $page_gui->setPresentationTitle(sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . " - " . $this->object->getTitle() . $postponed . $maxpoints . $obligatoryString);
             break;
     }
     $presentation = $page_gui->presentation();
     if (strlen($maxpoints)) {
         $presentation = str_replace($maxpoints, "<em>{$maxpoints}</em>", $presentation);
     }
     // bugfix for non XHTML conform img tags in ILIAS Learning Module Editor
     $presentation = preg_replace("/src=\".\\//ims", "src=\"" . ILIAS_HTTP_PATH . "/", $presentation);
     return $presentation;
 }
 /**
  * output question page
  */
 function outQuestionPage($a_temp_var, $a_postponed = false, $active_id = "", $html = "")
 {
     $postponed = "";
     if ($a_postponed) {
         $postponed = " (" . $this->lng->txt("postponed") . ")";
     }
     include_once "./Modules/TestQuestionPool/classes/class.ilAssQuestionPageGUI.php";
     $this->lng->loadLanguageModule("content");
     $page_gui = new ilAssQuestionPageGUI($this->object->getId());
     $page_gui->setTemplateTargetVar($a_temp_var);
     if (strlen($html)) {
         $page_gui->setQuestionHTML(array($this->object->getId() => $html));
     }
     $page_gui->setOutputMode("presentation");
     include_once "./Modules/Test/classes/class.ilObjTest.php";
     $title_output = ilObjTest::_getTitleOutput($active_id);
     if ($this->object->areObligationsToBeConsidered() && ilObjTest::isQuestionObligatory($this->object->getId())) {
         $obligatoryString = '([-_-])';
     } else {
         $obligatoryString = '';
     }
     switch ($title_output) {
         case 1:
             $page_gui->setPresentationTitle(sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . " - " . $this->object->getTitle() . $postponed . $obligatoryString);
             break;
         case 2:
             $page_gui->setPresentationTitle(sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . $postponed . $obligatoryString);
             break;
         case 0:
         default:
             if (!is_null($this->questionHeaderBlockBuilder)) {
                 $questionBlockHeader = $this->questionHeaderBlockBuilder->getHTML();
             } else {
                 $maxpoints = $this->object->getMaximumPoints();
                 if ($maxpoints == 1) {
                     $maxpoints = " (" . $maxpoints . " " . $this->lng->txt("point") . ")";
                 } else {
                     $maxpoints = " (" . $maxpoints . " " . $this->lng->txt("points") . ")";
                 }
                 $questionBlockHeader = sprintf($this->lng->txt("tst_position"), $this->getSequenceNumber(), $this->getQuestionCount()) . " - " . $this->object->getTitle() . $postponed . $maxpoints . $obligatoryString;
             }
             $page_gui->setPresentationTitle($questionBlockHeader);
             break;
     }
     $presentation = $page_gui->presentation();
     if (strlen($maxpoints)) {
         $presentation = str_replace($maxpoints, "<em>{$maxpoints}</em>", $presentation);
     }
     if (strlen($obligatoryString)) {
         $replacement = '<br><span class="obligatory" style="font-size:small">' . $this->lng->txt("tst_you_have_to_answer_this_question") . '</span>';
         $presentation = str_replace($obligatoryString, $replacement, $presentation);
     }
     $presentation = preg_replace("/src=\"\\.\\//ims", "src=\"" . ILIAS_HTTP_PATH . "/", $presentation);
     return $presentation;
 }