4require_once 
'./Modules/Test/classes/class.ilTestPlayerAbstractGUI.php';
 
   34        $ilPluginAdmin = 
$DIC[
'ilPluginAdmin'];
 
   36        $ilTabs = 
$DIC[
'ilTabs'];
 
   40        $ilTabs->clearTargets();
 
   42        $cmd = $this->ctrl->getCmd();
 
   43        $next_class = $this->ctrl->getNextClass($this);
 
   45        $this->ctrl->saveParameter($this, 
"sequence");
 
   46        $this->ctrl->saveParameter($this, 
"pmode");
 
   47        $this->ctrl->saveParameter($this, 
"active_id");
 
   51        $DIC->globalScreen()->tool()->context()->current()->addAdditionalData(
 
   53            $this->object->getKioskMode()
 
   66        $this->testSequence->loadFromDb();
 
   67        $this->testSequence->loadQuestions();
 
   69        require_once 
'Modules/Test/classes/class.ilTestQuestionRelatedObjectivesList.php';
 
   72        include_once 
'Services/jQuery/classes/class.iljQueryUtil.php';
 
   74        include_once 
"./Services/YUI/classes/class.ilYuiUtil.php";
 
   81        switch ($next_class) {
 
   82            case 'ilassquestionpagegui':
 
   88                require_once 
"./Modules/TestQuestionPool/classes/class.ilAssQuestionPageGUI.php";
 
   90                $ret = $this->ctrl->forwardCommand($page_gui);
 
   93            case 'iltestsubmissionreviewgui':
 
   97                require_once 
'./Modules/Test/classes/class.ilTestSubmissionReviewGUI.php';
 
  100                $ret = $this->ctrl->forwardCommand($gui);
 
  103            case 'ilassquestionhintrequestgui':
 
  107                $questionGUI = $this->
object->createQuestionGUI(
 
  109                    $this->testSequence->getQuestionForSequence($this->getCurrentSequenceElement())
 
  112                require_once 
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
 
  114                    $questionGUI->object->getId(),
 
  115                    $this->testSession->getActiveId(),
 
  116                    $this->testSession->getPass()
 
  119                require_once 
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
 
  125                $ret = $this->ctrl->forwardCommand($gui);
 
  129            case 'iltestsignaturegui':
 
  133                require_once 
'./Modules/Test/classes/class.ilTestSignatureGUI.php';
 
  135                $ret = $this->ctrl->forwardCommand($gui);
 
  138            case 'iltestpasswordprotectiongui':
 
  142                require_once 
'Modules/Test/classes/class.ilTestPasswordProtectionGUI.php';
 
  144                $ret = $this->ctrl->forwardCommand($gui);
 
  154                $ret = &$this->$cmd();
 
  168        $this->testSession->setUserId(
$ilUser->getId());
 
  169        $this->testSession->setAnonymousId(
$_SESSION[
"tst_access_code"][$this->object->getTestId()]);
 
  171        $this->testSession->saveToDb();
 
  173        $active_id = $this->testSession->getActiveId();
 
  174        $this->ctrl->setParameter($this, 
"active_id", $active_id);
 
  176        $shuffle = $this->
object->getShuffleQuestions();
 
  177        if ($this->object->isRandomTest()) {
 
  180            $this->
object->loadQuestions();
 
  184        assQuestion::_updateTestPassResults(
 
  186            $this->testSession->getPass(),
 
  187            $this->object->areObligationsEnabled(),
 
  193        if (!$this->testSequence->hasSequence()) {
 
  194            $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
 
  195            $this->testSequence->saveToDb();
 
  198        $this->testSequence->loadFromDb();
 
  199        $this->testSequence->loadQuestions();
 
  201        if ($this->testSession->isObjectiveOriented()) {
 
  202            require_once 
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
 
  205            $objectivesAdapter->notifyTestStart($this->testSession, $this->object->getId());
 
  206            $objectivesAdapter->prepareTestPass($this->testSession, $this->testSequence);
 
  208            $objectivesAdapter->buildQuestionRelatedObjectiveList(
 
  210                $this->questionRelatedObjectivesList
 
  213            if ($this->testSequence->hasOptionalQuestions()) {
 
  216                $this->testSequence->reorderOptionalQuestionsToSequenceEnd();
 
  217                $this->testSequence->saveToDb();
 
  221        $active_time_id = $this->
object->startWorkingTime(
 
  222            $this->testSession->getActiveId(),
 
  223            $this->testSession->getPass()
 
  225        $_SESSION[
"active_time_id"] = $active_time_id;
 
  229        $sequenceElement = $this->testSequence->getFirstSequence();
 
  231        $this->ctrl->setParameter($this, 
'sequence', $sequenceElement);
 
  232        $this->ctrl->setParameter($this, 
'pmode', 
'');
 
  234        if ($this->object->getListOfQuestionsStart()) {
 
  246        require_once(
'./Modules/Test/classes/class.ilObjTestAccess.php');
 
  247        require_once(
'./Services/Tracking/classes/class.ilLPStatusWrapper.php');
 
  253        if ($sequenceElement === 
false) {
 
  257        if ($sequenceElement < 1) {
 
  261        if (!$this->testSequence->getPositionOfSequence($sequenceElement)) {
 
  272        $_SESSION[
"active_time_id"] = $this->
object->startWorkingTime(
 
  273            $this->testSession->getActiveId(),
 
  274            $this->testSession->getPass()
 
  280            $sequenceElement = $this->testSequence->getFirstSequence();
 
  283        $this->testSession->setLastSequence($sequenceElement);
 
  284        $this->testSession->saveToDb();
 
  287        $questionId = $this->testSequence->getQuestionForSequence($sequenceElement);
 
  289        if (!(
int) $questionId && $this->testSession->isObjectiveOriented()) {
 
  293        if (!$this->testSequence->isQuestionPresented($questionId)) {
 
  294            $this->testSequence->setQuestionPresented($questionId);
 
  295            $this->testSequence->saveToDb();
 
  299            $this->testSession->getActiveId(),
 
  301            $this->testSession->getPass()
 
  307            $instantResponse = 
true;
 
  311            if ($this->object->isInstantFeedbackAnswerFixationEnabled()) {
 
  312                $instantResponse = 
false;
 
  325        $questionGui->setSequenceNumber($this->testSequence->getPositionOfSequence($sequenceElement));
 
  326        $questionGui->setQuestionCount($this->testSequence->getUserQuestionCount());
 
  328        require_once 
'Modules/Test/classes/class.ilTestQuestionHeaderBlockBuilder.php';
 
  330        $headerBlockBuilder->setHeaderMode($this->object->getTitleOutput());
 
  331        $headerBlockBuilder->setQuestionTitle($questionGui->object->getTitle());
 
  332        $headerBlockBuilder->setQuestionPoints($questionGui->object->getPoints());
 
  333        $headerBlockBuilder->setQuestionPosition($this->testSequence->getPositionOfSequence($sequenceElement));
 
  334        $headerBlockBuilder->setQuestionCount($this->testSequence->getUserQuestionCount());
 
  335        $headerBlockBuilder->setQuestionPostponed($this->testSequence->isPostponedQuestion($questionId));
 
  336        $headerBlockBuilder->setQuestionObligatory(
 
  339        if ($this->testSession->isObjectiveOriented()) {
 
  340            require_once 
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
 
  342            $objectivesAdapter->buildQuestionRelatedObjectiveList($this->testSequence, $this->questionRelatedObjectivesList);
 
  343            $this->questionRelatedObjectivesList->loadObjectivesTitles();
 
  345            $objectivesString = $this->questionRelatedObjectivesList->getQuestionRelatedObjectiveTitles($questionId);
 
  346            $headerBlockBuilder->setQuestionRelatedObjectives($objectivesString);
 
  348        $questionGui->setQuestionHeaderBlockBuilder($headerBlockBuilder);
 
  350        $this->
prepareTestPage($presentationMode, $sequenceElement, $questionId);
 
  353        $navigationToolbarGUI->setFinishTestButtonEnabled(
true);
 
  357        $this->ctrl->setParameter($this, 
'sequence', $sequenceElement);
 
  358        $this->ctrl->setParameter($this, 
'pmode', $presentationMode);
 
  361        switch ($presentationMode) {
 
  365                $navigationToolbarGUI->setDisabledStateEnabled(
false);
 
  367                $this->
showQuestionEditable($questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse);
 
  373                if ($this->testSequence->isQuestionOptional($questionGui->object->getId())) {
 
  377                $this->
showQuestionViewable($questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse);
 
  383                require_once 
'Modules/Test/exceptions/class.ilTestException.php';
 
  387        $navigationToolbarGUI->build();
 
  394        if ($instantResponse) {
 
  419        if ($this->object->isForceInstantFeedbackEnabled()) {
 
  424            $questionId = $this->testSequence->getQuestionForSequence(
 
  433                $nextSequenceElement = $this->testSequence->getFirstSequence();
 
  436            $this->testSession->setLastSequence($nextSequenceElement);
 
  437            $this->testSession->saveToDb();
 
  439            $this->ctrl->setParameter($this, 
'sequence', $nextSequenceElement);
 
  440            $this->ctrl->setParameter($this, 
'pmode', 
'');
 
  449            $questionId = $this->testSequence->getQuestionForSequence(
 
  455            if ($this->object->isForceInstantFeedbackEnabled()) {
 
  456                $this->ctrl->setParameter($this, 
'instresp', 1);
 
  458                $this->testSequence->setQuestionChecked($questionId);
 
  459                $this->testSequence->saveToDb();
 
  465                    $this->ctrl->setParameter($this, 
'pmode', 
'');
 
  484            $this->ctrl->saveParameter($this, 
'sequence');
 
  495            $this->testSequence->getQuestionForSequence($currentSequenceElement)
 
  498        $currentQuestionOBJ->resetUsersAnswer(
 
  499            $this->testSession->getActiveId(),
 
  500            $this->testSession->getPass()
 
  503        $this->ctrl->saveParameter($this, 
'sequence');
 
  513        $nextSequenceElement = $this->testSequence->getNextSequence($curSequenceElement);
 
  516            $nextSequenceElement = $this->testSequence->getFirstSequence();
 
  519        if ($this->object->isPostponingEnabled()) {
 
  520            $this->testSequence->postponeSequence($curSequenceElement);
 
  521            $this->testSequence->saveToDb();
 
  524        $this->ctrl->setParameter($this, 
'sequence', $nextSequenceElement);
 
  525        $this->ctrl->setParameter($this, 
'pmode', 
'');
 
  532        $questionId = $this->testSequence->getQuestionForSequence($sequenceElement);
 
  535            $this->testSession->getActiveId(),
 
  537            $this->testSession->getPass()
 
  540        if (!$isQuestionWorkedThrough) {
 
  541            $this->testSequence->postponeQuestion($questionId);
 
  542            $this->testSequence->saveToDb();
 
  549        $nextSequenceElement = $this->testSequence->getNextSequence($lastSequenceElement);
 
  551        if ($this->object->isPostponingEnabled()) {
 
  556            $nextSequenceElement = $this->testSequence->getFirstSequence();
 
  559        $this->ctrl->setParameter($this, 
'sequence', $nextSequenceElement);
 
  560        $this->ctrl->setParameter($this, 
'pmode', 
'');
 
  567        $sequenceElement = $this->testSequence->getPreviousSequence(
 
  572            $sequenceElement = $this->testSequence->getLastSequence();
 
  575        $this->ctrl->setParameter($this, 
'sequence', $sequenceElement);
 
  576        $this->ctrl->setParameter($this, 
'pmode', 
'');
 
  583        return $sequenceElement == $this->testSequence->getFirstSequence();
 
  588        return $sequenceElement == $this->testSequence->getLastSequence();
 
  606        return $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
 
  615        $this->saveResult = 
false;
 
  617            $formtimestamp = 
$_POST[
"formtimestamp"];
 
  618            if (strlen($formtimestamp) == 0) {
 
  619                $formtimestamp = 
$_GET[
"formtimestamp"];
 
  621            if ($formtimestamp != 
$_SESSION[
"formtimestamp"]) {
 
  622                $_SESSION[
"formtimestamp"] = $formtimestamp;
 
  640            $q_id = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
 
  647            if (is_numeric($q_id) && (
int) $q_id) {
 
  650                $active_id = $this->testSession->getActiveId();
 
  651                if ($this->object->isRandomTest()) {
 
  654                $this->saveResult = $questionOBJ->persistWorkingState(
 
  657                    $this->object->areObligationsEnabled(),
 
  661                if ($authorized && $this->testSession->isObjectiveOriented()) {
 
  662                    require_once 
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
 
  664                    $objectivesAdapter->updateQuestionResult($this->testSession, $questionOBJ);
 
  667                if ($authorized && $this->object->isSkillServiceToBeConsidered()) {
 
  673        if ($this->saveResult == 
false || (!$questionOBJ->validateSolutionSubmit() && $questionOBJ->savePartial())) {
 
  674            $this->ctrl->setParameter($this, 
"save_error", 
"1");
 
  683        $questionId = $this->testSequence->getQuestionForSequence(
 
  694            $this->testSequence->setQuestionChecked($questionId);
 
  695            $this->testSequence->saveToDb();
 
  696        } elseif ($this->object->isForceInstantFeedbackEnabled()) {
 
  697            $this->testSequence->setQuestionChecked($questionId);
 
  698            $this->testSequence->saveToDb();
 
  701        $this->ctrl->setParameter($this, 
'instresp', 1);
 
  714        $questionId = $this->testSequence->getQuestionForSequence(
 
  731        if ($this->testSession->getActiveId() > 0) {
 
  732            if ($this->testSequence->hasRandomQuestionsForPass($this->testSession->getActiveId(), $this->testSession->getPass()) > 0) {
 
  741                    __METHOD__ . 
' Random Questions allready exists for user ' .
 
  742                    $ilUser->getId() . 
' in test ' . $this->object->getTestId()
 
  754            $ilLog->write(__METHOD__ . 
' ' . sprintf(
 
  755                $this->lng->txt(
"error_random_question_generation"),
 
  757                $this->object->getTestId()
 
  771        $ilPluginAdmin = 
$DIC[
'ilPluginAdmin'];
 
  773        require_once 
'Modules/Test/classes/class.ilTestRandomQuestionSetConfig.php';
 
  775        $questionSetConfig->loadFromDb();
 
  777        require_once 
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
 
  780        require_once 
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
 
  782        $sourcePoolDefinitionList->loadDefinitions();
 
  784        $this->processLocker->executeRandomPassBuildOperation(
function () use (
$ilDB, $ilPluginAdmin, $questionSetConfig, $sourcePoolDefinitionList) {
 
  786                require_once 
'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolQuestionList.php';
 
  789                require_once 
'Modules/Test/classes/class.ilTestRandomQuestionSetBuilder.php';
 
  792                $questionSetBuilder->performBuild($this->testSession);
 
  794        }, $sourcePoolDefinitionList->hasTaxonomyFilters());
 
  804        $active_id = $this->testSession->getActiveId();
 
  805        $this->ctrl->setParameter($this, 
"active_id", $active_id);
 
  807        $active_time_id = $this->
object->startWorkingTime($active_id, $this->testSession->getPass());
 
  808        $_SESSION[
"active_time_id"] = $active_time_id;
 
  811        if ($this->object->isRandomTest()) {
 
  812            if (!$this->testSequence->hasRandomQuestionsForPass($active_id, $this->testSession->getPass())) {
 
  818        $shuffle = $this->
object->getShuffleQuestions();
 
  819        if ($this->object->isRandomTest()) {
 
  823        assQuestion::_updateTestPassResults(
 
  825            $this->testSession->getPass(),
 
  826            $this->object->areObligationsEnabled(),
 
  832        if (!$this->testSequence->hasSequence()) {
 
  833            $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
 
  834            $this->testSequence->saveToDb();
 
  837        if ($this->object->getListOfQuestionsStart()) {
 
  841        $this->ctrl->setParameter($this, 
'sequence', $this->testSession->getLastSequence());
 
  842        $this->ctrl->setParameter($this, 
'pmode', 
'');
 
  848        return $this->testSequence->isPostponedQuestion($questionId);
 
  859        include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
 
  862        require_once 
'Modules/TestQuestionPool/classes/class.ilAssQuestionUserSolutionAdopter.php';
 
  865        $userSolutionAdopter->setUserId(
$ilUser->getId());
 
  866        $userSolutionAdopter->setActiveId($this->testSession->getActiveId());
 
  867        $userSolutionAdopter->setTargetPass($this->testSequence->getPass());
 
  868        $userSolutionAdopter->setQuestionIds($this->testSequence->getOptionalQuestions());
 
  870        $userSolutionAdopter->perform();
 
  877        if ($this->testSequence->isAnsweringOptionalQuestionsConfirmed()) {
 
  881        $questionId = $this->testSequence->getQuestionForSequence($sequenceKey);
 
  883        if (!$this->testSequence->isQuestionOptional($questionId)) {
 
  897        ilUtil::sendFailure(sprintf($this->lng->txt(
'tst_objective_oriented_test_pass_without_questions'), $this->object->getTitle()), 
true);
 
  907        $isNextPrimary = 
true;
 
  909        if ($this->object->isForceInstantFeedbackEnabled()) {
 
  910            $isNextPrimary = 
false;
 
  914            $this->testSession->getActiveId(),
 
  915            $this->testSession->getPass(),
 
  916            $this->testSequence->getOrderedSequenceQuestions()
 
  919        if (!count($questionsMissingResult)) {
 
  921            $isNextPrimary = 
false;
 
  922        } elseif (count($questionsMissingResult) == 1) {
 
  923            $lastOpenQuestion = current($questionsMissingResult);
 
  925            if ($currentQuestionId == $lastOpenQuestion) {
 
  927                $isNextPrimary = 
false;
 
  931        return $isNextPrimary;
 
An exception for terminatinating execution or to throw for unit testing.
Basic GUI class for assessment questions.
static _isWorkedThrough($active_id, $question_id, $pass=null)
Returns true if the question was worked through in the given pass Worked through means that the user ...
static getQuestionsMissingResultRecord($activeId, $pass, $questionIds)
static getInstance(ilTestSession $a_test_session)
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
static isQuestionObligatory($question_id)
checks wether the question with given id is marked as obligatory or not
Base Exception for all Exceptions relating to Modules/Test.
Output class for assessment test execution.
$questionRelatedObjectivesList
isLastQuestionInSequence($sequenceElement)
handleQuestionPostponing($sequenceElement)
isOptionalQuestionAnsweringConfirmationRequired($sequenceKey)
updateLearningProgressOnTestStart()
submitSolutionAndNextCmd()
adoptUserSolutionsFromPreviousPass()
performTearsAndAngerBrokenConfessionChecks()
isQuestionSummaryFinishTestButtonRequired()
canSaveResult()
Returns TRUE if the answers of the current user could be saved.
generateRandomTestPassForActiveUser()
handlePrimaryButton(ilTestNavigationToolbarGUI $navigationToolbarGUI, $currentQuestionId)
resumePlayerCmd()
Resume a test at the last position.
populateQuestionOptionalMessage()
isShowingPostponeStatusReguired($questionId)
handleTearsAndAngerNoObjectiveOrientedQuestion()
executeCommand()
Execute Command.
isValidSequenceElement($sequenceElement)
isFirstQuestionInSequence($sequenceElement)
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
handleQuestionActionCmd()
Output class for assessment test execution.
handleSkillTriggering(ilTestSession $testSession)
checkTestSessionUser(ilTestSession $testSession)
getNextCommandParameter()
removeIntermediateSolution()
remove an auto-saved solution of the current question
setAnswerChangedParameter($changed=true)
Set the 'answer changed' url parameter for generated links.
initProcessLocker($activeId)
prepareTestPage($presentationMode, $sequenceElement, $questionId)
handleTearsAndAngerQuestionIsNull($questionId, $sequenceElement)
isNrOfTriesReached()
nr of tries exceeded
const PRESENTATION_MODE_EDIT
getQuestionInstance($questionId, $fromCache=true)
handlePasswordProtectionRedirect()
getRegisteredForcedFeedbackNavUrl()
getQuestionGuiInstance($question_id, $fromCache=true)
getCurrentSequenceElement()
populateInstantResponseModal(assQuestionGUI $questionGui, $navUrl)
showQuestionEditable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
getInstantResponseParameter()
ensureExistingTestSession(ilTestSession $testSession)
updateWorkingTime()
updates working time and stores state saveresult to see if question has to be stored or not
handleUserSettings()
Handles some form parameters on starting and resuming a test.
populateInstantResponseBlocks(assQuestionGUI $questionGui, $authorizedSolution)
getTestNavigationToolbarGUI()
populateTestNavigationToolbar(ilTestNavigationToolbarGUI $toolbarGUI)
const PRESENTATION_MODE_VIEW
getNavigationUrlParameter()
getAnswerChangedParameter()
Get the 'answer changed' status from the current request It may be set by ilTestPlayerNavigationContr...
isParticipantsAnswerFixed($questionId)
unregisterForcedFeedbackNavUrl()
isMaxProcessingTimeReached()
Checks wheather the maximum processing time is reached or not.
saveNavigationPreventConfirmation()
Save the save the switch to prevent the navigation confirmation.
registerForcedFeedbackNavUrl($forcedFeedbackNavUrl)
populateQuestionNavigation($sequenceElement, $disabled, $primaryNext)
getNextSequenceParameter()
showQuestionViewable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
isForcedFeedbackNavUrlRegistered()
const SUBMIT_INTERMEDIATE_SOLUTION
static isTestExecutionCommand($cmd)
const TEST_PLAYER_KIOSK_MODE_ENABLED
static getInstance(ilDBInterface $db, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
getObjectiveOrientedContainer()
getCommand($cmd)
Retrieves the ilCtrl command.
Class ilTestSubmissionReviewGUI.
static redirect($a_script)
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static initConnectionWithAnimation()
Init YUI Connection module.
static initjQuery(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template