19 declare(strict_types=1);
49 return array_keys($eval->getParticipant($active_id)->getPasses());
56 $found_participants = $eval->getParticipants();
57 if ($found_participants === []) {
62 $total_passed_reached = 0.0;
63 $total_passed_max = 0.0;
64 $total_passed_time = 0;
65 foreach ($found_participants as $userdata) {
66 if ($userdata->getMark()?->getPassed()) {
68 $total_passed_reached += $userdata->getReached();
69 $total_passed_max += $userdata->getMaxpoints();
70 $total_passed_time += $userdata->getTimeOnTask();
76 count($found_participants),
77 $eval->getTotalFinishedParticipants(),
81 $eval->getStatistics()->rankMedian(),
82 $eval->getStatistics()->getEvaluationDataOfMedianUser()?->getMark()?->getShortName() ??
'',
83 $eval->getStatistics()->median(),
84 $total_passed === 0 ? 0 : $total_passed_reached / $total_passed
95 $found_participants = $eval->getParticipants();
96 $participant_data = $eval->getParticipant($active_id);
97 if ($attempt_id ===
null) {
98 $attempt_id = $participant_data?->getScoredPass();
100 if ($found_participants === []
101 || $attempt_id ===
null) {
105 $attempt_data = $participant_data?->getPass($attempt_id);
106 if ($attempt_data ===
null) {
114 $attempt_data->getExamId(),
115 $attempt_data->getReachedPoints(),
116 $attempt_data->getMaxPoints(),
117 $attempt_data->getMark(),
118 $attempt_data->getAnsweredQuestionCount(),
119 $attempt_data->getQuestionCount(),
120 $attempt_data->getWorkingTime(),
121 $participant_data->getTimeOnTask(),
122 $attempt_data->getStartTime(),
123 $attempt_data->getLastAccessTime(),
124 $participant_data->getPassCount(),
125 $participant_data->getScoredPass(),
126 $eval->getStatistics()->rank($participant_data->getReached()),
127 $attempt_data->getStatusOfAttempt()
154 if ($scored_attempt !==
null 155 && $scored_attempt->getStatusOfAttempt() === StatusOfAttempt::RUNNING
156 && $scored_attempt->getStartedDate() !==
null) {
191 $question_results = [];
197 $settings->getShowHiddenQuestions(),
198 $settings->getShowOptionalQuestions()
202 $graphical_output =
false;
203 $result_output =
false;
204 $show_question_only = $settings->getQuestionTextOnly();
205 $show_feedback =
false;
206 $show_correct_solution =
false;
207 $show_manual_scoring =
false;
208 $show_question_text =
true;
209 $show_inline_feedback =
true;
211 foreach (
$results as $idx => $qresult) {
212 if (!is_numeric($idx)) {
216 $qid = $qresult[
'qid'];
217 $type = $qresult[
'type'];
218 $title = $qresult[
'title'];
219 $question_score = $qresult[
'max'];
220 $usr_score = $qresult[
'reached'];
221 $workedthrough = (bool) $qresult[
'workedthrough'];
222 $answered = (bool) $qresult[
'answered'];
225 $shuffle_trafo = $this->shuffler->getAnswerShuffleFor($qid, $active_id, $attempt_id);
226 $question = $question_gui->getObject();
227 $question->setShuffler($shuffle_trafo);
228 $question_gui->setObject($question);
230 $graphical_output =
true;
231 $show_correct_solution =
false;
232 $show_feedback = $settings->getShowFeedback();
233 $usr_solution = $question_gui->getSolutionOutput(
240 $show_correct_solution,
241 $show_manual_scoring,
243 $show_inline_feedback
247 $type ===
'assTextQuestion' 249 $usr_solution .= $question_gui->getAutoSavedSolutionOutput(
263 $graphical_output =
false;
264 $show_correct_solution =
true;
265 $show_feedback =
false;
266 $show_inline_feedback =
false;
267 $best_solution = $question_gui->getSolutionOutput(
274 $show_correct_solution,
275 $show_manual_scoring,
277 $show_inline_feedback
280 if ($show_question_only) {
281 $usr_solution = $this->ui_renderer->render($this->ui_factory->legacy()->content(
'<div class="ilc_question_Standard">' . $usr_solution .
'</div>'));
282 $best_solution = $this->ui_renderer->render($this->ui_factory->legacy()->content(
'<div class="ilc_question_Standard">' . $best_solution .
'</div>'));
285 $feedback = $question_gui->getGenericFeedbackOutput($active_id, $attempt_id);
287 $recapitulation =
null;
288 if ($is_user_output && $settings->getShowRecapitulation()) {
289 $recapitulation = $question_gui->getObject()->getSuggestedSolutionOutput();
317 if (!isset($this->test_data[$test_obj->
getId()])) {
321 return $this->test_data[$test_obj->
getId()];
withRunningAttemptStart(\DateTimeImmutable $start_date)
retrieveResultData(\ilObjTest $test_obj)
getOverviewDataForTest(\ilObjTest $test_obj)
getAttemptIdsArrayFor(\ilObjTest $test_obj, int $active_id)
withAttemptOverviewInformation(?AttemptOverview $attempt_overview)
createQuestionGUI($question_type, $question_id=-1)
Creates a question GUI instance of a given question type.
evalTotalStartedAverageTime(?array $active_ids_to_filter=null)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
getAttemptOverviewFor(ResultPresentationSettings $settings, \ilObjTest $test_obj, int $active_id, ?int $attempt_id)
getCompleteEvaluationData($filterby='', $filtertext='')
buildAttemptResults(ResultPresentationSettings $settings, \ilObjTest $test_obj, int $active_id, int $attempt_id, bool $is_user_output)
__construct(protected \ilTestShuffler $shuffler, protected UIFactory $ui_factory, protected UIRenderer $ui_renderer)
getTestResult(int $active_id, ?int $attempt=null, bool $ordered_sequence=false, bool $consider_hidden_questions=true, bool $consider_optional_questions=true)
Calculates the results of a test for a given user and returns an array with all test results...
getAttemptResultsFor(ResultPresentationSettings $settings, \ilObjTest $test_obj, int $active_id, int $attempt_id, bool $is_user_output)
addAttemptOverviewInformationToParticipants(ResultPresentationSettings $settings, \ilObjTest $test_obj, array $participants)