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(); }
/** * 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); }
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(); }
/** * 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; } }