public function initFilter()
 {
     $this->setDisableFilterHiding(true);
     include_once 'Services/Form/classes/class.ilSelectInputGUI.php';
     $available_questions = new ilSelectInputGUI($this->lng->txt('question'), 'question');
     $select_questions = array();
     if (!$this->getParentObject()->object->isRandomTest()) {
         $questions = $this->getParentObject()->object->getTestQuestions();
     } else {
         $questions = $this->getParentObject()->object->getPotentialRandomTestQuestions();
     }
     $scoring = ilObjAssessmentFolder::_getManualScoring();
     foreach ($questions as $data) {
         include_once 'Modules/TestQuestionPool/classes/class.assQuestion.php';
         $info = assQuestion::_getQuestionInfo($data['question_id']);
         $type = $info["question_type_fi"];
         if (in_array($type, $scoring)) {
             $maxpoints = assQuestion::_getMaximumPoints($data["question_id"]);
             if ($maxpoints == 1) {
                 $maxpoints = ' (' . $maxpoints . ' ' . $this->lng->txt('point') . ')';
             } else {
                 $maxpoints = ' (' . $maxpoints . ' ' . $this->lng->txt('points') . ')';
             }
             $select_questions[$data["question_id"]] = $data['title'] . $maxpoints . ' [' . $this->lng->txt('question_id_short') . ': ' . $data["question_id"] . ']';
         }
     }
     if (!$select_questions) {
         $select_questions[0] = $this->lng->txt('tst_no_scorable_qst_available');
     }
     $available_questions->setOptions(array('' => $this->lng->txt('please_choose')) + $select_questions);
     $this->addFilterItem($available_questions);
     $available_questions->readFromSession();
     $this->filter['question'] = $available_questions->getValue();
     $pass = new ilSelectInputGUI($this->lng->txt('pass'), 'pass');
     $passes = array();
     $max_pass = $this->getParentObject()->object->getMaxPassOfTest();
     for ($i = 1; $i <= $max_pass; $i++) {
         $passes[$i] = $i;
     }
     $pass->setOptions($passes);
     $this->addFilterItem($pass);
     $pass->readFromSession();
     $this->filter['pass'] = $pass->getValue();
 }
예제 #2
0
 /**
  * This method is called after an user submitted one or more files.
  * It should handle the setting "Completion by Submission" and, if enabled, set the status of
  * the current user.
  *
  * @param	integer
  * @param	integer
  * @access	protected
  */
 protected function handleSubmission($active_id, $pass, $obligationsAnswered)
 {
     global $ilObjDataCache;
     if ($this->isCompletionBySubmissionEnabled()) {
         $maxpoints = assQuestion::_getMaximumPoints($this->getId());
         if ($this->getUploadedFiles($active_id, $pass)) {
             $points = $maxpoints;
         } else {
             $points = 0;
         }
         assQuestion::_setReachedPoints($active_id, $this->getId(), $points, $maxpoints, $pass, 1, $obligationsAnswered);
         // update learning progress
         include_once 'Modules/Test/classes/class.ilObjTestAccess.php';
         include_once 'Services/Tracking/classes/class.ilLPStatusWrapper.php';
         ilLPStatusWrapper::_updateStatus(ilObjTest::_getObjectIDFromActiveID((int) $active_id), ilObjTestAccess::_getParticipantId((int) $active_id));
     }
 }
 /**
  * lookup maximimum point
  *
  * @access public
  * @param int question id
  * @return
  * @static
  */
 public static function _lookupMaximumPointsOfQuestion($a_question_id)
 {
     include_once 'Modules/TestQuestionPool/classes/class.assQuestion.php';
     return assQuestion::_getMaximumPoints($a_question_id);
 }
