ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
class.ilAssQuestionSkillAssignmentList.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22{
23 private ?int $parent_obj_id = null;
24
25 private array $assignments = [];
26
27 private array $num_assigns_by_skill = [];
28
29 private array $max_points_by_skill = [];
30
31 private ?int $question_id_filter = null;
32
33 public function __construct(
34 private readonly ilDBInterface $db
35 ) {
36 }
37
38 public function setParentObjId(?int $parent_obj_id): void
39 {
40 $this->parent_obj_id = $parent_obj_id;
41 }
42
43 public function getParentObjId(): ?int
44 {
46 }
47
48 public function getQuestionIdFilter(): ?int
49 {
51 }
52
53 public function setQuestionIdFilter(?int $question_id_filter): void
54 {
55 $this->question_id_filter = $question_id_filter;
56 }
57
58 public function reset(): void
59 {
60 $this->assignments = [];
61 $this->num_assigns_by_skill = [];
62 $this->max_points_by_skill = [];
63 }
64
65 public function addAssignment(ilAssQuestionSkillAssignment $assignment): void
66 {
67 $this->assignments[$assignment->getQuestionId()] ??= [];
68 $this->assignments[$assignment->getQuestionId()][] = $assignment;
69 }
70
71 private function incrementNumAssignsBySkill(ilAssQuestionSkillAssignment $assignment): void
72 {
73 $key = $this->buildSkillKey($assignment->getSkillBaseId(), $assignment->getSkillTrefId());
74
75 $this->num_assigns_by_skill[$key] ??= 0;
76 $this->num_assigns_by_skill[$key]++;
77 }
78
79 private function incrementMaxPointsBySkill(ilAssQuestionSkillAssignment $assignment): void
80 {
81 $key = $this->buildSkillKey($assignment->getSkillBaseId(), $assignment->getSkillTrefId());
82
83 $this->max_points_by_skill[$key] ??= 0;
84 $this->max_points_by_skill[$key] += $assignment->getMaxSkillPoints();
85 }
86
87 public function loadFromDb(): void
88 {
89 $this->reset();
90
91 $res = $this->db->query("
92 SELECT obj_fi, question_fi, skill_base_fi, skill_tref_fi, skill_points, eval_mode
93 FROM qpl_qst_skl_assigns
94 WHERE {$this->getWhereConditions()}
95 ");
96
97 while ($row = $this->db->fetchAssoc($res)) {
98 $assignment = $this->buildSkillQuestionAssignmentByArray($row);
99
100 if ($assignment->hasEvalModeBySolution()) {
101 $assignment->loadComparisonExpressions();
102 }
103
104 $this->addAssignment($assignment);
105 $this->incrementNumAssignsBySkill($assignment);
106 $this->incrementMaxPointsBySkill($assignment);
107 }
108 }
109
110 private function getWhereConditions(): string
111 {
112 $conditions = ["obj_fi = {$this->db->quote($this->getParentObjId(), ilDBConstants::T_INTEGER)}"];
113
114 if ($this->getQuestionIdFilter()) {
115 $conditions[] = "question_fi = {$this->db->quote($this->getQuestionIdFilter(), ilDBConstants::T_INTEGER)}";
116 }
117
118 return implode(' AND ', $conditions);
119 }
120
122 {
123 $assignment = new ilAssQuestionSkillAssignment($this->db);
124
125 $assignment->setParentObjId($data['obj_fi']);
126 $assignment->setQuestionId($data['question_fi']);
127 $assignment->setSkillBaseId($data['skill_base_fi']);
128 $assignment->setSkillTrefId($data['skill_tref_fi']);
129 $assignment->setSkillPoints($data['skill_points']);
130 $assignment->setEvalMode($data['eval_mode']);
131
132 return $assignment;
133 }
134
135 private function buildSkillKey(int $skill_base_id, int $skill_tref_id): string
136 {
137 return "{$skill_base_id}:{$skill_tref_id}";
138 }
139
140 public function loadAdditionalSkillData(): void
141 {
142 foreach ($this->assignments as $assignments_by_question) {
143 foreach ($assignments_by_question as $assignment) {
144 $assignment->loadAdditionalSkillData();
145 }
146 }
147 }
148
152 public function getAssignmentsByQuestionId(int $question_id): array
153 {
154 return $this->assignments[$question_id] ?? [];
155 }
156
157 public function isAssignedToQuestionId(int $skill_base_id, int $skill_tref_id, int $question_id): bool
158 {
159 if (!isset($this->assignments[$question_id])) {
160 return false;
161 }
162
163 foreach ($this->assignments[$question_id] as $assignment) {
164 if ($assignment->getSkillBaseId() !== $skill_base_id) {
165 continue;
166 }
167
168 if ($assignment->getSkillTrefId() !== $skill_tref_id) {
169 continue;
170 }
171
172 return true;
173 }
174
175 return false;
176 }
177
178 public function getUniqueAssignedSkills(): array
179 {
180 $skills = [];
181
182 foreach ($this->assignments as $assignments_by_question) {
183 foreach ($assignments_by_question as $assignment) {
184 $key = $this->buildSkillKey($assignment->getSkillBaseId(), $assignment->getSkillTrefId());
185 $skills[$key] ??= [
186 'skill' => new ilBasicSkill($assignment->getSkillBaseId()),
187 'skill_base_id' => $assignment->getSkillBaseId(),
188 'skill_tref_id' => $assignment->getSkillTrefId(),
189 'skill_title' => $assignment->getSkillTitle(),
190 'skill_path' => $assignment->getSkillPath(),
191 'num_assigns' => $this->getNumAssignsBySkill(
192 $assignment->getSkillBaseId(),
193 $assignment->getSkillTrefId()
194 ),
195 'max_points' => $this->getMaxPointsBySkill(
196 $assignment->getSkillBaseId(),
197 $assignment->getSkillTrefId()
198 )
199 ];
200 }
201 }
202
203 return $skills;
204 }
205
206 public function isAssignedSkill(int $skill_base_id, int $skill_tref_id): bool
207 {
208 foreach ($this->getUniqueAssignedSkills() as $assignedSkill) {
209 if ($assignedSkill['skill_base_id'] !== $skill_base_id) {
210 continue;
211 }
212
213 if ($assignedSkill['skill_tref_id'] === $skill_tref_id) {
214 return true;
215 }
216 }
217
218 return false;
219 }
220
221 public function getNumAssignsBySkill(int $skill_base_id, int $skill_tref_id)
222 {
223 return $this->num_assigns_by_skill[$this->buildSkillKey($skill_base_id, $skill_tref_id)] ?? null;
224 }
225
226 public function getMaxPointsBySkill(int $skill_base_id, int $skill_tref_id)
227 {
228 return $this->max_points_by_skill[$this->buildSkillKey($skill_base_id, $skill_tref_id)] ?? null;
229 }
230
231 public function hasSkillsAssignedLowerThanBarrier(): bool
232 {
233 $global_barrier = (new ilObjTestFolder())
234 ->getGlobalSettingsRepository()
235 ->getGlobalSettings()
236 ->getSkillTriggeringNumberOfAnswers();
237
238 foreach ($this->getUniqueAssignedSkills() as $skill_data) {
239 if ($skill_data['num_assigns'] < $global_barrier) {
240 return true;
241 }
242 }
243
244 return false;
245 }
246}
addAssignment(ilAssQuestionSkillAssignment $assignment)
isAssignedSkill(int $skill_base_id, int $skill_tref_id)
incrementNumAssignsBySkill(ilAssQuestionSkillAssignment $assignment)
isAssignedToQuestionId(int $skill_base_id, int $skill_tref_id, int $question_id)
getNumAssignsBySkill(int $skill_base_id, int $skill_tref_id)
buildSkillKey(int $skill_base_id, int $skill_tref_id)
incrementMaxPointsBySkill(ilAssQuestionSkillAssignment $assignment)
getMaxPointsBySkill(int $skill_base_id, int $skill_tref_id)
Class ilObjTestFolder.
Interface ilDBInterface.
$res
Definition: ltiservices.php:69