ILIAS  release_4-3 Revision
 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  "AND obj_id = ".$ilDB->quote($a_obj_id,'integer');
133  $ilDB->manipulate($query);
134  return;
135  }
136 
142  public static function activate($a_obj_id,array $a_item_ids)
143  {
144  global $ilDB;
145 
146  // Add missing entries
147  $sql = "SELECT item_id,active FROM ut_lp_collections ".
148  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
149  "AND ".$ilDB->in('item_id', $a_item_ids, false, 'integer');
150  $res = $ilDB->query($sql);
151 
152  $items_existing = $remove_existing = array();
153  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
154  {
155  if($row->active)
156  {
157  $items_existing[] = $row->item_id;
158  }
159  else
160  {
161  $remove_existing[] = $row->item_id;
162  }
163  }
164 
165  // #13278 - because of grouping inactive items may exist
166  if(sizeof($remove_existing))
167  {
168  $ilDB->manipulate("DELETE FROM ut_lp_collections".
169  " WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer').
170  " AND ".$ilDB->in("item_id", $remove_existing, "", "integer"));
171  }
172 
173  $items_not_existing = array_diff($a_item_ids, $items_existing);
174  foreach($items_not_existing as $item)
175  {
176  $query = "INSERT INTO ut_lp_collections (obj_id,item_id,grouping_id,num_obligatory,active ) ".
177  "VALUES( ".
178  $ilDB->quote($a_obj_id,'integer').", ".
179  $ilDB->quote($item,'integer').", ".
180  $ilDB->quote(0,'integer').", ".
181  $ilDB->quote(0,'integer').", ".
182  $ilDB->quote(1,'integer')." ".
183  ")";
184  $ilDB->manipulate($query);
185  }
186  // Select all grouping ids and activate them
187  $query = "SELECT grouping_id FROM ut_lp_collections ".
188  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
189  "AND ".$ilDB->in('item_id', $a_item_ids, false, 'integer')." ".
190  "AND grouping_id > ".$ilDB->quote(0,'integer')." ";
191  $res = $ilDB->query($query);
192 
193  $grouping_ids = array();
194  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
195  {
196  $grouping_ids[] = $row->grouping_id;
197  }
198 
199  $query = "UPDATE ut_lp_collections ".
200  "SET active = ".$ilDB->quote(1,'integer')." ".
201  "WHERE ".$ilDB->in('grouping_id', $grouping_ids, false, 'integer')." ".
202  "AND obj_id = ".$ilDB->quote($a_obj_id,'integer');
203  $ilDB->manipulate($query);
204  return;
205  }
206 
211  public static function createNewGrouping($a_obj_id, array $a_ids)
212  {
213  global $ilDB;
214 
215  // Activate each of this items
216  self::activate($a_obj_id, $a_ids);
217 
218  // read all grouping ids and their item_ids
219  $query = "SELECT DISTINCT(grouping_id) grp_id FROM ut_lp_collections ".
220  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
221  "AND ".$ilDB->in('item_id', $a_ids, false, 'integer')." ".
222  "AND grouping_id != 0 ";
223  $res = $ilDB->query($query);
224 
225  $grp_ids = array();
226  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
227  {
228  $grp_ids[] = $row->grp_id;
229  }
230 
231  $query = "SELECT item_id FROM ut_lp_collections ".
232  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
233  "AND ".$ilDB->in('grouping_id', $grp_ids, false, 'integer');
234  $res = $ilDB->query($query);
235 
236  $all_item_ids = array();
237  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
238  {
239  $all_item_ids[] = $row->item_id;
240  }
241 
242  $all_item_ids = array_unique(array_merge($all_item_ids,$a_ids));
243 
244  // release grouping
245  self::releaseGrouping($a_obj_id,$a_ids);
246 
247  // Create new grouping
248  $query = "SELECT MAX(grouping_id) grp FROM ut_lp_collections ".
249  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
250  "GROUP BY obj_id ";
251  $res = $ilDB->query($query);
252 
253  $grp_id = 0;
254  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
255  {
256  $grp_id = $row->grp;
257  }
258  ++$grp_id;
259 
260  $query = "UPDATE ut_lp_collections SET ".
261  "grouping_id = ".$ilDB->quote($grp_id,'integer').", ".
262  "num_obligatory = 1, ".
263  "active = ".$ilDB->quote(1,'integer')." ".
264  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
265  "AND ".$ilDB->in('item_id',$all_item_ids,false,'integer');
266  $ilDB->manipulate($query);
267 
268  return;
269  }
270 
277  public static function saveObligatoryMaterials($a_obj_id, array $a_obl)
278  {
279  global $ilDB;
280 
281  foreach($a_obl as $grouping_id => $num)
282  {
283  $query = "SELECT count(obj_id) num FROM ut_lp_collections ".
284  'WHERE obj_id = '.$ilDB->quote($a_obj_id,'integer').' '.
285  'AND grouping_id = '.$ilDB->quote($grouping_id,'integer').' '.
286  'GROUP BY obj_id';
287  $res = $ilDB->query($query);
288  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
289  {
290  if($num <= 0 or $num >= $row->num)
291  {
292  throw new UnexpectedValueException();
293  }
294  }
295  }
296  foreach($a_obl as $grouping_id => $num)
297  {
298  $query = 'UPDATE ut_lp_collections '.
299  'SET num_obligatory = '.$ilDB->quote($num, 'integer').' '.
300  'WHERE obj_id = '.$ilDB->quote($a_obj_id,'integer').' '.
301  'AND grouping_id = '.$ilDB->quote($grouping_id,'integer');
302  $ilDB->manipulate($query);
303  }
304  }
305 
311  public static function releaseGrouping($a_obj_id, array $a_ids)
312  {
313  global $ilDB;
314 
315  $query = "SELECT grouping_id FROM ut_lp_collections ".
316  "WHERE obj_id = " . $ilDB->quote($a_obj_id, 'integer') . " " .
317  "AND ".$ilDB->in('item_id', $a_ids, false, 'integer')." ".
318  "AND grouping_id > 0 ";
319  $res = $ilDB->query($query);
320 
321  $grp_ids = array();
322  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
323  {
324  $grp_ids[] = $row->grouping_id;
325  }
326 
327  $query = "UPDATE ut_lp_collections ".
328  "SET grouping_id = ".$ilDB->quote(0,'integer').", ".
329  "num_obligatory = 0 ".
330  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
331  "AND " . $ilDB->in('grouping_id', $grp_ids, false, 'integer');
332  $ilDB->manipulate($query);
333  return true;
334  }
335 
336 
337 
338 
345  public static function hasGroupedItems($a_obj_id)
346  {
347  global $ilDB;
348 
349  $query = "SELECT item_id FROM ut_lp_collections ".
350  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
351  "AND grouping_id > 0 ";
352  $res = $ilDB->query($query);
353  return $res->numRows() ? true : false;
354  }
355 
363  public static function lookupGroupedItems($a_obj_id,$item_id)
364  {
365  global $ilDB;
366 
367  $query = "SELECT grouping_id FROM ut_lp_collections ".
368  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
369  "AND item_id = ".$ilDB->quote($item_id,'integer');
370  $res = $ilDB->query($query);
371  $row = $res->fetchRow(DB_FETCHMODE_OBJECT);
372  $grouping_id = $row->grouping_id;
373 
374  if($grouping_id == 0)
375  {
376  return array();
377  }
378 
379  $query = "SELECT item_id, num_obligatory FROM ut_lp_collections ".
380  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
381  "AND grouping_id = ".$ilDB->quote($grouping_id,'integer');
382  $res = $ilDB->query($query);
383 
384  $items = array();
385  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
386  {
387  $items['items'][] = $row->item_id;
388  $items['num_obligatory'] = $row->num_obligatory;
389  $items['grouping_id'] = $grouping_id;
390  }
391  return $items;
392  }
393 
394  function delete($item_id)
395  {
396  global $ilDB;
397 
398  $query = "DELETE FROM ut_lp_collections ".
399  "WHERE item_id = ".$ilDB->quote($item_id ,'integer')." ".
400  "AND obj_id = ".$ilDB->quote($this->obj_id ,'integer')." ";
401  $res = $ilDB->manipulate($query);
402 
403  $this->__read();
404 
405  return true;
406  }
407 
408 
409  // Static
410  public static function _getPossibleItems($a_target_id, $a_collection = null)
411  {
412  global $tree;
413 
414  if($tree->isDeleted($a_target_id))
415  {
416  return array();
417  }
418 
419  include_once 'Services/Repository/classes/class.ilRepositoryObjectPluginSlot.php';
420  $plugin_types = array();
421 
422  $node_data = $tree->getNodeData($a_target_id);
423  foreach($tree->getSubTree($node_data) as $node)
424  {
425  // avoid recursion
426  if($node['ref_id'] == $a_target_id)
427  {
428  continue;
429  }
430 
431  switch($node['type'])
432  {
433  case 'sess':
434  case 'exc':
435  case 'fold':
436  case 'grp':
437  case 'sahs':
438  case 'lm':
439  case 'tst':
440  case 'htlm':
441  $all_possible[] = $node['ref_id'];
442  break;
443 
444  default:
445  // repository plugin object?
446  $only_active = false;
447  if($a_collection && !$a_collection->isAssigned($node['ref_id']))
448  {
449  $only_active = true;
450  }
451  if(ilRepositoryObjectPluginSlot::isTypePluginWithLP($node['type'], $only_active))
452  {
453  $all_possible[] = $node['ref_id'];
454  }
455  break;
456  }
457  }
458 
459  return $all_possible ? $all_possible : array();
460  }
461 
462  public static function _getCountPossibleItems($a_target_id)
463  {
464  return count(ilLPCollections::_getPossibleItems($a_target_id));
465  }
466 
467  function _getCountPossibleSAHSItems($a_target_id)
468  {
469  return count(ilLPCollections::_getPossibleSAHSItems($a_target_id));
470  }
471 
472 
478  {
479  include_once './Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php';
480 
482  {
483  case 'hacp':
484  case 'aicc':
485  include_once './Modules/ScormAicc/classes/class.ilObjAICCLearningModule.php';
486 
488  {
489  $items["$item[obj_id]"]['title'] = $item['title'];
490  #$items[$item->getId()]['title'] = $item->getTitle();
491  }
492  return $items ? $items : array();
493 
494  case 'scorm':
495  include_once './Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php';
496  include_once './Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php';
497 
499  {
500  $items[$item->getId()]['title'] = $item->getTitle();
501  }
502  return $items ? $items : array();
503 
504  case 'scorm2004':
505  include_once './Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php';
506 
508  {
509  $items[$item["id"]]['title'] = $item["title"];
510  }
511  return $items ? $items : array();
512  }
513  return array();
514  }
515 
516  function deleteAll()
517  {
518  return ilLPCollections::_deleteAll($this->getObjId());
519  }
520 
521 
522  public static function _deleteAll($a_obj_id)
523  {
524  global $ilDB;
525 
526  $query = "DELETE FROM ut_lp_collections ".
527  "WHERE obj_id = ".$ilDB->quote($a_obj_id ,'integer')."";
528  $res = $ilDB->manipulate($query);
529 
530  return true;
531  }
532 
538  public static function getGroupedItems($a_obj_id, $a_use_subtree_by_id = false)
539  {
540  global $ilDB;
541 
542  $items = self::_getItems($a_obj_id, $a_use_subtree_by_id);
543 
544  $query = "SELECT * FROM ut_lp_collections ".
545  "WHERE obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
546  "AND active = 1";
547  $res = $ilDB->query($query);
548 
549  $grouped = array();
550  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
551  {
552  if(in_array($row->item_id,$items))
553  {
554  $grouped[$row->grouping_id]['items'][] = $row->item_id;
555  $grouped[$row->grouping_id]['num_obligatory'] = $row->num_obligatory;
556  }
557  }
558  return $grouped;
559  }
560 
561  function &_getItems($a_obj_id, $a_use_subtree_by_id = false)
562  {
563  global $ilObjDataCache;
564  global $ilDB, $tree;
565 
566  include_once 'Services/Tracking/classes/class.ilLPObjSettings.php';
567 
568  $mode = ilLPObjSettings::_lookupMode($a_obj_id);
569  if($mode == LP_MODE_OBJECTIVES)
570  {
571  include_once 'Modules/Course/classes/class.ilCourseObjective.php';
572  return ilCourseObjective::_getObjectiveIds($a_obj_id);
573  }
574  if($mode != LP_MODE_SCORM and $mode != LP_MODE_COLLECTION and $mode != LP_MODE_MANUAL_BY_TUTOR)
575  {
576  return array();
577  }
578 
579  if($ilObjDataCache->lookupType($a_obj_id) != 'sahs')
580  {
581  $course_ref_ids = ilObject::_getAllReferences($a_obj_id);
582  $course_ref_id = end($course_ref_ids);
583  if (!$a_use_subtree_by_id)
584  {
585  $possible_items = ilLPCollections::_getPossibleItems($course_ref_id);
586  }
587  else
588  {
589  $possible_items = $tree->getSubTreeIds($course_ref_id);
590  }
591 
592  $query = "SELECT * FROM ut_lp_collections utc ".
593  "JOIN object_reference obr ON item_id = ref_id ".
594  "JOIN object_data obd ON obr.obj_id = obd.obj_id ".
595  "WHERE utc.obj_id = ".$ilDB->quote($a_obj_id,'integer')." ".
596  "AND active = ".$ilDB->quote(1,'integer')." ".
597  "ORDER BY title";
598  }
599  else
600  {
601  // SAHS
602  $query = "SELECT * FROM ut_lp_collections WHERE obj_id = ".$ilDB->quote($a_obj_id ,'integer')." ".
603  "AND active = ".$ilDB->quote(1,'integer');
604  }
605 
606  $res = $ilDB->query($query);
607  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
608  {
609  if($ilObjDataCache->lookupType($a_obj_id) != 'sahs')
610  {
611  if(!in_array($row->item_id,$possible_items))
612  {
613  ilLPCollections::__deleteEntry($a_obj_id,$row->item_id);
614  continue;
615  }
616  }
617  // Check anonymized
618  if($ilObjDataCache->lookupType($item_obj_id = $ilObjDataCache->lookupObjId($row->item_id)) == 'tst')
619  {
620  include_once './Modules/Test/classes/class.ilObjTest.php';
621  if(ilObjTest::_lookupAnonymity($item_obj_id))
622  {
623  ilLPCollections::__deleteEntry($a_obj_id,$row->item_id);
624  continue;
625  }
626  }
627  $items[] = $row->item_id;
628  }
629  return $items ? $items : array();
630  }
631 
632  // Private
633  function __deleteEntry($a_obj_id,$a_item_id)
634  {
635  global $ilDB;
636 
637  $query = "DELETE FROM ut_lp_collections ".
638  "WHERE obj_id = ".$ilDB->quote($a_obj_id ,'integer')." ".
639  "AND item_id = ".$ilDB->quote($a_item_id ,'integer')." ";
640  $res = $ilDB->manipulate($query);
641  return true;
642  }
643 
644 
645  function __read()
646  {
647  global $ilObjDataCache, $ilDB;
648 
649  $this->items = array();
650 
651  if($ilObjDataCache->lookupType($this->getObjId()) != 'sahs')
652  {
653  $course_ref_ids = ilObject::_getAllReferences($this->getObjId());
654  $course_ref_id = end($course_ref_ids);
655  $query = "SELECT * FROM ut_lp_collections utc ".
656  "JOIN object_reference obr ON item_id = ref_id ".
657  "JOIN object_data obd ON obr.obj_id = obd.obj_id ".
658  "WHERE utc.obj_id = ".$this->db->quote($this->obj_id,'integer')." ".
659  "AND active = ".$ilDB->quote(1,'integer')." ".
660  "ORDER BY title";
661  }
662  else
663  {
664  $query = "SELECT * FROM ut_lp_collections WHERE obj_id = ".$ilDB->quote($this->getObjId() ,'integer')." ".
665  "AND active = ".$ilDB->quote(1,'integer');
666  }
667  $res = $this->db->query($query);
668  while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
669  {
670  if($ilObjDataCache->lookupType($this->getObjId()) != 'sahs')
671  {
672  if(!in_array($row->item_id,ilLPCollections::_getPossibleItems($course_ref_id)))
673  {
674  $this->__deleteEntry($this->getObjId(),$row->item_id);
675  continue;
676  }
677  }
678  // Check anonymized
679  if($ilObjDataCache->lookupType($item_obj_id = $ilObjDataCache->lookupObjId($row->item_id)) == 'tst')
680  {
681  include_once './Modules/Test/classes/class.ilObjTest.php';
682  if(ilObjTest::_lookupAnonymity($item_obj_id))
683  {
684  $this->__deleteEntry($this->getObjId(),$row->item_id);
685  continue;
686  }
687  }
688  $this->items[] = $row->item_id;
689  }
690 
691  }
692 
693  function _getScoresForUserAndCP_Node_Id ($target_id, $item_id, $user_id)
694  {
695  include_once './Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php';
696 
698  {
699  case 'hacp':
700  case 'aicc':
701  include_once './Modules/ScormAicc/classes/class.ilObjAICCLearningModule.php';
702  return ilObjAICCLearningModule::_getScoresForUser($item_id, $user_id);
703 
704  case 'scorm':
705  include_once './Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php';
706  //include_once './Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php';
707  return ilObjSCORMLearningModule::_getScoresForUser($item_id, $user_id);
708 
709  case 'scorm2004':
710  include_once './Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php';
711  return ilObjSCORM2004LearningModule::_getScores2004ForUser($item_id, $user_id);
712  }
713  return array("raw" => null, "max" => null, "scaled" => null);
714  }
715 
716 }
717 ?>