예제 #4
0
 private function buildManScoringParticipantForm($questionGuiList, $activeId, $pass, $initValues = false)
 {
     global $ilCtrl, $lng;
     require_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
     require_once 'Services/Form/classes/class.ilFormSectionHeaderGUI.php';
     require_once 'Services/Form/classes/class.ilCustomInputGUI.php';
     require_once 'Services/Form/classes/class.ilCheckboxInputGUI.php';
     require_once 'Services/Form/classes/class.ilTextInputGUI.php';
     require_once 'Services/Form/classes/class.ilTextAreaInputGUI.php';
     $ilCtrl->setParameter($this, 'active_id', $activeId);
     $ilCtrl->setParameter($this, 'pass', $pass);
     $form = new ilPropertyFormGUI();
     $form->setFormAction($ilCtrl->getFormAction($this));
     $form->setTitle(sprintf($lng->txt('manscoring_results_pass'), $pass + 1));
     $form->setTableWidth('100%');
     foreach ($questionGuiList as $questionId => $questionGUI) {
         $questionHeader = sprintf($lng->txt('tst_manscoring_question_section_header'), $questionGUI->object->getTitle());
         $questionSolution = $questionGUI->getSolutionOutput($activeId, $pass, false, false, true, false, false, true);
         $bestSolution = $questionGUI->object->getSuggestedSolutionOutput();
         $sect = new ilFormSectionHeaderGUI();
         $sect->setTitle($questionHeader . ' [' . $this->lng->txt('question_id_short') . ': ' . $questionGUI->object->getId() . ']');
         $form->addItem($sect);
         $cust = new ilCustomInputGUI($lng->txt('tst_manscoring_input_question_and_user_solution'));
         $cust->setHtml($questionSolution);
         $form->addItem($cust);
         $text = new ilTextInputGUI($lng->txt('tst_change_points_for_question'), "question__{$questionId}__points");
         if ($initValues) {
             $text->setValue(assQuestion::_getReachedPoints($activeId, $questionId, $pass));
         }
         $form->addItem($text);
         $nonedit = new ilNonEditableValueGUI($lng->txt('tst_manscoring_input_max_points_for_question'), "question__{$questionId}__maxpoints");
         if ($initValues) {
             $nonedit->setValue(assQuestion::_getMaximumPoints($questionId));
         }
         $form->addItem($nonedit);
         $area = new ilTextAreaInputGUI($lng->txt('set_manual_feedback'), "question__{$questionId}__feedback");
         $area->setUseRTE(true);
         if ($initValues) {
             $area->setValue($this->object->getManualFeedback($activeId, $questionId, $pass));
         }
         $form->addItem($area);
         if (strlen(trim($bestSolution))) {
             $cust = new ilCustomInputGUI($lng->txt('tst_show_solution_suggested'));
             $cust->setHtml($bestSolution);
             $form->addItem($cust);
         }
     }
     $sect = new ilFormSectionHeaderGUI();
     $sect->setTitle($lng->txt('tst_participant'));
     $form->addItem($sect);
     $check = new ilCheckboxInputGUI($lng->txt('set_manscoring_done'), 'manscoring_done');
     if ($initValues && ilTestService::isManScoringDone($activeId)) {
         $check->setChecked(true);
     }
     $form->addItem($check);
     $check = new ilCheckboxInputGUI($lng->txt('tst_manscoring_user_notification'), 'manscoring_notify');
     $form->addItem($check);
     $form->addCommandButton('saveManScoringParticipantScreen', $lng->txt('save'));
     $form->addCommandButton('saveReturnManScoringParticipantScreen', $lng->txt('save_return'));
     $form->addCommandButton('saveNextManScoringParticipantScreen', $lng->txt('save_and_next'));
     return $form;
 }
 public function saveManScoringByQuestion()
 {
     /**
      * @var $ilAccess ilAccessHandler
      */
     global $ilAccess, $lng;
     if (!$ilAccess->checkAccess('write', '', $this->ref_id)) {
         ilUtil::sendInfo($this->lng->txt('cannot_edit_test'), true);
         $this->ctrl->redirectByClass('ilobjtestgui', 'infoScreen');
     }
     if (!isset($_POST['scoring']) || !is_array($_POST['scoring'])) {
         ilUtil::sendFailure($this->lng->txt('tst_save_manscoring_failed_unknown'));
         $this->showManScoringByQuestionParticipantsTable();
         return;
     }
     include_once 'Modules/TestQuestionPool/classes/class.assQuestion.php';
     include_once 'Modules/Test/classes/class.ilObjTestAccess.php';
     include_once 'Services/Tracking/classes/class.ilLPStatusWrapper.php';
     $oneExceededMaxPoints = false;
     $manPointsPost = array();
     $skipParticipant = array();
     $maxPointsByQuestionId = array();
     foreach ($_POST['scoring'] as $pass => $active_ids) {
         foreach ((array) $active_ids as $active_id => $questions) {
             // check for existing test result data
             if (!$this->object->getTestResult($active_id, $pass)) {
                 if (!isset($skipParticipant[$pass])) {
                     $skipParticipant[$pass] = array();
                 }
                 $skipParticipant[$pass][$active_id] = true;
                 continue;
             }
             foreach ((array) $questions as $qst_id => $reached_points) {
                 if (!isset($manPointsPost[$pass])) {
                     $manPointsPost[$pass] = array();
                 }
                 if (!isset($manPointsPost[$pass][$active_id])) {
                     $manPointsPost[$pass][$active_id] = array();
                 }
                 $maxPointsByQuestionId[$qst_id] = assQuestion::_getMaximumPoints($qst_id);
                 if ($reached_points > $maxPointsByQuestionId[$qst_id]) {
                     $oneExceededMaxPoints = true;
                 }
                 $manPointsPost[$pass][$active_id][$qst_id] = $reached_points;
             }
         }
     }
     if ($oneExceededMaxPoints) {
         ilUtil::sendFailure(sprintf($this->lng->txt('tst_save_manscoring_failed'), $pass + 1));
         $this->showManScoringByQuestionParticipantsTable($manPointsPost);
         return;
     }
     $changed_one = false;
     foreach ($_POST['scoring'] as $pass => $active_ids) {
         foreach ((array) $active_ids as $active_id => $questions) {
             $update_participant = false;
             if ($skipParticipant[$pass][$active_id]) {
                 continue;
             }
             foreach ((array) $questions as $qst_id => $reached_points) {
                 $update_participant = assQuestion::_setReachedPoints($active_id, $qst_id, $reached_points, $maxPointsByQuestionId[$qst_id], $pass, 1, $this->object->areObligationsEnabled());
             }
             if ($update_participant) {
                 $changed_one = true;
                 ilLPStatusWrapper::_updateStatus($this->object->getId(), ilObjTestAccess::_getParticipantId($active_id));
             }
         }
     }
     if ($changed_one) {
         if ($this->object->getAnonymity() == 0) {
             $user_name = $user_name = ilObjUser::_lookupName(ilObjTestAccess::_getParticipantId($active_id));
             $name_real_or_anon = $user_name['firstname'] . ' ' . $user_name['lastname'];
         } else {
             $name_real_or_anon = $lng->txt('anonymous');
         }
         ilUtil::sendSuccess(sprintf($this->lng->txt('tst_saved_manscoring_successfully'), $pass + 1, $name_real_or_anon), true);
         require_once './Modules/Test/classes/class.ilTestScoring.php';
         $scorer = new ilTestScoring($this->object);
         $scorer->setPreserveManualScores(true);
         $scorer->recalculateSolutions();
         if ($this->object->getEnableArchiving()) {
             require_once 'Modules/Test/classes/class.ilTestArchiveService.php';
             $archiveService = new ilTestArchiveService($this->object);
             $archiveService->archivePassesByActives($scorer->getRecalculatedPassesByActives());
         }
     }
     $this->showManScoringByQuestionParticipantsTable();
 }
