ILIAS  release_8 Revision v8.24
class.ilAssQuestionSkillAssignmentList.php
Go to the documentation of this file.
1<?php
2
26{
30 private $db;
31
35 private $parentObjId;
36
40 private $assignments;
41
46
51
56
57 public function __construct(ilDBInterface $db)
58 {
59 $this->db = $db;
60
61 $this->parentObjId = null;
62 $this->assignments = array();
63 $this->numAssignsBySkill = array();
64 $this->maxPointsBySkill = array();
65 $this->questionIdFilter = null;
66 }
67
71 public function setParentObjId($parentObjId): void
72 {
73 $this->parentObjId = $parentObjId;
74 }
75
79 public function getParentObjId(): ?int
80 {
81 return $this->parentObjId;
82 }
83
87 public function getQuestionIdFilter(): ?int
88 {
90 }
91
96 {
97 $this->questionIdFilter = $questionIdFilter;
98 }
99
100 public function reset(): void
101 {
102 $this->assignments = array();
103 $this->numAssignsBySkill = array();
104 $this->maxPointsBySkill = array();
105 }
106
107 public function addAssignment(ilAssQuestionSkillAssignment $assignment): void
108 {
109 if (!isset($this->assignments[$assignment->getQuestionId()])) {
110 $this->assignments[$assignment->getQuestionId()] = array();
111 }
112
113 $this->assignments[$assignment->getQuestionId()][] = $assignment;
114 }
115
117 {
118 $key = $this->buildSkillKey($assignment->getSkillBaseId(), $assignment->getSkillTrefId());
119
120 if (!isset($this->numAssignsBySkill[$key])) {
121 $this->numAssignsBySkill[$key] = 0;
122 }
123
124 $this->numAssignsBySkill[$key]++;
125 }
126
127 private function incrementMaxPointsBySkill(ilAssQuestionSkillAssignment $assignment): void
128 {
129 $key = $this->buildSkillKey($assignment->getSkillBaseId(), $assignment->getSkillTrefId());
130
131 if (!isset($this->maxPointsBySkill[$key])) {
132 $this->maxPointsBySkill[$key] = 0;
133 }
134
135 $this->maxPointsBySkill[$key] += $assignment->getMaxSkillPoints();
136 }
137
138 public function loadFromDb(): void
139 {
140 $this->reset();
141
142 $res = $this->db->query("
143 SELECT obj_fi, question_fi, skill_base_fi, skill_tref_fi, skill_points, eval_mode
144 FROM qpl_qst_skl_assigns
145 WHERE {$this->getWhereConditions()}
146 ");
147
148 while ($row = $this->db->fetchAssoc($res)) {
149 $assignment = $this->buildSkillQuestionAssignmentByArray($row);
150
151 if ($assignment->hasEvalModeBySolution()) {
152 $assignment->loadComparisonExpressions(); // db query
153 }
154
155 $this->addAssignment($assignment);
156 $this->incrementNumAssignsBySkill($assignment);
157 $this->incrementMaxPointsBySkill($assignment);
158 }
159 }
160
161 private function getWhereConditions(): string
162 {
163 $conditions = array(
164 'obj_fi = ' . $this->db->quote($this->getParentObjId(), 'integer')
165 );
166
167 if ($this->getQuestionIdFilter()) {
168 $conditions[] = 'question_fi = ' . $this->db->quote($this->getQuestionIdFilter(), 'integer');
169 }
170
171 return implode(' AND ', $conditions);
172 }
173
179 {
180 $assignment = new ilAssQuestionSkillAssignment($this->db);
181
182 $assignment->setParentObjId($data['obj_fi']);
183 $assignment->setQuestionId($data['question_fi']);
184 $assignment->setSkillBaseId($data['skill_base_fi']);
185 $assignment->setSkillTrefId($data['skill_tref_fi']);
186 $assignment->setSkillPoints($data['skill_points']);
187 $assignment->setEvalMode($data['eval_mode']);
188
189 return $assignment;
190 }
191
192 private function buildSkillKey($skillBaseId, $skillTrefId): string
193 {
194 return $skillBaseId . ':' . $skillTrefId;
195 }
196
197 public function loadAdditionalSkillData(): void
198 {
199 foreach ($this->assignments as $assignmentsByQuestion) {
200 foreach ($assignmentsByQuestion as $assignment) {
201 $assignment->loadAdditionalSkillData();
202 }
203 }
204 }
205
210 public function getAssignmentsByQuestionId($questionId): array
211 {
212 if (!isset($this->assignments[$questionId])) {
213 return array();
214 }
215
216 return $this->assignments[$questionId];
217 }
218
219 public function isAssignedToQuestionId($skillBaseId, $skillTrefId, $questionId): bool
220 {
221 if (!isset($this->assignments[$questionId])) {
222 return false;
223 }
224
225 foreach ($this->assignments[$questionId] as $assignment) {
226 if ($assignment->getSkillBaseId() != $skillBaseId) {
227 continue;
228 }
229
230 if ($assignment->getSkillTrefId() != $skillTrefId) {
231 continue;
232 }
233
234 return true;
235 }
236
237 return false;
238 }
239
240 public function getUniqueAssignedSkills(): array
241 {
242 $skills = array();
243
244 foreach ($this->assignments as $assignmentsByQuestion) {
245 foreach ($assignmentsByQuestion as $assignment) {
246 /* @var ilAssQuestionSkillAssignment $assignment */
247
248 $key = $this->buildSkillKey($assignment->getSkillBaseId(), $assignment->getSkillTrefId());
249
250 if (!isset($skills[$key])) {
251 $skills[$key] = array(
252 'skill' => new ilBasicSkill($assignment->getSkillBaseId()),
253 'skill_base_id' => $assignment->getSkillBaseId(),
254 'skill_tref_id' => $assignment->getSkillTrefId(),
255 'skill_title' => $assignment->getSkillTitle(),
256 'skill_path' => $assignment->getSkillPath(),
257 'num_assigns' => $this->getNumAssignsBySkill(
258 $assignment->getSkillBaseId(),
259 $assignment->getSkillTrefId()
260 ),
261 'max_points' => $this->getMaxPointsBySkill(
262 $assignment->getSkillBaseId(),
263 $assignment->getSkillTrefId()
264 )
265 );
266 }
267 }
268 }
269
270 return $skills;
271 }
272
273 public function isAssignedSkill($skillBaseId, $skillTrefId): bool
274 {
275 foreach ($this->getUniqueAssignedSkills() as $assignedSkill) {
276 if ($assignedSkill['skill_base_id'] != $skillBaseId) {
277 continue;
278 }
279
280 if ($assignedSkill['skill_tref_id'] == $skillTrefId) {
281 return true;
282 }
283 }
284
285 return false;
286 }
287
288 public function getNumAssignsBySkill($skillBaseId, $skillTrefId)
289 {
290 return $this->numAssignsBySkill[$this->buildSkillKey($skillBaseId, $skillTrefId)] ?? null;
291 }
292
293 public function getMaxPointsBySkill($skillBaseId, $skillTrefId)
294 {
295 return $this->maxPointsBySkill[$this->buildSkillKey($skillBaseId, $skillTrefId)] ?? null;
296 }
297
298 public function hasSkillsAssignedLowerThanBarrier(): bool
299 {
300 require_once 'Modules/Test/classes/class.ilObjAssessmentFolder.php';
302
303 foreach ($this->getUniqueAssignedSkills() as $skillData) {
304 if ($skillData['num_assigns'] < $globalBarrier) {
305 return true;
306 }
307 }
308
309 return false;
310 }
311}
addAssignment(ilAssQuestionSkillAssignment $assignment)
isAssignedToQuestionId($skillBaseId, $skillTrefId, $questionId)
incrementNumAssignsBySkill(ilAssQuestionSkillAssignment $assignment)
incrementMaxPointsBySkill(ilAssQuestionSkillAssignment $assignment)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface ilDBInterface.
$res
Definition: ltiservices.php:69
string $key
Consumer key/client ID value.
Definition: System.php:193