ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilLPCollectionOfRepositoryObjects.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 
5 require_once "Services/Tracking/classes/collection/class.ilLPCollection.php";
6 
17 {
18  protected static $possible_items = array();
19 
20  public function getPossibleItems($a_ref_id, $a_full_data = false)
21  {
22  global $tree, $objDefinition;
23 
24  $cache_idx = $a_ref_id."__".$a_full_data;
25 
26  if(!isset(self::$possible_items[$cache_idx]))
27  {
28  $all_possible = array();
29 
30  if(!$tree->isDeleted($a_ref_id))
31  {
32  include_once 'Services/Repository/classes/class.ilRepositoryObjectPluginSlot.php';
33 
34  if(!$a_full_data)
35  {
36  $data = $tree->getRbacSubTreeInfo($a_ref_id);
37  }
38  else
39  {
40  $node = $tree->getNodeData($a_ref_id);
41  $data = $tree->getSubTree($node);
42  }
43  foreach($data as $node)
44  {
45  if(!$a_full_data)
46  {
47  $item_ref_id = $node['child'];
48  }
49  else
50  {
51  $item_ref_id = $node['ref_id'];
52  }
53 
54  // avoid recursion
55  if($item_ref_id == $a_ref_id ||
56  !$this->validateEntry($item_ref_id, $node['type']))
57  {
58  continue;
59  }
60 
61  switch($node['type'])
62  {
63  case 'sess':
64  case 'exc':
65  case 'fold':
66  case 'grp':
67  case 'sahs':
68  case 'lm':
69  case 'tst':
70  case 'file':
71  case 'mcst':
72  case 'htlm':
73  case 'svy':
74  case "prg":
75  case 'iass':
76  if(!$a_full_data)
77  {
78  $all_possible[] = $item_ref_id;
79  }
80  else
81  {
82  $all_possible[$item_ref_id] = array(
83  'ref_id' => $item_ref_id,
84  'obj_id' => $node['obj_id'],
85  'title' => $node['title'],
86  'description' => $node['description'],
87  'type' => $node['type']
88  );
89  }
90  break;
91 
92  // repository plugin object?
93  case $objDefinition->isPluginTypeName($node['type']):
94  $only_active = false;
95  if(!$this->isAssignedEntry($item_ref_id))
96  {
97  $only_active = true;
98  }
99  if(ilRepositoryObjectPluginSlot::isTypePluginWithLP($node['type'], $only_active))
100  {
101  if(!$a_full_data)
102  {
103  $all_possible[] = $item_ref_id;
104  }
105  else
106  {
107  $all_possible[$item_ref_id] = array(
108  'ref_id' => $item_ref_id,
109  'obj_id' => $node['obj_id'],
110  'title' => $node['title'],
111  'description' => $node['description'],
112  'type' => $node['type']
113  );
114  }
115  }
116  break;
117  }
118  }
119  }
120 
121  self::$possible_items[$cache_idx] = $all_possible;
122  }
123 
124  return self::$possible_items[$cache_idx];
125  }
126 
127  protected function validateEntry($a_item_ref_id, $a_item_type = null)
128  {
129  if(!$a_item_type)
130  {
131  $a_item_type = ilObject::_lookupType($a_item_ref_id, true);
132  }
133 
134  // this is hardcoded so we do not need to call all ObjectLP types
135  if($a_item_type == 'tst')
136  {
137  // Check anonymized
138  $item_obj_id = ilObject::_lookupObjId($a_item_ref_id);
139  $olp = ilObjectLP::getInstance($item_obj_id);
140  if($olp->isAnonymized())
141  {
142  return false;
143  }
144  }
145  return true;
146  }
147 
148  public function cloneCollection($a_target_id, $a_copy_id)
149  {
150  parent::cloneCollection($a_target_id, $a_copy_id);
151 
152  include_once('Services/CopyWizard/classes/class.ilCopyWizardOptions.php');
153  $cwo = ilCopyWizardOptions::_getInstance($a_copy_id);
154  $mappings = $cwo->getMappings();
155 
156  $target_obj_id = ilObject::_lookupObjId($a_target_id);
157  $target_collection = new static($target_obj_id, $this->mode);
158 
159  // clone (active) groupings
160  foreach($this->getGroupedItemsForLPStatus() as $grouping_id => $group)
161  {
162  $target_item_ids = array();
163  foreach($group["items"] as $item)
164  {
165  if(!isset($mappings[$item]) or !$mappings[$item])
166  {
167  continue;
168  }
169 
170  $target_item_ids[] = $mappings[$item];
171  }
172 
173  // grouping - if not only single item left after copy?
174  if($grouping_id && sizeof($target_item_ids) > 1)
175  {
176  // should not be larger than group
177  $num_obligatory = min(sizeof($target_item_ids), $group["num_obligatory"]);
178 
179  $target_collection->createNewGrouping($target_item_ids, $num_obligatory);
180  }
181  else
182  {
183  // #15487 - single items
184  foreach($target_item_ids as $item_id)
185  {
186  $this->addEntry($item_id);
187  }
188  }
189  }
190  }
191 
192 
193  //
194  // CRUD
195  //
196 
197  protected function read($a_obj_id)
198  {
199  global $ilDB;
200 
201  $items = array();
202 
203  $ref_ids = ilObject::_getAllReferences($a_obj_id);
204  $ref_id = end($ref_ids);
205  $possible = $this->getPossibleItems($ref_id);
206 
207  $res = $ilDB->query("SELECT utc.item_id, obd.type".
208  " FROM ut_lp_collections utc".
209  " JOIN object_reference obr ON item_id = ref_id".
210  " JOIN object_data obd ON obr.obj_id = obd.obj_id".
211  " WHERE utc.obj_id = ".$ilDB->quote($a_obj_id, "integer").
212  " AND active = ".$ilDB->quote(1, "integer").
213  " ORDER BY title");
214  while($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT))
215  {
216  if(in_array($row->item_id, $possible) &&
217  $this->validateEntry($row->item_id, $row->type))
218  {
219  $items[] = $row->item_id;
220  }
221  else
222  {
223  $this->deleteEntry($row->item_id);
224  }
225  }
226 
227  $this->items = $items;
228  }
229 
230  protected function addEntry($a_item_id)
231  {
232  global $ilDB;
233 
234  // only active entries are assigned!
235  if(!$this->isAssignedEntry($a_item_id))
236  {
237  // #13278 - because of grouping inactive items may exist
238  $this->deleteEntry($a_item_id);
239 
240  $query = "INSERT INTO ut_lp_collections".
241  " (obj_id, lpmode, item_id, grouping_id, num_obligatory, active)".
242  " VALUES (".$ilDB->quote($this->obj_id , "integer").
243  ", ".$ilDB->quote($this->mode, "integer").
244  ", ".$ilDB->quote($a_item_id , "integer").
245  ", ".$ilDB->quote(0, "integer").
246  ", ".$ilDB->quote(0, "integer").
247  ", ".$ilDB->quote(1, "integer").
248  ")";
249  $ilDB->manipulate($query);
250  $this->items[] = $a_item_id;
251  }
252  return true;
253  }
254 
255  protected function deleteEntry($a_item_id)
256  {
257  global $ilDB;
258 
259  $query = "DELETE FROM ut_lp_collections ".
260  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
261  " AND item_id = ".$ilDB->quote($a_item_id, "integer").
262  " AND grouping_id = ".$ilDB->quote(0, "integer");
263  $ilDB->manipulate($query);
264  return true;
265  }
266 
267 
268  //
269  // GROUPING
270  //
271 
272  public static function hasGroupedItems($a_obj_id)
273  {
274  global $ilDB;
275 
276  $query = "SELECT item_id FROM ut_lp_collections".
277  " WHERE obj_id = ".$ilDB->quote($a_obj_id, "integer").
278  " AND grouping_id > ".$ilDB->quote(0, "integer");
279  $res = $ilDB->query($query);
280  return $res->numRows() ? true : false;
281  }
282 
283  protected function getGroupingIds(array $a_item_ids)
284  {
285  global $ilDB;
286 
287  $grouping_ids = array();
288 
289  $query = "SELECT grouping_id FROM ut_lp_collections".
290  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
291  " AND ".$ilDB->in("item_id", $a_item_ids, false, "integer").
292  " AND grouping_id > ".$ilDB->quote(0, "integer");
293  $res = $ilDB->query($query);
294  while($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT))
295  {
296  $grouping_ids[] = $row->grouping_id;
297  }
298 
299  return $grouping_ids;
300  }
301 
302  public function deactivateEntries(array $a_item_ids)
303  {
304  global $ilDB;
305 
306  parent::deactivateEntries($a_item_ids);
307 
308  $grouping_ids = $this->getGroupingIds($a_item_ids);
309  if($grouping_ids)
310  {
311  $query = "UPDATE ut_lp_collections".
312  " SET active = ".$ilDB->quote(0, "integer").
313  " WHERE ".$ilDB->in("grouping_id", $grouping_ids, false, "integer").
314  " AND obj_id = ".$ilDB->quote($this->obj_id, "integer");
315  $ilDB->manipulate($query);
316  }
317  }
318 
319  public function activateEntries(array $a_item_ids)
320  {
321  global $ilDB;
322 
323  parent::activateEntries($a_item_ids);
324 
325  $grouping_ids = $this->getGroupingIds($a_item_ids);
326  if($grouping_ids)
327  {
328  $query = "UPDATE ut_lp_collections".
329  " SET active = ".$ilDB->quote(1, "integer").
330  " WHERE ".$ilDB->in("grouping_id", $grouping_ids, false, "integer").
331  " AND obj_id = ".$ilDB->quote($this->obj_id, "integer");
332  $ilDB->manipulate($query);
333  }
334  }
335 
336  public function createNewGrouping(array $a_item_ids, $a_num_obligatory = 1)
337  {
338  global $ilDB;
339 
340  $this->activateEntries($a_item_ids);
341 
342  $all_item_ids = array();
343 
344  $grouping_ids = $this->getGroupingIds($a_item_ids);
345 
346  $query = "SELECT item_id FROM ut_lp_collections".
347  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
348  " AND ".$ilDB->in("grouping_id", $grouping_ids, false, "integer");
349  $res = $ilDB->query($query);
350  while($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT))
351  {
352  $all_item_ids[] = $row->item_id;
353  }
354 
355  $all_item_ids = array_unique(array_merge($all_item_ids, $a_item_ids));
356 
357  $this->releaseGrouping($a_item_ids);
358 
359  // Create new grouping
360  $query = "SELECT MAX(grouping_id) grp FROM ut_lp_collections".
361  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
362  " GROUP BY obj_id";
363  $res = $ilDB->query($query);
365  $grp_id = $row->grp;
366  ++$grp_id;
367 
368  $query = "UPDATE ut_lp_collections SET".
369  " grouping_id = ".$ilDB->quote($grp_id, "integer").
370  ", num_obligatory = ".$ilDB->quote($a_num_obligatory, "integer").
371  ", active = ".$ilDB->quote(1, "integer").
372  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
373  " AND ".$ilDB->in("item_id", $all_item_ids, false, "integer");
374  $ilDB->manipulate($query);
375 
376  return;
377  }
378 
379  public function releaseGrouping(array $a_item_ids)
380  {
381  global $ilDB;
382 
383  $grouping_ids = $this->getGroupingIds($a_item_ids);
384 
385  $query = "UPDATE ut_lp_collections".
386  " SET grouping_id = ".$ilDB->quote(0, "integer").
387  ", num_obligatory = ".$ilDB->quote(0, "integer").
388  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
389  " AND " . $ilDB->in("grouping_id", $grouping_ids, false, "integer");
390  $ilDB->manipulate($query);
391  }
392 
393  public function saveObligatoryMaterials(array $a_obl)
394  {
395  global $ilDB;
396 
397  foreach($a_obl as $grouping_id => $num)
398  {
399  $query = "SELECT count(obj_id) num FROM ut_lp_collections".
400  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
401  " AND grouping_id = ".$ilDB->quote($grouping_id,'integer').
402  " GROUP BY obj_id";
403  $res = $ilDB->query($query);
404  while($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT))
405  {
406  if($num <= 0 || $num >= $row->num)
407  {
408  throw new UnexpectedValueException();
409  }
410  }
411  }
412  foreach($a_obl as $grouping_id => $num)
413  {
414  $query = "UPDATE ut_lp_collections".
415  " SET num_obligatory = ".$ilDB->quote($num, "integer").
416  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
417  " AND grouping_id = ".$ilDB->quote($grouping_id, "integer");
418  $ilDB->manipulate($query);
419  }
420  }
421 
422 
423  //
424  // TABLE GUI
425  //
426 
427  public function getTableGUIData($a_parent_ref_id)
428  {
429  $items = $this->getPossibleItems($a_parent_ref_id, true);
430 
431  $data = array();
432  $done = array();
433  foreach($items as $item_id => $item)
434  {
435  if(in_array($item_id, $done))
436  {
437  continue;
438  }
439 
440  $table_item = $this->parseTableGUIItem($item_id, $item);
441 
442  // grouping
443  $table_item['grouped'] = array();
444  $grouped_items = $this->getTableGUItemGroup($item_id);
445  if(count((array)$grouped_items['items']) > 1)
446  {
447  foreach($grouped_items['items'] as $grouped_item_id)
448  {
449  if($grouped_item_id == $item_id ||
450  !is_array($items[$grouped_item_id])) // #15498
451  {
452  continue;
453  }
454 
455  $table_item['grouped'][] = $this->parseTableGUIItem($grouped_item_id, $items[$grouped_item_id]);
456  $table_item['num_obligatory'] = $grouped_items['num_obligatory'];
457  $table_item['grouping_id'] = $grouped_items['grouping_id'];
458 
459  $done[] = $grouped_item_id;
460  }
461  }
462 
463  $data[] = $table_item;
464  }
465 
466  return $data;
467  }
468 
469  protected function parseTableGUIItem($a_id, array $a_item)
470  {
471  $table_item = $a_item;
472  $table_item['id'] = $a_id;
473  $table_item['status'] = $this->isAssignedEntry($a_id);
474 
475  $olp = ilObjectLP::getInstance($a_item['obj_id']);
476  $table_item['mode_id'] = $olp->getCurrentMode();
477  $table_item['mode'] = $olp->getModeText($table_item['mode_id']);
478  $table_item['anonymized'] = $olp->isAnonymized();
479 
480  return $table_item;
481  }
482 
483  protected function getTableGUItemGroup($item_id)
484  {
485  global $ilDB;
486 
487  $items = array();
488 
489  $query = "SELECT grouping_id FROM ut_lp_collections".
490  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
491  " AND item_id = ".$ilDB->quote($item_id, "integer");
492  $res = $ilDB->query($query);
494  $grouping_id = $row->grouping_id;
495  if($grouping_id > 0)
496  {
497  $query = "SELECT item_id, num_obligatory FROM ut_lp_collections".
498  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
499  " AND grouping_id = ".$ilDB->quote($grouping_id, "integer");
500  $res = $ilDB->query($query);
501  while($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT))
502  {
503  $items['items'][] = $row->item_id;
504  $items['num_obligatory'] = $row->num_obligatory;
505  $items['grouping_id'] = $grouping_id;
506  }
507  }
508 
509  return $items;
510  }
511 
512  public function getGroupedItemsForLPStatus()
513  {
514  global $ilDB;
515 
516  $items = $this->getItems();
517 
518  $query = " SELECT * FROM ut_lp_collections".
519  " WHERE obj_id = ".$ilDB->quote($this->obj_id, "integer").
520  " AND active = ".$ilDB->quote(1, "integer");
521  $res = $ilDB->query($query);
522 
523  $grouped = array();
524  while($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT))
525  {
526  if(in_array($row->item_id, $items))
527  {
528  $grouped[$row->grouping_id]['items'][] = $row->item_id;
529  $grouped[$row->grouping_id]['num_obligatory'] = $row->num_obligatory;
530  }
531  }
532 
533  return $grouped;
534  }
535 }
536 
537 ?>
static isTypePluginWithLP($a_type, $a_active_status=true)
Check whether a repository type is a plugin which has active learning progress.
createNewGrouping(array $a_item_ids, $a_num_obligatory=1)
static _getAllReferences($a_id)
get all reference ids of object
static _getInstance($a_copy_id)
Get instance of copy wizard options.
static _lookupObjId($a_id)
Create styles array
The data for the language used.
static _lookupType($a_id, $a_reference=false)
lookup object type
LP collection base class.
$ref_id
Definition: sahs_server.php:39
isAssignedEntry($a_item_id)
global $ilDB
static getInstance($a_obj_id)