ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilAssQuestionHintTracking.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 require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintList.php';
5 
15 {
16  private $questionId;
17 
18  private $activeId;
19 
20  private $pass;
21 
23  {
24  $this->questionId = $questionId;
25  $this->activeId = $activeId;
26  $this->pass = $pass;
27  }
28 
29  public function setActiveId($activeId)
30  {
31  $this->activeId = $activeId;
32  }
33 
34  public function getActiveId()
35  {
36  return $this->activeId;
37  }
38 
39  public function setPass($pass)
40  {
41  $this->pass = $pass;
42  }
43 
44  public function getPass()
45  {
46  return $this->pass;
47  }
48 
49  public function setQuestionId($questionId)
50  {
51  $this->questionId = $questionId;
52  }
53 
54  public function getQuestionId()
55  {
56  return $this->questionId;
57  }
58 
67  public function requestsExist()
68  {
69  if( self::getNumExistingRequests($this->getQuestionId(), $this->getActiveId(), $this->getPass()) > 0 )
70  {
71  return true;
72  }
73 
74  return false;
75  }
76 
85  public function getNumExistingRequests()
86  {
87  global $ilDB;
88 
89  $query = "
90  SELECT COUNT(qhtr_track_id) cnt
91 
92  FROM qpl_hint_tracking
93 
94  WHERE qhtr_question_fi = %s
95  AND qhtr_active_fi = %s
96  AND qhtr_pass = %s
97  ";
98 
99  $res = $ilDB->queryF(
100  $query, array('integer', 'integer', 'integer'),
101  array($this->getQuestionId(), $this->getActiveId(), $this->getPass())
102  );
103 
104  $row = $ilDB->fetchAssoc($res);
105 
106  return $row['cnt'];
107  }
108 
117  public function requestsPossible()
118  {
119  global $ilDB;
120 
121  $query = "
122  SELECT COUNT(qht_hint_id) cnt_available,
123  COUNT(qhtr_track_id) cnt_requested
124 
125  FROM qpl_hints
126 
127  LEFT JOIN qpl_hint_tracking
128  ON qhtr_hint_fi = qht_hint_id
129  AND qhtr_active_fi = %s
130  AND qhtr_pass = %s
131 
132  WHERE qht_question_fi = %s
133  ";
134 
135  $res = $ilDB->queryF(
136  $query, array('integer', 'integer', 'integer'),
137  array($this->getActiveId(), $this->getPass(), $this->getQuestionId())
138  );
139 
140  $row = $ilDB->fetchAssoc($res);
141 
142  if( $row['cnt_available'] > $row['cnt_requested'] )
143  {
144  return true;
145  }
146 
147  return false;
148  }
149 
159  public function isRequested($hintId)
160  {
161  global $ilDB;
162 
163  $query = "
164  SELECT COUNT(qhtr_track_id) cnt
165 
166  FROM qpl_hint_tracking
167 
168  WHERE qhtr_hint_fi = %s
169  AND qhtr_active_fi = %s
170  AND qhtr_pass = %s
171  ";
172 
173  $res = $ilDB->queryF(
174  $query, array('integer', 'integer', 'integer'), array($hintId, $this->getActiveId(), $this->getPass())
175  );
176 
177  $row = $ilDB->fetchAssoc($res);
178 
179  if( $row['cnt'] > 0 )
180  {
181  return true;
182  }
183 
184  return false;
185  }
186 
196  public function getNextRequestableHint()
197  {
198  global $ilDB;
199 
200  $query = "
201  SELECT qht_hint_id
202 
203  FROM qpl_hints
204 
205  LEFT JOIN qpl_hint_tracking
206  ON qhtr_hint_fi = qht_hint_id
207  AND qhtr_active_fi = %s
208  AND qhtr_pass = %s
209 
210  WHERE qht_question_fi = %s
211  AND qhtr_track_id IS NULL
212 
213  ORDER BY qht_hint_index ASC
214  ";
215 
216  $ilDB->setLimit(1);
217 
218  $res = $ilDB->queryF(
219  $query, array('integer', 'integer', 'integer'),
220  array($this->getActiveId(), $this->getPass(), $this->getQuestionId())
221  );
222 
223  while( $row = $ilDB->fetchAssoc($res) )
224  {
225  $nextHint = ilAssQuestionHint::getInstanceById($row['qht_hint_id']);
226 
227  return $nextHint;
228  }
229 
230  require_once 'Modules/Test/exceptions/class.ilTestNoNextRequestableHintExistsException.php';
231 
233  "no next hint found for questionId={$this->getQuestionId()}, activeId={$this->getActiveId()}, pass={$this->getPass()}"
234  );
235  }
236 
246  public function getRequestedHintsList()
247  {
248  global $ilDB;
249 
250  $query = "
251  SELECT qhtr_hint_fi
252 
253  FROM qpl_hint_tracking
254 
255  WHERE qhtr_question_fi = %s
256  AND qhtr_active_fi = %s
257  AND qhtr_pass = %s
258  ";
259 
260  $res = $ilDB->queryF(
261  $query, array('integer', 'integer', 'integer'),
262  array($this->getQuestionId(), $this->getActiveId(), $this->getPass())
263  );
264 
265  $hintIds = array();
266 
267  while( $row = $ilDB->fetchAssoc($res) )
268  {
269  $hintIds[] = $row['qhtr_hint_fi'];
270  }
271 
272  $requestedHintsList = ilAssQuestionHintList::getListByHintIds($hintIds);
273 
274  return $requestedHintsList;
275  }
276 
285  public function storeRequest(ilAssQuestionHint $questionHint)
286  {
287  global $ilDB;
288 
289  $trackId = $ilDB->nextId('qpl_hint_tracking');
290 
291  $ilDB->insert('qpl_hint_tracking', array(
292  'qhtr_track_id' => array('integer', $trackId),
293  'qhtr_active_fi' => array('integer', $this->getActiveId()),
294  'qhtr_pass' => array('integer', $this->getPass()),
295  'qhtr_question_fi' => array('integer', $this->getQuestionId()),
296  'qhtr_hint_fi' => array('integer', $questionHint->getId()),
297  ));
298  }
299 
312  {
313  global $ilDB;
314 
315  $query = "
316  SELECT COUNT(qhtr_track_id) requests_count,
317  SUM(qht_hint_points) requests_points
318 
319  FROM qpl_hint_tracking
320 
321  INNER JOIN qpl_hints
322  ON qht_hint_id = qhtr_hint_fi
323 
324  WHERE qhtr_question_fi = %s
325  AND qhtr_active_fi = %s
326  AND qhtr_pass = %s
327  ";
328 
329  $res = $ilDB->queryF(
330  $query, array('integer', 'integer', 'integer'),
331  array($this->getQuestionId(), $this->getActiveId(), $this->getPass())
332  );
333 
334  $row = $ilDB->fetchAssoc($res);
335 
336  if( $row['requests_points'] === null )
337  {
338  $row['requests_points'] = 0;
339  }
340 
341  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestStatisticData.php';
342 
343  $requestsStatisticData = new ilAssQuestionHintRequestStatisticData();
344  $requestsStatisticData->setRequestsCount($row['requests_count']);
345  $requestsStatisticData->setRequestsPoints($row['requests_points']);
346 
347  return $requestsStatisticData;
348  }
349 
355  {
356  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestStatisticRegister.php';
357  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestStatisticData.php';
358 
359  /* @var ILIAS\DI\Container $DIC */ global $DIC; $db = $DIC->database();
360 
361  $query = "
362  SELECT qhtr_pass requests_pass,
363  qhtr_question_fi requests_question,
364  COUNT(qhtr_track_id) requests_count,
365  SUM(qht_hint_points) requests_points
366 
367  FROM qpl_hint_tracking
368 
369  INNER JOIN qpl_hints
370  ON qht_hint_id = qhtr_hint_fi
371 
372  WHERE qhtr_active_fi = %s
373 
374  GROUP BY qhtr_pass, qhtr_question_fi
375  ";
376 
377  $res = $db->queryF(
378  $query, array('integer'), array($activeId)
379  );
380 
382 
383  while( $row = $db->fetchAssoc($res) )
384  {
385  if( $row['requests_points'] === null )
386  {
387  $row['requests_points'] = 0;
388  }
389 
390  $requestsStatisticData = new ilAssQuestionHintRequestStatisticData();
391  $requestsStatisticData->setRequestsCount($row['requests_count']);
392  $requestsStatisticData->setRequestsPoints($row['requests_points']);
393 
394  $register->addRequestByTestPassIndexAndQuestionId($row['requests_pass'], $row['requests_question'], $requestsStatisticData);
395  }
396 
397  return $register;
398  }
399 
404  public static function deleteRequestsByQuestionIds($questionIds)
405  {
409  global $ilDB;
410 
411  $__question_fi__IN__questionIds = $ilDB->in('qhtr_question_fi', $questionIds, false, 'integer');
412 
413  $query = "
414  DELETE FROM qpl_hint_tracking
415  WHERE $__question_fi__IN__questionIds
416  ";
417 
418  $ilDB->manipulate($query);
419  }
420 
428  public static function deleteRequestsByActiveIds($activeIds)
429  {
430  global $ilDB;
431 
432  $__active_fi__IN__activeIds = $ilDB->in('qhtr_active_fi', $activeIds, false, 'integer');
433 
434  $query = "
435  DELETE FROM qpl_hint_tracking
436  WHERE $__active_fi__IN__activeIds
437  ";
438 
439  $ilDB->manipulate($query);
440  }
441 }
442 
getNumExistingRequests()
Returns the number existing hint requests for the given question relating to the given testactive and...
static getInstanceById($hintId)
creates a hint object instance, loads the persisted hint dataset identified by passed hint id from da...
getRequestedHintsList()
Returns an object of class ilAssQuestionHintList containing objects of class ilAssQuestionHint for al...
__construct($questionId, $activeId, $pass)
isRequested($hintId)
Returns the fact wether the hint for given id is requested for the given testactive and testpass...
getRequestStatisticDataByQuestionAndTestpass()
Returns a question hint request statistic data container containing the statistics for all requests r...
static getRequestRequestStatisticDataRegisterByActiveId($activeId)
requestsPossible()
Returns the fact wether (further) hint requests are possible for the given question relating to the g...
getId()
returns the hint id
getNextRequestableHint()
Returns the next requestable hint for given question relating to given testactive and testpass...
static getListByHintIds($hintIds)
instantiates a question hint list for the passed hint ids
storeRequest(ilAssQuestionHint $questionHint)
Tracks the given hint as requested for the given question, testactive and testpass.
Create styles array
The data for the language used.
global $ilDB
global $DIC
static deleteRequestsByActiveIds($activeIds)
Deletes all hint requests relating to a testactive included in given active ids.
requestsExist()
Returns the fact wether there exists hint requests for the given question relating to the given testa...