ILIAS  Release_4_2_x_branch Revision 61807
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilLPCollections.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
16 {
17  var $db = null;
18 
19  var $obj_id = null;
20  var $items = array();
21 
22  function ilLPCollections($a_obj_id)
23  {
24  global $ilObjDataCache,$ilDB;
25 
26  $this->db =& $ilDB;
27 
28  $this->obj_id = $a_obj_id;
29 
30  $this->__read();
31  }
32 
40  public function cloneCollections($a_target_id,$a_copy_id)
41  {
42  global $ilObjDataCache,$ilLog;
43 
44  $target_obj_id = $ilObjDataCache->lookupObjId($a_target_id);
45 
46  include_once('Services/CopyWizard/classes/class.ilCopyWizardOptions.php');
47  $cwo = ilCopyWizardOptions::_getInstance($a_copy_id);
48  $mappings = $cwo->getMappings();
49 
50  $new_collections = new ilLPCollections($target_obj_id);
51  foreach($this->items as $item)
52  {
53  if(!isset($mappings[$item]) or !$mappings[$item])
54  {
55  continue;
56  }
57  // @FIXME clone this and not add it
58  $new_collections->add($mappings[$item]);
59  $ilLog->write(__METHOD__.': Added learning progress collection.');
60  }
61  }
62 
63  function getObjId()
64  {
65  return (int) $this->obj_id;
66  }
67 
68  function getItems()
69  {
70  return $this->items;
71  }
72 
73  function isAssigned($a_ref_id)
74  {
75  return (bool) in_array($a_ref_id,$this->items);
76  }
77 
78  function add($item_id)
79  {
80  global $ilDB;
81 
82  $query = "SELECT * FROM ut_lp_collections ".
83  "WHERE obj_id = ".$ilDB->quote($this->getObjId(),'integer')." ".
84  "AND item_id = ".$ilDB->quote($item_id,'integer');
85  $res = $ilDB->query($query);
86  if($res->numRows())
87  {
88  return true;
89  }
90 
91  $query = "INSERT INTO ut_lp_collections (obj_id, item_id) ".
92  "VALUES( ".
93  $ilDB->quote($this->obj_id ,'integer').", ".
94  $ilDB->quote($item_id ,'integer').
95  ")";
96  $res = $ilDB->manipulate($query);
97 
98  $this->__read();
99 
100  return true;
101  }
102 
106  public static function deactivate($a_obj_id,array $a_item_ids)
107  {
108  global $ilDB;
109 
110  // Delete all non grouped items
111  $query = "DELETE FROM ut_lp_collections ".
112  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
113  "AND ".$ilDB->in('item_id', $a_item_ids, false, 'integer')." ".
114  "AND grouping_id = ".$ilDB->quote(0, 'integer');
115  $ilDB->manipulate($query);
116 
117  // Select all grouping ids and deactivate them
118  $query = "SELECT grouping_id FROM ut_lp_collections ".
119  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
120  "AND ".$ilDB->in('item_id', $a_item_ids, false, 'integer');
121  $res = $ilDB->query($query);
122 
123  $grouping_ids = array();
124  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
125  {
126  $grouping_ids[] = $row->grouping_id;
127  }
128 
129  $query = "UPDATE ut_lp_collections ".
130  "SET active = ".$ilDB->quote(0,'integer')." ".
131  "WHERE ".$ilDB->in('grouping_id', $grouping_ids, false, 'integer');
132  $ilDB->manipulate($query);
133  return;
134  }
135 
141  public static function activate($a_obj_id,array $a_item_ids)
142  {
143  global $ilDB;
144 
145  // Add missing entries
146  $sql = "SELECT item_id FROM ut_lp_collections ".
147  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
148  "AND ".$ilDB->in('item_id', $a_item_ids, false, 'integer');
149  $res = $ilDB->query($sql);
150 
151  $items_existing = array();
152  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
153  {
154  $items_existing[] = $row->item_id;
155  }
156 
157  $items_not_existing = array_diff($a_item_ids, $items_existing);
158  foreach($items_not_existing as $item)
159  {
160  $query = "INSERT INTO ut_lp_collections (obj_id,item_id,grouping_id,num_obligatory,active ) ".
161  "VALUES( ".
162  $ilDB->quote($a_obj_id,'integer').", ".
163  $ilDB->quote($item,'integer').", ".
164  $ilDB->quote(0,'integer').", ".
165  $ilDB->quote(0,'integer').", ".
166  $ilDB->quote(1,'integer')." ".
167  ")";
168  $ilDB->manipulate($query);
169  }
170  // Select all grouping ids and activate them
171  $query = "SELECT grouping_id FROM ut_lp_collections ".
172  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
173  "AND ".$ilDB->in('item_id', $a_item_ids, false, 'integer')." ".
174  "AND grouping_id > ".$ilDB->quote(0,'integer')." ";
175  $res = $ilDB->query($query);
176 
177  $grouping_ids = array();
178  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
179  {
180  $grouping_ids[] = $row->grouping_id;
181  }
182 
183  $query = "UPDATE ut_lp_collections ".
184  "SET active = ".$ilDB->quote(1,'integer')." ".
185  "WHERE ".$ilDB->in('grouping_id', $grouping_ids, false, 'integer');
186  $ilDB->manipulate($query);
187  return;
188  }
189 
194  public static function createNewGrouping($a_obj_id, array $a_ids)
195  {
196  global $ilDB;
197 
198  // Activate each of this items
199  self::activate($a_obj_id, $a_ids);
200 
201  // read all grouping ids and their item_ids
202  $query = "SELECT DISTINCT(grouping_id) grp_id FROM ut_lp_collections ".
203  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
204  "AND ".$ilDB->in('item_id', $a_ids, false, 'integer')." ".
205  "AND grouping_id != 0 ";
206  $res = $ilDB->query($query);
207 
208  $grp_ids = array();
209  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
210  {
211  $grp_ids[] = $row->grp_id;
212  }
213 
214  $query = "SELECT item_id FROM ut_lp_collections ".
215  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
216  "AND ".$ilDB->in('grouping_id', $grp_ids, false, 'integer');
217  $res = $ilDB->query($query);
218 
219  $all_item_ids = array();
220  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
221  {
222  $all_item_ids[] = $row->item_id;
223  }
224 
225  $all_item_ids = array_unique(array_merge($all_item_ids,$a_ids));
226 
227  // release grouping
228  self::releaseGrouping($a_obj_id,$a_ids);
229 
230  // Create new grouping
231  $query = "SELECT MAX(grouping_id) grp FROM ut_lp_collections ".
232  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
233  "GROUP BY obj_id ";
234  $res = $ilDB->query($query);
235 
236  $grp_id = 0;
237  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
238  {
239  $grp_id = $row->grp;
240  }
241  ++$grp_id;
242 
243  $query = "UPDATE ut_lp_collections SET ".
244  "grouping_id = ".$ilDB->quote($grp_id,'integer').", ".
245  "num_obligatory = 1, ".
246  "active = ".$ilDB->quote(1,'integer')." ".
247  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
248  "AND ".$ilDB->in('item_id',$all_item_ids,false,'integer');
249  $ilDB->manipulate($query);
250 
251  return;
252  }
253 
260  public static function saveObligatoryMaterials($a_obj_id, array $a_obl)
261  {
262  global $ilDB;
263 
264  foreach($a_obl as $grouping_id => $num)
265  {
266  $query = "SELECT count(obj_id) num FROM ut_lp_collections ".
267  'WHERE obj_id = '.$ilDB->quote($a_obj_id,'integer').' '.
268  'AND grouping_id = '.$ilDB->quote($grouping_id,'integer').' '.
269  'GROUP BY obj_id';
270  $res = $ilDB->query($query);
271  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
272  {
273  if($num <= 0 or $num >= $row->num)
274  {
275  throw new UnexpectedValueException();
276  }
277  }
278  }
279  foreach($a_obl as $grouping_id => $num)
280  {
281  $query = 'UPDATE ut_lp_collections '.
282  'SET num_obligatory = '.$ilDB->quote($num, 'integer').' '.
283  'WHERE obj_id = '.$ilDB->quote($a_obj_id,'integer').' '.
284  'AND grouping_id = '.$ilDB->quote($grouping_id,'integer');
285  $ilDB->manipulate($query);
286  }
287  }
288 
294  public static function releaseGrouping($a_obj_id, array $a_ids)
295  {
296  global $ilDB;
297 
298  $query = "SELECT grouping_id FROM ut_lp_collections ".
299  "WHERE obj_id = " . $ilDB->quote($a_obj_id, 'integer') . " " .
300  "AND ".$ilDB->in('item_id', $a_ids, false, 'integer')." ".
301  "AND grouping_id > 0 ";
302  $res = $ilDB->query($query);
303 
304  $grp_ids = array();
305  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
306  {
307  $grp_ids[] = $row->grouping_id;
308  }
309 
310  $query = "UPDATE ut_lp_collections ".
311  "SET grouping_id = ".$ilDB->quote(0,'integer').", ".
312  "num_obligatory = 0 ".
313  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
314  "AND " . $ilDB->in('grouping_id', $grp_ids, false, 'integer');
315  $ilDB->manipulate($query);
316  return true;
317  }
318 
319 
320 
321 
328  public static function hasGroupedItems($a_obj_id)
329  {
330  global $ilDB;
331 
332  $query = "SELECT item_id FROM ut_lp_collections ".
333  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
334  "AND grouping_id > 0 ";
335  $res = $ilDB->query($query);
336  return $res->numRows() ? true : false;
337  }
338 
346  public static function lookupGroupedItems($a_obj_id,$item_id)
347  {
348  global $ilDB;
349 
350  $query = "SELECT grouping_id FROM ut_lp_collections ".
351  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
352  "AND item_id = ".$ilDB->quote($item_id,'integer');
353  $res = $ilDB->query($query);
354  $row = $res->fetchRow(DB_FETCHMODE_OBJECT);
355  $grouping_id = $row->grouping_id;
356 
357  if($grouping_id == 0)
358  {
359  return array();
360  }
361 
362  $query = "SELECT item_id, num_obligatory FROM ut_lp_collections ".
363  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
364  "AND grouping_id = ".$ilDB->quote($grouping_id,'integer');
365  $res = $ilDB->query($query);
366 
367  $items = array();
368  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
369  {
370  $items['items'][] = $row->item_id;
371  $items['num_obligatory'] = $row->num_obligatory;
372  $items['grouping_id'] = $grouping_id;
373  }
374  return $items;
375  }
376 
377  function delete($item_id)
378  {
379  global $ilDB;
380 
381  $query = "DELETE FROM ut_lp_collections ".
382  "WHERE item_id = ".$ilDB->quote($item_id ,'integer')." ".
383  "AND obj_id = ".$ilDB->quote($this->obj_id ,'integer')." ";
384  $res = $ilDB->manipulate($query);
385 
386  $this->__read();
387 
388  return true;
389  }
390 
391 
392  // Static
393  public static function _getPossibleItems($a_target_id)
394  {
395  global $tree;
396 
397  if($tree->isDeleted($a_target_id))
398  {
399  return array();
400  }
401 
402  $node_data = $tree->getNodeData($a_target_id);
403  foreach($tree->getSubTree($node_data) as $node)
404  {
405  // avoid recursion
406  if($node['ref_id'] == $a_target_id)
407  {
408  continue;
409  }
410 
411  switch($node['type'])
412  {
413  case 'sess':
414  case 'exc':
415  case 'fold':
416  case 'grp':
417  case 'sahs':
418  case 'lm':
419  case 'tst':
420  case 'htlm':
421  $all_possible[] = $node['ref_id'];
422  break;
423  }
424  }
425 
426  return $all_possible ? $all_possible : array();
427  }
428 
429  public static function _getCountPossibleItems($a_target_id)
430  {
431  return count(ilLPCollections::_getPossibleItems($a_target_id));
432  }
433 
434  function _getCountPossibleSAHSItems($a_target_id)
435  {
436  return count(ilLPCollections::_getPossibleSAHSItems($a_target_id));
437  }
438 
439 
445  {
446  include_once './Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php';
447 
449  {
450  case 'hacp':
451  case 'aicc':
452  include_once './Modules/ScormAicc/classes/class.ilObjAICCLearningModule.php';
453 
455  {
456  $items["$item[obj_id]"]['title'] = $item['title'];
457  #$items[$item->getId()]['title'] = $item->getTitle();
458  }
459  return $items ? $items : array();
460 
461  case 'scorm':
462  include_once './Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php';
463  include_once './Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php';
464 
466  {
467  $items[$item->getId()]['title'] = $item->getTitle();
468  }
469  return $items ? $items : array();
470 
471  case 'scorm2004':
472  include_once './Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php';
473 
475  {
476  $items[$item["id"]]['title'] = $item["title"];
477  }
478  return $items ? $items : array();
479  }
480  return array();
481  }
482 
483  function deleteAll()
484  {
485  return ilLPCollections::_deleteAll($this->getObjId());
486  }
487 
488 
489  public static function _deleteAll($a_obj_id)
490  {
491  global $ilDB;
492 
493  $query = "DELETE FROM ut_lp_collections ".
494  "WHERE obj_id = ".$ilDB->quote($a_obj_id ,'integer')."";
495  $res = $ilDB->manipulate($query);
496 
497  return true;
498  }
499 
505  public static function getGroupedItems($a_obj_id, $a_use_subtree_by_id = false)
506  {
507  global $ilDB;
508 
509  $items = self::_getItems($a_obj_id, $a_use_subtree_by_id);
510 
511  $query = "SELECT * FROM ut_lp_collections ".
512  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
513  "AND active = 1";
514  $res = $ilDB->query($query);
515 
516  $grouped = array();
517  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
518  {
519  if(in_array($row->item_id,$items))
520  {
521  $grouped[$row->grouping_id]['items'][] = $row->item_id;
522  $grouped[$row->grouping_id]['num_obligatory'] = $row->num_obligatory;
523  }
524  }
525  return $grouped;
526  }
527 
528  function &_getItems($a_obj_id, $a_use_subtree_by_id = false)
529  {
530  global $ilObjDataCache;
531  global $ilDB, $tree;
532 
533  include_once 'Services/Tracking/classes/class.ilLPObjSettings.php';
534 
535  $mode = ilLPObjSettings::_lookupMode($a_obj_id);
536  if($mode == LP_MODE_OBJECTIVES)
537  {
538  include_once 'Modules/Course/classes/class.ilCourseObjective.php';
539  return ilCourseObjective::_getObjectiveIds($a_obj_id);
540  }
541  if($mode != LP_MODE_SCORM and $mode != LP_MODE_COLLECTION and $mode != LP_MODE_MANUAL_BY_TUTOR)
542  {
543  return array();
544  }
545 
546  if($ilObjDataCache->lookupType($a_obj_id) != 'sahs')
547  {
548  $course_ref_ids = ilObject::_getAllReferences($a_obj_id);
549  $course_ref_id = end($course_ref_ids);
550  if (!$a_use_subtree_by_id)
551  {
552  $possible_items = ilLPCollections::_getPossibleItems($course_ref_id);
553  }
554  else
555  {
556  $possible_items = $tree->getSubTreeIds($course_ref_id);
557  }
558 
559  $query = "SELECT * FROM ut_lp_collections utc ".
560  "JOIN object_reference obr ON item_id = ref_id ".
561  "JOIN object_data obd ON obr.obj_id = obd.obj_id ".
562  "WHERE utc.obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
563  "AND active = ".$ilDB->quote(1,'integer')." ".
564  "ORDER BY title";
565  }
566  else
567  {
568  // SAHS
569  $query = "SELECT * FROM ut_lp_collections WHERE obj_id = ".$ilDB->quote($a_obj_id ,'integer')." ".
570  "AND active = ".$ilDB->quote(1,'integer');
571  }
572 
573  $res = $ilDB->query($query);
574  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
575  {
576  if($ilObjDataCache->lookupType($a_obj_id) != 'sahs')
577  {
578  if(!in_array($row->item_id,$possible_items))
579  {
580  ilLPCollections::__deleteEntry($a_obj_id,$row->item_id);
581  continue;
582  }
583  }
584  // Check anonymized
585  if($ilObjDataCache->lookupType($item_obj_id = $ilObjDataCache->lookupObjId($row->item_id)) == 'tst')
586  {
587  include_once './Modules/Test/classes/class.ilObjTest.php';
588  if(ilObjTest::_lookupAnonymity($item_obj_id))
589  {
590  ilLPCollections::__deleteEntry($a_obj_id,$row->item_id);
591  continue;
592  }
593  }
594  $items[] = $row->item_id;
595  }
596  return $items ? $items : array();
597  }
598 
599  // Private
600  function __deleteEntry($a_obj_id,$a_item_id)
601  {
602  global $ilDB;
603 
604  $query = "DELETE FROM ut_lp_collections ".
605  "WHERE obj_id = ".$ilDB->quote($a_obj_id ,'integer')." ".
606  "AND item_id = ".$ilDB->quote($a_item_id ,'integer')." ";
607  $res = $ilDB->manipulate($query);
608  return true;
609  }
610 
611 
612  function __read()
613  {
614  global $ilObjDataCache, $ilDB;
615 
616  $this->items = array();
617 
618  if($ilObjDataCache->lookupType($this->getObjId()) != 'sahs')
619  {
620  $course_ref_ids = ilObject::_getAllReferences($this->getObjId());
621  $course_ref_id = end($course_ref_ids);
622  $query = "SELECT * FROM ut_lp_collections utc ".
623  "JOIN object_reference obr ON item_id = ref_id ".
624  "JOIN object_data obd ON obr.obj_id = obd.obj_id ".
625  "WHERE utc.obj_id = ".$this->db->quote($this->obj_id,'integer')." ".
626  "AND active = ".$ilDB->quote(1,'integer')." ".
627  "ORDER BY title";
628  }
629  else
630  {
631  $query = "SELECT * FROM ut_lp_collections WHERE obj_id = ".$ilDB->quote($this->getObjId() ,'integer')." ".
632  "AND active = ".$ilDB->quote(1,'integer');
633  }
634  $res = $this->db->query($query);
635  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
636  {
637  if($ilObjDataCache->lookupType($this->getObjId()) != 'sahs')
638  {
639  if(!in_array($row->item_id,ilLPCollections::_getPossibleItems($course_ref_id)))
640  {
641  $this->__deleteEntry($this->getObjId(),$row->item_id);
642  continue;
643  }
644  }
645  // Check anonymized
646  if($ilObjDataCache->lookupType($item_obj_id = $ilObjDataCache->lookupObjId($row->item_id)) == 'tst')
647  {
648  include_once './Modules/Test/classes/class.ilObjTest.php';
649  if(ilObjTest::_lookupAnonymity($item_obj_id))
650  {
651  $this->__deleteEntry($this->getObjId(),$row->item_id);
652  continue;
653  }
654  }
655  $this->items[] = $row->item_id;
656  }
657 
658  }
659 
660  function _getScoresForUserAndCP_Node_Id ($target_id, $item_id, $user_id)
661  {
662  include_once './Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php';
663 
665  {
666  case 'hacp':
667  case 'aicc':
668  include_once './Modules/ScormAicc/classes/class.ilObjAICCLearningModule.php';
669  return ilObjAICCLearningModule::_getScoresForUser($item_id, $user_id);
670 
671  case 'scorm':
672  include_once './Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php';
673  //include_once './Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php';
674  return ilObjSCORMLearningModule::_getScoresForUser($item_id, $user_id);
675 
676  case 'scorm2004':
677  include_once './Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php';
678  return ilObjSCORM2004LearningModule::_getScores2004ForUser($item_id, $user_id);
679  }
680  return array("raw" => null, "max" => null, "scaled" => null);
681  }
682 
683 }
684 ?>