ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilTestPassesSelector.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4
12{
13 protected $db;
14
15 protected $testOBJ;
16
17 private $activeId;
18
19 private $lastFinishedPass = null;
20
21 private $passes = null;
22
23 private $testPassedOnceCache = array();
24
26 {
27 $this->db = $db;
28 $this->testOBJ = $testOBJ;
29 }
30
31 public function getActiveId()
32 {
33 return $this->activeId;
34 }
35
36 public function setActiveId($activeId)
37 {
38 $this->activeId = $activeId;
39 }
40
41 public function getLastFinishedPass()
42 {
44 }
45
47 {
49 $this->lastFinishedPass = $lastFinishedPass;
50 }
51
52 private function passesLoaded()
53 {
54 return is_array($this->passes);
55 }
56
57 private function ensureLoadedPasses()
58 {
59 if (!$this->passesLoaded()) {
60 $this->loadPasses();
61 }
62 }
63 private function loadPasses()
64 {
65 $query = "
66 SELECT DISTINCT tst_pass_result.* FROM tst_pass_result
67 LEFT JOIN tst_test_result
68 ON tst_pass_result.pass = tst_test_result.pass
69 AND tst_pass_result.active_fi = tst_test_result.active_fi
70 WHERE tst_pass_result.active_fi = %s
71 ORDER BY tst_pass_result.pass
72 ";
73
74 $res = $this->db->queryF(
75 $query,
76 array('integer'),
77 array($this->getActiveId())
78 );
79
80 $this->passes = array();
81
82 while ($row = $this->db->fetchAssoc($res)) {
83 $this->passes[$row['pass']] = $row;
84 }
85 }
86
87 private function getLazyLoadedPasses()
88 {
89 $this->ensureLoadedPasses();
90 return $this->passes;
91 }
92
93 public function loadLastFinishedPass()
94 {
95 $query = "
96 SELECT last_finished_pass FROM tst_active WHERE active_id = %s
97 ";
98
99 $res = $this->db->queryF(
100 $query,
101 array('integer'),
102 array($this->getActiveId())
103 );
104
105 while ($row = $this->db->fetchAssoc($res)) {
106 $this->setLastFinishedPass($row['last_finished_pass']);
107 }
108 }
109
110 public function getExistingPasses()
111 {
112 return array_keys($this->getLazyLoadedPasses());
113 }
114
115 public function hasExistingPasses()
116 {
117 return (bool) count($this->getExistingPasses());
118 }
119
120 public function getNumExistingPasses()
121 {
122 return count($this->getExistingPasses());
123 }
124
125 public function openPassExists()
126 {
127 return count($this->getExistingPasses()) > count($this->getClosedPasses());
128 }
129
130 public function getClosedPasses()
131 {
132 $existingPasses = $this->getExistingPasses();
133 $closedPasses = $this->fetchClosedPasses($existingPasses);
134
135 return $closedPasses;
136 }
137
138 public function getReportablePasses()
139 {
140 $existingPasses = $this->getExistingPasses();
141
142 $reportablePasses = $this->fetchReportablePasses($existingPasses);
143
144 return $reportablePasses;
145 }
146
147 public function hasReportablePasses()
148 {
149 return (bool) count($this->getReportablePasses());
150 }
151
152 private function fetchReportablePasses($existingPasses)
153 {
154 $lastPass = $this->fetchLastPass($existingPasses);
155
156 $reportablePasses = array();
157
158 foreach ($existingPasses as $pass) {
159 if ($this->isReportablePass($lastPass, $pass)) {
160 $reportablePasses[] = $pass;
161 }
162 }
163
164 return $reportablePasses;
165 }
166
167 private function fetchClosedPasses($existingPasses)
168 {
169 $closedPasses = array();
170
171 foreach ($existingPasses as $pass) {
172 if ($this->isClosedPass($pass)) {
173 $closedPasses[] = $pass;
174 }
175 }
176
177 return $closedPasses;
178 }
179
180 private function fetchLastPass($existingPasses)
181 {
182 $lastPass = null;
183
184 foreach ($existingPasses as $pass) {
185 if ($lastPass === null || $pass > $lastPass) {
186 $lastPass = $pass;
187 }
188 }
189
190 return $lastPass;
191 }
192
193 private function isReportablePass($lastPass, $pass)
194 {
195 switch ($this->testOBJ->getScoreReporting()) {
197
198 return true;
199
201
202 return $this->isReportingDateReached();
203
205
206 if ($pass < $lastPass) {
207 return true;
208 }
209
210 return $this->isClosedPass($pass);
211
213
214 if (!$this->hasTestPassedOnce($this->getActiveId())) {
215 return false;
216 }
217
218 return $this->isClosedPass($pass);
219 }
220
221 return false;
222 }
223
225 {
226 if ($this->getLastFinishedPass() === null) {
227 throw new ilTestException('invalid object state: last finished pass was not set!');
228 }
229 }
230
231 private function isClosedPass($pass)
232 {
234
235 if ($pass <= $this->getLastFinishedPass()) {
236 return true;
237 }
238
239 if ($this->isProcessingTimeReached($pass)) {
240 return true;
241 }
242
243 return false;
244 }
245
246 private function isReportingDateReached()
247 {
248 $reg = '/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/';
249 $date = $this->testOBJ->getReportingDate();
250 $matches = null;
251
252 if (!preg_match($reg, $date, $matches)) {
253 return false;
254 }
255
256 $repTS = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
257
258 return time() >= $repTS;
259 }
260
262 {
263 if (!$this->testOBJ->getEnableProcessingTime()) {
264 return false;
265 }
266
267 $startingTime = $this->testOBJ->getStartingTimeOfUser($this->getActiveId(), $pass);
268
269 if ($startingTime === false) {
270 return false;
271 }
272
273 return $this->testOBJ->isMaxProcessingTimeReached($startingTime, $this->getActiveId());
274 }
275
280 {
281 if ($this->getLastFinishedPass() === null) {
282 return null;
283 }
284
285 $passes = $this->getLazyLoadedPasses();
286 return $passes[$this->getLastFinishedPass()]['tstamp'];
287 }
288
290 {
291 global $DIC; /* @var ILIAS\DI\Container $DIC */
292
293 if (!isset($this->testPassedOnceCache[$activeId])) {
294 $this->testPassedOnceCache[$activeId] = false;
295
296 $res = $DIC->database()->queryF(
297 "SELECT passed_once FROM tst_result_cache WHERE active_fi = %s",
298 array('integer'),
299 array($activeId)
300 );
301
302 while ($row = $DIC->database()->fetchAssoc($res)) {
303 $this->testPassedOnceCache[$activeId] = (bool) $row['passed_once'];
304 }
305 }
306
307 return $this->testPassedOnceCache[$activeId];
308 }
309}
An exception for terminatinating execution or to throw for unit testing.
const SCORE_REPORTING_IMMIDIATLY
const SCORE_REPORTING_FINISHED
const SCORE_REPORTING_AFTER_PASSED
const SCORE_REPORTING_DATE
Base Exception for all Exceptions relating to Modules/Test.
__construct(ilDBInterface $db, ilObjTest $testOBJ)
setLastFinishedPass($lastFinishedPass)
global $DIC
Definition: goto.php:24
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$query
foreach($_POST as $key=> $value) $res