ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilObjectActivation.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
13{
14 protected $timing_type;
15 protected $timing_start;
16 protected $timing_end;
18 protected $suggestion_end;
19 protected $earliest_start;
20 protected $latest_end;
21 protected $visible;
22 protected $changeable;
23
24 protected static $preloaded_data = array();
25
29 const TIMINGS_FIXED = 3; // session only => obsolete?
30
31 function __construct()
32 {
33
34 }
35
43 {
44 $this->timing_type = $a_type;
45 }
46
53 function getTimingType()
54 {
55 return $this->timing_type;
56 }
57
63 function setTimingStart($a_start)
64 {
65 $this->timing_start = $a_start;
66 }
67
73 function getTimingStart()
74 {
76 }
77
83 function setTimingEnd($a_end)
84 {
85 $this->timing_end = $a_end;
86 }
87
93 function getTimingEnd()
94 {
95 return $this->timing_end;
96 }
97
103 function setSuggestionStart($a_start)
104 {
105 $this->suggestion_start = $a_start;
106 }
107
114 {
116 }
117
123 function setSuggestionEnd($a_end)
124 {
125 $this->suggestion_end = $a_end;
126 }
127
134 {
136 }
137
143 function setEarliestStart($a_start)
144 {
145 $this->earliest_start = $a_start;
146 }
147
154 {
156 }
157
163 function setLatestEnd($a_end)
164 {
165 $this->latest_end = $a_end;
166 }
167
173 function getLatestEnd()
174 {
175 return $this->latest_end;
176 }
177
183 function toggleVisible($a_status)
184 {
185 $this->visible = (int) $a_status;
186 }
187
193 function enabledVisible()
194 {
195 return (bool) $this->visible;
196 }
197
203 function toggleChangeable($a_status)
204 {
205 $this->changeable = (int) $a_status;
206 }
207
214 {
215 return (bool) $this->changeable;
216 }
217
224 {
225 global $ilErr, $lng;
226
227 $ilErr->setMessage('');
228
229 if($this->getTimingType() == self::TIMINGS_ACTIVATION)
230 {
231 if($this->getTimingStart() > $this->getTimingEnd())
232 {
233 $ilErr->appendMessage($lng->txt("crs_activation_start_invalid"));
234 }
235 }
236 else if($this->getTimingType() == self::TIMINGS_PRESETTING)
237 {
238 if($this->getSuggestionStart() > $this->getSuggestionEnd())
239 {
240 $ilErr->appendMessage($lng->txt('crs_latest_end_not_valid'));
241 }
242 }
243
244 if($ilErr->getMessage())
245 {
246 return false;
247 }
248 return true;
249 }
250
257 function update($a_ref_id, $a_parent_id = null)
258 {
259 global $ilDB;
260
261 // #10110
262 $query = "UPDATE crs_items SET ".
263 "timing_type = ".$ilDB->quote($this->getTimingType(),'integer').", ".
264 "timing_start = ".$ilDB->quote((int)$this->getTimingStart(),'integer').", ".
265 "timing_end = ".$ilDB->quote((int)$this->getTimingEnd(),'integer').", ".
266 "suggestion_start = ".$ilDB->quote((int)$this->getSuggestionStart(),'integer').", ".
267 "suggestion_end = ".$ilDB->quote((int)$this->getSuggestionEnd(),'integer').", ".
268 "changeable = ".$ilDB->quote($this->enabledChangeable(),'integer').", ".
269 "earliest_start = ".$ilDB->quote((int)$this->getEarliestStart(),'integer').", ".
270 "latest_end = ".$ilDB->quote((int)$this->getLatestEnd(),'integer').", ";
271
272 if($a_parent_id)
273 {
274 $query .= "parent_id = ".$ilDB->quote($a_parent_id,'integer').", ";
275 }
276
277 $query .= "visible = ".$ilDB->quote($this->enabledVisible(),'integer')." ".
278 "WHERE obj_id = ".$ilDB->quote($a_ref_id,'integer');
279 $ilDB->manipulate($query);
280
281 unset(self::$preloaded_data[$a_ref_id]);
282
283 return true;
284 }
285
291 public static function preloadData(array $a_ref_ids)
292 {
293 global $ilDB;
294
295 $sql = "SELECT * FROM crs_items".
296 " WHERE ".$ilDB->in("obj_id", $a_ref_ids, "", "integer");
297 $set = $ilDB->query($sql);
298 while($row = $ilDB->fetchAssoc($set))
299 {
300 self::$preloaded_data[$row["obj_id"]] = $row;
301 }
302 }
303
310 public static function getItem($a_ref_id)
311 {
312 global $ilDB;
313
314 if(isset(self::$preloaded_data[$a_ref_id]))
315 {
316 return self::$preloaded_data[$a_ref_id];
317 }
318
319 $sql = "SELECT * FROM crs_items".
320 " WHERE obj_id = ".$ilDB->quote($a_ref_id, "integer");
321 $set = $ilDB->query($sql);
322 $row = $ilDB->fetchAssoc($set);
323
324 if(!isset($row["obj_id"]))
325 {
326 $row = self::createDefaultEntry($a_ref_id);
327 }
328 if($row["obj_id"])
329 {
330 self::$preloaded_data[$row["obj_id"]] = $row;
331 }
332 return $row;
333 }
334
340 public static function addAdditionalSubItemInformation(array &$a_item)
341 {
342 global $ilUser;
343
344 $item = self::getItem($a_item['ref_id']);
345
346 $a_item['obj_id'] = ($a_item['obj_id'] > 0)
347 ? $a_item['obj_id']
348 : ilObject::_lookupObjId($a_item['ref_id']);
349 $a_item['type'] = ($a_item['type'] != '')
350 ? $a_item['type']
351 : ilObject::_lookupType($a_item['obj_id']);
352
353 $a_item['timing_type'] = $item['timing_type'];
354
355 if($item['changeable'] &&
356 $item['timing_type'] == self::TIMINGS_PRESETTING)
357 {
358 include_once 'Modules/Course/classes/Timings/class.ilTimingPlaned.php';
359 $user_data = ilTimingPlaned::_getPlanedTimings($ilUser->getId(), $a_item['ref_id']);
360 if($user_data['planed_start'])
361 {
362 $a_item['start'] = $user_data['planed_start'];
363 $a_item['end'] = $user_data['planed_end'];
364 $a_item['activation_info'] = 'crs_timings_planed_info';
365 }
366 else
367 {
368 $a_item['start'] = $item['suggestion_start'];
369 $a_item['end'] = $item['suggestion_end'];
370 $a_item['activation_info'] = 'crs_timings_suggested_info';
371 }
372 }
373 elseif($item['timing_type'] == self::TIMINGS_PRESETTING)
374 {
375 $a_item['start'] = $item['suggestion_start'];
376 $a_item['end'] = $item['suggestion_end'];
377 $a_item['activation_info'] = 'crs_timings_suggested_info';
378 }
379 elseif($item['timing_type'] == self::TIMINGS_ACTIVATION)
380 {
381 $a_item['start'] = $item['timing_start'];
382 $a_item['end'] = $item['timing_end'];
383 $a_item['activation_info'] = 'obj_activation_list_gui';
384 }
385 else
386 {
387 $a_item['start'] = 'abc';
388 }
389
390 // #7359 - session sorting should always base on appointment date
391 if($a_item['type'] == 'sess')
392 {
393 include_once('./Modules/Session/classes/class.ilSessionAppointment.php');
395
396 // #11987
397 $a_item['masked_start'] = $a_item['start'];
398 $a_item['masked_end'] = $a_item['end'];
399 $a_item['start'] = $info['start'];
400 $a_item['end'] = $info['end'];
401 }
402 }
403
411 public static function addListGUIActivationProperty(ilObjectListGUI $a_list_gui, array &$a_item)
412 {
413 global $lng;
414
416 if(isset($a_item['timing_type']))
417 {
418 if(!isset($a_item['masked_start']))
419 {
420 $start = $a_item['start'];
421 $end = $a_item['end'];
422 }
423 else
424 {
425 $start = $a_item['masked_start'];
426 $end = $a_item['masked_end'];
427 }
428 $activation = '';
429 switch($a_item['timing_type'])
430 {
434 new ilDateTime($end,IL_CAL_UNIX));
435 break;
436
440 new ilDate($end,IL_CAL_UNIX));
441 break;
442 }
443 if ($activation != "")
444 {
445 global $lng;
446 $lng->loadLanguageModule('crs');
447
448 $a_list_gui->addCustomProperty($lng->txt($a_item['activation_info']),
449 $activation, false, true);
450 }
451 }
452 }
453
460 protected static function createDefaultEntry($a_ref_id)
461 {
462 global $ilDB, $tree;
463
464 $parent_id = $tree->getParentId($a_ref_id);
465 if(!$parent_id)
466 {
467 return;
468 }
469
470
471 $ilAtomQuery = $ilDB->buildAtomQuery();
472 $ilAtomQuery->addTableLock("crs_items");
473
474 $ilAtomQuery->addQueryCallable(function(ilDBInterface $ilDB) use ($a_ref_id, $parent_id, &$a_item){
475
476 $sql = "SELECT * FROM crs_items".
477 " WHERE obj_id = ".$ilDB->quote($a_ref_id, "integer");
478 $set = $ilDB->query($sql);
479 if(!$ilDB->numRows($set))
480 {
481 $now = time();
482 $now_parts = getdate($now);
483
484 $a_item = array();
485 $a_item["timing_type"] = self::TIMINGS_DEACTIVATED;
486 $a_item["timing_start"] = $now;
487 $a_item["timing_end"] = $now;
488 $a_item["suggestion_start"] = $now;
489 $a_item["suggestion_end"] = $now;
490 $a_item['visible'] = 0;
491 $a_item['changeable'] = 0;
492 $a_item['earliest_start'] = $now;
493 $a_item['latest_end'] = mktime(23,55,00,$now_parts["mon"],$now_parts["mday"],$now_parts["year"]);
494 $a_item['visible'] = 0;
495 $a_item['changeable'] = 0;
496
497 $query = "INSERT INTO crs_items (parent_id,obj_id,timing_type,timing_start,timing_end," .
498 "suggestion_start,suggestion_end, ".
499 "changeable,earliest_start,latest_end,visible,position) ".
500 "VALUES( ".
501 $ilDB->quote($parent_id,'integer').",".
502 $ilDB->quote($a_ref_id,'integer').",".
503 $ilDB->quote($a_item["timing_type"],'integer').",".
504 $ilDB->quote($a_item["timing_start"],'integer').",".
505 $ilDB->quote($a_item["timing_end"],'integer').",".
506 $ilDB->quote($a_item["suggestion_start"],'integer').",".
507 $ilDB->quote($a_item["suggestion_end"],'integer').",".
508 $ilDB->quote($a_item["changeable"],'integer').",".
509 $ilDB->quote($a_item['earliest_start'],'integer').", ".
510 $ilDB->quote($a_item['latest_end'],'integer').", ".
511 $ilDB->quote($a_item["visible"],'integer').", ".
512 $ilDB->quote(0,'integer').")";
513 $ilDB->manipulate($query);
514 }
515
516 });
517
518 $ilAtomQuery->run();
519
520 // #9982 - to make getItem()-cache work
521 $a_item["obj_id"] = $a_ref_id;
522 $a_item["parent_id"] = $parent_id;
523
524 return $a_item;
525 }
526
532 public static function deleteAllEntries($a_ref_id)
533 {
534 global $ilDB;
535
536 if(!$a_ref_id)
537 {
538 return;
539 }
540
541 $query = "DELETE FROM crs_items ".
542 "WHERE obj_id = ".$ilDB->quote($a_ref_id,'integer');
543 $ilDB->manipulate($query);
544
545 $query = "DELETE FROM crs_items ".
546 "WHERE parent_id = ".$ilDB->quote($a_ref_id,'integer');
547 $ilDB->manipulate($query);
548
549 return true;
550 }
551
559 public static function cloneDependencies($a_ref_id,$a_target_id,$a_copy_id)
560 {
561 global $ilLog;
562
563 $ilLog->write(__METHOD__.': Begin course items...');
564
565 $items = self::getItems($a_ref_id);
566 if(!$items)
567 {
568 $ilLog->write(__METHOD__.': No course items found.');
569 return true;
570 }
571
572 // new course item object
573 if(!is_object($new_container = ilObjectFactory::getInstanceByRefId($a_target_id,false)))
574 {
575 $ilLog->write(__METHOD__.': Cannot create target object.');
576 return false;
577 }
578
579 include_once('Services/CopyWizard/classes/class.ilCopyWizardOptions.php');
580 $cp_options = ilCopyWizardOptions::_getInstance($a_copy_id);
581 $mappings = $cp_options->getMappings();
582
583 foreach($items as $item)
584 {
585 if(!isset($mappings[$item['parent_id']]) or !$mappings[$item['parent_id']])
586 {
587 $ilLog->write(__METHOD__.': No mapping for parent nr. '.$item['parent_id']);
588 continue;
589 }
590 if(!isset($mappings[$item['obj_id']]) or !$mappings[$item['obj_id']])
591 {
592 $ilLog->write(__METHOD__.': No mapping for item nr. '.$item['obj_id']);
593 continue;
594 }
595 $new_item_id = $mappings[$item['obj_id']];
596 $new_parent = $mappings[$item['parent_id']];
597
598 $new_item = new self();
599 $new_item->setTimingType($item['timing_type']);
600 $new_item->setTimingStart($item['timing_start']);
601 $new_item->setTimingEnd($item['timing_end']);
602 $new_item->setSuggestionStart($item['suggestion_start']);
603 $new_item->setSuggestionEnd($item['suggestion_end']);
604 $new_item->toggleChangeable($item['changeable']);
605 $new_item->setEarliestStart($item['earliest_start']);
606 $new_item->setLatestEnd($item['latest_end']);
607 $new_item->toggleVisible($item['visible']);
608 $new_item->update($new_item_id, $new_parent);
609
610 $ilLog->write(__METHOD__.': Added new entry for item nr. '.$item['obj_id']);
611 }
612 $ilLog->write(__METHOD__.': Finished course items.');
613 }
614
615
616 //
617 // TIMINGS VIEW RELATED (COURSE ONLY)
618 //
619
626 public static function hasTimings($a_ref_id)
627 {
628 global $tree, $ilDB;
629
630 $subtree = $tree->getSubTree($tree->getNodeData($a_ref_id));
631 $ref_ids = array();
632 foreach($subtree as $node)
633 {
634 $ref_ids[] = $node['ref_id'];
635 }
636
637 $query = "SELECT * FROM crs_items ".
638 "WHERE timing_type = ".$ilDB->quote(self::TIMINGS_PRESETTING,'integer')." ".
639 "AND ".$ilDB->in('obj_id',$ref_ids,false,'integer');
640 $res = $ilDB->query($query);
641 return $res->numRows() ? true :false;
642 }
643
650 public static function hasChangeableTimings($a_ref_id)
651 {
652 global $tree, $ilDB;
653
654 $subtree = $tree->getSubTree($tree->getNodeData($a_ref_id));
655 $ref_ids = array();
656 foreach($subtree as $node)
657 {
658 $ref_ids[] = $node['ref_id'];
659 }
660
661 $query = "SELECT * FROM crs_items ".
662 "WHERE timing_type = ".$ilDB->quote(self::TIMINGS_PRESETTING,'integer')." ".
663 "AND changeable = ".$ilDB->quote(1,'integer')." ".
664 "AND ".$ilDB->in('obj_id',$ref_ids,false,'integer');
665 $res = $ilDB->query($query);
666 return $res->numRows() ? true : false;
667 }
668
675 protected static function processListItems(array $a_ref_ids)
676 {
677 global $tree;
678
679 $res = array();
680
681 foreach($a_ref_ids as $item_ref_id)
682 {
683 if($tree->isDeleted($item_ref_id))
684 {
685 continue;
686 }
687 // #7571: when node is removed from system, e.g. inactive trashcan, an empty array is returned
688 $node = $tree->getNodeData($item_ref_id);
689 if($node["ref_id"] != $item_ref_id)
690 {
691 continue;
692 }
693 $res[$item_ref_id] = $node;
694 }
695
696 if(sizeof($res))
697 {
698 self::preloadData(array_keys($res));
699 foreach($res as $idx => $item)
700 {
702 $res[$idx] = $item;
703 }
704 }
705
706 return array_values($res);
707 }
708
715 public static function getItemsByEvent($a_event_id)
716 {
717 include_once 'Modules/Session/classes/class.ilEventItems.php';
718 $event_items = new ilEventItems($a_event_id);
719 return self::processListItems($event_items->getItems());
720 }
721
728 public static function getItemsByItemGroup($a_item_group_ref_id)
729 {
730 include_once 'Modules/ItemGroup/classes/class.ilItemGroupItems.php';
731 $ig_items = new ilItemGroupItems($a_item_group_ref_id);
732 $items = $ig_items->getValidItems();
733 return self::processListItems($items);
734 }
735
742 public static function getItemsByObjective($a_objective_id)
743 {
744 include_once('./Modules/Course/classes/class.ilCourseObjectiveMaterials.php');
745 $item_ids = ilCourseObjectiveMaterials::_getAssignedMaterials($a_objective_id);
746 return self::processListItems($item_ids);
747 }
748
756 public static function getItems($a_parent_id, $a_with_list_data = true)
757 {
758 global $tree;
759
760 $items = array();
761
762 $ref_ids = array();
763 foreach($tree->getChilds($a_parent_id) as $item)
764 {
765 if($item['type'] != 'rolf')
766 {
767 $items[] = $item;
768 $ref_ids[] = $item['ref_id'];
769 }
770 }
771
772 if($ref_ids)
773 {
774 self::preloadData($ref_ids);
775
776 foreach($items as $idx => $item)
777 {
778 if(!$a_with_list_data)
779 {
780 $items[$idx] = array_merge($item, self::getItem($item['ref_id']));
781 }
782 else
783 {
785 $items[$idx] = $item;
786 }
787 }
788 }
789
790 return $items;
791 }
792
799 public static function getTimingsAdministrationItems($a_parent_id)
800 {
801 $items = self::getItems($a_parent_id, false);
802
803 if($items)
804 {
805 $active = $inactive = array();
806 foreach($items as $item)
807 {
808 // active should be first in order
809 if($item['timing_type'] == self::TIMINGS_DEACTIVATED)
810 {
811 $inactive[] = $item;
812 }
813 else
814 {
815 $active[] = $item;
816 }
817 }
818
819 $active = ilUtil::sortArray($active,'start','asc');
820 $inactive = ilUtil::sortArray($inactive,'title','asc');
821 $items = array_merge($active,$inactive);
822 }
823
824 return $items;
825 }
826
833 public static function getTimingsItems($a_container_ref_id)
834 {
835 global $objDefinition;
836
837 $filtered = array();
838
839 include_once 'Modules/Session/classes/class.ilEventItems.php';
840 $event_items = ilEventItems::_getItemsOfContainer($a_container_ref_id);
841 foreach(self::getTimingsAdministrationItems($a_container_ref_id) as $item)
842 {
843 if(!in_array($item['ref_id'],$event_items) &&
844 !$objDefinition->isSideBlock($item['type']))
845 {
846 $filtered[] = $item;
847 }
848 }
849
850 return $filtered;
851 }
852}
853
854?>
An exception for terminatinating execution or to throw for unit testing.
const IL_CAL_UNIX
static _getInstance($a_copy_id)
Get instance of copy wizard options.
static _getAssignedMaterials($a_objective_id)
get assigned materials
static formatPeriod(ilDateTime $start, ilDateTime $end)
Format a period of two date Shows: 14.
@classDescription Date and time handling
Class for single dates.
class ilEvent
static _getItemsOfContainer($a_ref_id)
Class ilObjectActivation.
getTimingStart()
Get timing start.
setTimingStart($a_start)
Set timing start.
setEarliestStart($a_start)
Set earliest start.
validateActivation()
Validate current properties.
setLatestEnd($a_end)
Set latest end.
enabledVisible()
Get visible status.
static getTimingsAdministrationItems($a_parent_id)
Get (sub) item data for timings administration view (active/inactive)
getEarliestStart()
Get earliest start.
getTimingType()
get timing type
static createDefaultEntry($a_ref_id)
Create db entry with default values.
setTimingType($a_type)
Set timing type.
update($a_ref_id, $a_parent_id=null)
Update db entry.
setSuggestionStart($a_start)
Set suggestion start.
static addListGUIActivationProperty(ilObjectListGUI $a_list_gui, array &$a_item)
Get timing details for list gui.
static getItemsByObjective($a_objective_id)
Get objective items.
static deleteAllEntries($a_ref_id)
Delete all db entries for ref id.
static cloneDependencies($a_ref_id, $a_target_id, $a_copy_id)
Clone dependencies.
enabledChangeable()
Get changeable status.
static hasChangeableTimings($a_ref_id)
Check if there is any active changeable timing (in subtree)
static getItemsByEvent($a_event_id)
Get session material / event items.
setTimingEnd($a_end)
Set timing end.
toggleChangeable($a_status)
Set changeable status.
static hasTimings($a_ref_id)
Check if there is any active timing (in subtree)
static preloadData(array $a_ref_ids)
Preload data to internal cache.
static processListItems(array $a_ref_ids)
Validate ref ids and add list data.
static getItemsByItemGroup($a_item_group_ref_id)
Get materials of item group.
static addAdditionalSubItemInformation(array &$a_item)
Parse item data for list entries.
getSuggestionStart()
Get suggestion start.
static getTimingsItems($a_container_ref_id)
Get (sub) item data for timings view (no session material, no side blocks)
getSuggestionEnd()
Get suggestion end.
static getItem($a_ref_id)
Get item data.
toggleVisible($a_status)
Set visible status.
setSuggestionEnd($a_end)
Set suggestion end.
static getItems($a_parent_id, $a_with_list_data=true)
Get sub item data.
static getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
Class ilObjectListGUI.
addCustomProperty($a_property="", $a_value="", $a_alert=false, $a_newline=false)
add custom property
static _lookupObjId($a_id)
static _lookupType($a_id, $a_reference=false)
lookup object type
static _lookupAppointment($a_obj_id)
lookup appointment
static _getPlanedTimings($a_usr_id, $a_item_id)
static sortArray($array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
$info
Definition: example_052.php:80
Interface ilDBInterface.
global $lng
Definition: privfeed.php:17
global $ilErr
Definition: raiseError.php:16
global $ilDB
$ilUser
Definition: imgupload.php:18
$a_type
Definition: workflow.php:93