19declare(strict_types=1);
36 private readonly \DateTimeZone $timezone,
39 private readonly
int $question_id
52 array $visible_column_ids,
56 ?array $additional_parameters
58 if ($this->participant_data === null) {
63 foreach (
$data as $row) {
64 if (in_array($row[
'usr_id'], $this->test_obj->getAnonOnlyParticipantIds())) {
67 yield $row_builder->buildDataRow(
76 ?array $additional_parameters
78 if ($this->participant_data === null) {
79 $this->participant_data = $this->getFilteredData($this->question_id);
81 return count($this->participant_data);
86 return $this->test_obj->getMaxPassOfTest();
91 $complete_feedback = $this->test_obj->getCompleteManualFeedback($question_id);
92 $data = $this->test_obj->getCompleteEvaluationData();
94 $participants =
$data->getParticipants();
95 $accessible_user_ids = call_user_func(
96 $this->participant_access_filter_factory->getScoreParticipantsUserFilter($this->test_obj->getRefId()),
97 $this->buildUserIdArrayFromParticipants($participants)
99 $accessible_participants = array_filter(
105 array_keys($accessible_participants),
106 $this->getDataRowClosure($question_id, $accessible_participants, $complete_feedback),
114 $key = key($order->
get());
115 $direction = $order->
get()[$key];
117 $this->participant_data,
118 static function (array
$a, array
$b) use ($key, $direction):
int {
119 $left =
$a[$key] ??
null;
120 $right =
$b[$key] ??
null;
121 if ($direction ===
'ASC') {
122 return $left <=> $right;
124 return $right <=> $left;
131 array $filtered_participants,
132 array $complete_feedback
137 ) use ($question_id, $filtered_participants, $complete_feedback): array {
138 $array_of_attempts = $this->buildFilteredArrayOfAttempts(
141 $filtered_participants,
144 return [...$c, ...$array_of_attempts];
151 array $filtered_participants,
152 array $complete_feedback
155 $filtered_participants[$active_id]->getPasses(),
159 ) use ($question_id, $active_id, $filtered_participants, $complete_feedback): array {
160 $question_result = $pd->getAnsweredQuestionByQuestionId($question_id);
161 $feedback_data = $complete_feedback[$active_id][$pd->getPass()][$question_id] ?? [];
162 if ($this->isFilteredAttempt($pd, $question_result, $feedback_data)) {
166 $current_participant = $filtered_participants[$active_id];
169 "{$active_id}_{$pd->getPass()}",
170 ScoringByQuestionTable::COLUMN_EXAMID =>
\ilObjTest::buildExamId($active_id, $pd->getPass(), $this->test_obj->getId()),
171 ScoringByQuestionTable::COLUMN_NAME => $current_participant->getName(),
172 ScoringByQuestionTable::COLUMN_ATTEMPT => $pd->getPass() + 1,
173 ScoringByQuestionTable::COLUMN_POINTS_REACHED => $question_result[
'reached'] ?? 0.0,
174 ScoringByQuestionTable::COLUMN_POINTS_AVAILABLE => $current_participant->getQuestionByAttemptAndId($pd->getPass(), $question_id)[
'points'] ?? 0.0,
175 ScoringByQuestionTable::COLUMN_FEEDBACK => $feedback_data[
'feedback'] ??
'',
176 ScoringByQuestionTable::COLUMN_FINALIZED => isset($feedback_data[
'finalized_evaluation']) && $feedback_data[
'finalized_evaluation'] === 1,
177 ScoringByQuestionTable::COLUMN_FINALIZED_BY => $this->buildFinalizedByName($feedback_data),
178 'usr_id' => $current_participant->getUserId()
181 if (isset($feedback_data[
'finalized_tstamp'])
182 && $feedback_data[
'finalized_tstamp'] !== 0) {
183 $row[ScoringByQuestionTable::COLUMN_FINALIZED_ON] = (new \DateTimeImmutable(
184 '@' . $feedback_data[
'finalized_tstamp']
186 )->setTimezone($this->timezone);
198 ?array $question_info,
201 if ($this->filter_data === []) {
205 if ($this->filter_data[ScoringByQuestionTable::FILTER_FIELD_ONLY_ANSWERED] ===
'1'
206 && ($question_info ===
null || $question_info[
'isAnwered'] ===
false)
207 || $this->filter_data[ScoringByQuestionTable::COLUMN_ATTEMPT] !==
''
208 && $pd->getPass() !== (
int) $this->filter_data[ScoringByQuestionTable::COLUMN_ATTEMPT]
209 || $this->filter_data[ScoringByQuestionTable::COLUMN_FINALIZED] ===
'1'
210 && (!isset($feedback_data[
'finalized_evaluation']) || $feedback_data[
'finalized_evaluation'] !== 1)
211 || $this->filter_data[ScoringByQuestionTable::COLUMN_FINALIZED] ===
'2'
212 && isset($feedback_data[
'finalized_evaluation']) && $feedback_data[
'finalized_evaluation'] === 1) {
241 if (isset($feedback_data[
'finalized_by_usr_id'])
242 && $feedback_data[
'finalized_by_usr_id'] !==
'') {
243 return \ilObjUser::_lookupFullname($feedback_data[
'finalized_by_usr_id']);
Both the subject and the direction need to be specified when expressing an order.
A simple class to express a naive range of whole positive numbers.
__construct(private readonly Language $lng, private readonly \DateTimeZone $timezone, private readonly \ilTestParticipantAccessFilterFactory $participant_access_filter_factory, private readonly \ilObjTest $test_obj, private readonly int $question_id)
buildUserIdArrayFromParticipants(array $participants)
isFilteredAttempt(\ilTestEvaluationPassData $pd, ?array $question_info, array $feedback_data)
getFilteredData(int $question_id)
buildFinalizedByName(array $feedback_data)
getRows(DataRowBuilder $row_builder, array $visible_column_ids, Range $range, Order $order, ?array $filter_data, ?array $additional_parameters)
This is called by the table to retrieve rows; map data-records to rows using the $row_builder e....
getDataRowClosure(int $question_id, array $filtered_participants, array $complete_feedback)
withFilterData(array $filter_data)
buildFilteredArrayOfAttempts(int $question_id, int $active_id, array $filtered_participants, array $complete_feedback)
getTotalRowCount(?array $filter_data, ?array $additional_parameters)
Mainly for the purpose of pagination-support, it is important to know about the total number of recor...
static buildExamId($active_id, $pass, $test_obj_id=null)
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
if(!file_exists('../ilias.ini.php'))