예제 #6
0
 /**
  * get number of answers for question id (static)
  * note: do not use $this inside this method
  *
  * @param	int		$a_q_id		question id
  */
 public static function _getTotalRightAnswers($a_q_id)
 {
     global $ilDB;
     $result = $ilDB->queryF("SELECT question_id FROM qpl_questions WHERE original_id = %s OR question_id = %s", array('integer', 'integer'), array($a_q_id, $a_q_id));
     if ($result->numRows() == 0) {
         return 0;
     }
     $found_id = array();
     while ($row = $ilDB->fetchAssoc($result)) {
         array_push($found_id, $row["question_id"]);
     }
     $result = $ilDB->query("SELECT * FROM tst_test_result WHERE " . $ilDB->in('question_fi', $found_id, false, 'integer'));
     $answers = array();
     while ($row = $ilDB->fetchAssoc($result)) {
         $reached = $row["points"];
         include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
         $max = assQuestion::_getMaximumPoints($row["question_fi"]);
         array_push($answers, array("reached" => $reached, "max" => $max));
     }
     $max = 0.0;
     $reached = 0.0;
     foreach ($answers as $key => $value) {
         $max += $value["max"];
         $reached += $value["reached"];
     }
     if ($max > 0) {
         return $reached / $max;
     } else {
         return 0;
     }
 }