34 define(
'IL_CRS_TIMINGS_ACTIVATION',0);
 
   35 define(
'IL_CRS_TIMINGS_DEACTIVATED',1);
 
   36 define(
'IL_CRS_TIMINGS_PRESETTING',2);
 
   37 define(
'IL_CRS_TIMINGS_FIXED',3);
 
   65                 $this->course_ref_id = $a_course_ref_id;
 
   66                 $this->user_id = $user_id;
 
   83                 global $ilObjDataCache,
$ilLog;
 
   85                 $ilLog->write(__METHOD__.
': Begin course items...');
 
   87                 $target_obj_id = $ilObjDataCache->lookupObjId($a_target_id);
 
   89                 include_once(
'Services/CopyWizard/classes/class.ilCopyWizardOptions.php');
 
   91                 $mappings = $cp_options->getMappings();
 
   93                 $query = 
"SELECT * FROM crs_items WHERE ".
 
   94                         "parent_id = ".$this->ilDB->quote($this->
getParentId(),
'integer').
" ";
 
   99                         $ilLog->write(__METHOD__.
': No course items found.');
 
  106                         $ilLog->write(__METHOD__.
': Cannot create target object.');
 
  109                 $new_items = 
new ilCourseItems($this->course_ref_id,$a_target_id);
 
  112                         if(!isset($mappings[
$row->parent_id]) or !$mappings[
$row->parent_id])
 
  114                                 $ilLog->write(__METHOD__.
': No mapping for parent nr. '.
$row->parent_id);
 
  117                         if(!isset($mappings[
$row->obj_id]) or !$mappings[
$row->obj_id])
 
  119                                 $ilLog->write(__METHOD__.
': No mapping for item nr. '.
$row->obj_id);
 
  122                         $new_item_id = $mappings[
$row->obj_id];
 
  123                         $new_parent = $mappings[
$row->parent_id];
 
  125                         $new_items->setItemId($new_item_id);
 
  126                         $new_items->setParentId($new_parent);
 
  127                         $new_items->setTimingType(
$row->timing_type);
 
  128                         $new_items->setTimingStart(
$row->timing_start);
 
  129                         $new_items->setTimingEnd(
$row->timing_end);
 
  130                         $new_items->setSuggestionStart(
$row->suggestion_start);
 
  131                         $new_items->setSuggestionEnd(
$row->suggestion_end);
 
  132                         $new_items->toggleChangeable(
$row->changeable);
 
  133                         $new_items->setEarliestStart(
$row->earliest_start);
 
  134                         $new_items->setLatestEnd(
$row->latest_end);
 
  135                         $new_items->toggleVisible(
$row->visible);
 
  136                         $new_items->update($new_item_id);
 
  137                         $ilLog->write(__METHOD__.
': Added new entry for item nr. '.
$row->obj_id);
 
  139                 $ilLog->write(__METHOD__.
': Finished course items.');
 
  144                 $this->item_id = $a_item_id;
 
  149                 return $this->item_id;
 
  155                 return $this->user_id ? $this->user_id : $ilUser->getId();
 
  163                 include_once 
'Services/Tracking/classes/class.ilLPObjSettings.php';
 
  165                 $obj_id = $ilObjDataCache->lookupObjId($a_ref_id);
 
  170                                 include_once 
'Services/Tracking/classes/class.ilLPCollectionCache.php';
 
  174                                 $ids = array($a_ref_id);
 
  182                 $query = 
"SELECT * FROM crs_items ".
 
  184                         "AND ".$ilDB->in(
'obj_id',$ids,
false,
'integer');
 
  187                 return $res->numRows() ? 
true :
false;
 
  201                 $subtree = $tree->getSubTree($tree->getNodeData($a_ref_id));
 
  203                 foreach($subtree as $node)
 
  205                         $ref_ids[] = $node[
'ref_id'];
 
  208                 $query = 
"SELECT * FROM crs_items ".
 
  210                         "AND ".$ilDB->in(
'obj_id',$ref_ids,
false,
'integer').
" ".
 
  211                         "AND ".$ilDB->in(
'parent_id',$ref_ids,
false,
'integer').
" ";
 
  214                 return $res->numRows() ? 
true :
false;
 
  221                 $subtree = $tree->getSubTree($tree->getNodeData($a_ref_id));
 
  223                 foreach($subtree as $node)
 
  225                         $ref_ids[] = $node[
'ref_id'];
 
  228                 $query = 
"SELECT * FROM crs_items ".
 
  230                         "AND changeable = ".$ilDB->quote(1,
'integer').
" ".
 
  231                         "AND ".$ilDB->in(
'obj_id',$ref_ids,
false,
'integer').
" ".
 
  232                         "AND ".$ilDB->in(
'parent_id',$ref_ids,
false,
'integer').
" ";
 
  235                 return $res->numRows() ? 
true :
false;
 
  252                 $this->timing_type = $a_type;
 
  261                 $this->timing_start = $a_start;
 
  269                 $this->timing_end = $a_end;
 
  277                 $this->suggestion_start = $a_start;
 
  281                 return $this->suggestion_start ? $this->suggestion_start : mktime(0,0,1,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  285                 $this->suggestion_end = $a_end;
 
  289                 return $this->suggestion_end ? $this->suggestion_end : mktime(23,55,00,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  293                 $this->earliest_start = $a_start;
 
  297                 return $this->earliest_start ? $this->earliest_start : mktime(0,0,1,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  301                 $this->latest_end = $a_end;
 
  305                 return $this->latest_end ? $this->latest_end : mktime(23,55,00,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  309                 $this->visible = (int) $a_status;
 
  313                 return (
bool) $this->visible;
 
  317                 $this->changeable = (int) $a_status;
 
  321                 return (
bool) $this->changeable;
 
  326                 $this->position = $a_pos;
 
  331                 return $this->items ? $this->items : array();
 
  339                 global $objDefinition;
 
  341                 include_once 
'Modules/Session/classes/class.ilEventItems.php';
 
  344                 foreach($this->items as $item)
 
  346                         if(!in_array($item[
'ref_id'],$event_items) &&
 
  347                                 !$objDefinition->isSideBlock($item[
'type']))
 
  352                 return $filtered ? $filtered : array();
 
  357                 include_once 
'Modules/Session/classes/class.ilEventItems.php';
 
  360                 $event_items = $event_items_obj->getItems();
 
  361                 foreach($event_items as $item)
 
  363                         if($this->tree->isDeleted($item))
 
  368                         $node = $this->tree->getNodeData($item);
 
  369                         if($node[
"ref_id"] == $item)
 
  379                 include_once(
'./Modules/Course/classes/class.ilCourseObjectiveMaterials.php');
 
  383                         if($this->tree->isDeleted($ref_id))
 
  388                         $node = $this->tree->getNodeData($ref_id);
 
  389                         if($node[
"ref_id"] == $ref_id)
 
  402                 foreach($this->items as $item)
 
  404                         if($item[
"type"] != 
"rolf" and
 
  405                            ($item[
"timing_type"] or
 
  406                                 ($item[
"timing_start"] <= time() and $item[
"timing_end"] >= time())))
 
  408                                 if($rbacsystem->checkAccess(
'visible',$item[
'ref_id']))
 
  414                 return $filtered ? $filtered : array();
 
  418                 foreach($this->items as $item)
 
  420                         if($item[
"child"] == $a_item_id)
 
  432                 $ilErr->setMessage(
'');
 
  438                                 $ilErr->appendMessage($this->lng->txt(
"crs_activation_start_invalid"));
 
  445                                 $ilErr->appendMessage($this->lng->txt(
'crs_latest_end_not_valid'));
 
  449                 #if($this->getTimingType() == IL_CRS_TIMINGS_PRESETTING and  
  450                 #   $this->enabledChangeable()) 
  452                 #       if($this->getSuggestionStart() < $this->getEarliestStart() or 
  453                 #          $this->getSuggestionEnd() > $this->getLatestEnd() or 
  454                 #          $this->getSuggestionStart() > $this->getLatestEnd() or 
  455                 #          $this->getSuggestionEnd() < $this->getEarliestStart()) 
  457                 #               $ilErr->appendMessage($this->lng->txt("crs_suggestion_not_within_activation")); 
  461                 if($ilErr->getMessage())
 
  478                 $query = 
"INSERT INTO crs_items (timing_type,timing_start,timing_end,".
 
  479                         "suggestion_start,suggestion_end, ".
 
  480                         "changeable,earliest_start,latest_end,visible,parent_id,obj_id) ".
 
  492                         $ilDB->quote($this->
getItemId(),
'integer').
" ".
 
  502                 $query = 
"UPDATE crs_items SET ".
 
  503                         "timing_type = ".$ilDB->quote($this->
getTimingType(),
'integer').
", ".
 
  504                         "timing_start = ".$ilDB->quote($this->
getTimingStart(),
'integer').
", ".
 
  505                         "timing_end = ".$ilDB->quote($this->
getTimingEnd(),
'integer').
", ".
 
  510                         "latest_end = ".$ilDB->quote($this->
getLatestEnd(),
'integer').
", ".
 
  512                         "WHERE parent_id = ".$ilDB->quote($this->
getParentId(),
'integer').
" ".
 
  513                         "AND obj_id = ".$ilDB->quote($a_item_id,
'integer').
"";
 
  538                 $all_items = $this->tree->getChilds($this->parent);
 
  540                 foreach($all_items as $item)
 
  542                         $query = 
"DELETE FROM crs_items ".
 
  543                                 "WHERE parent_id = ".$ilDB->quote($item[
"child"],
'integer').
"";
 
  546                 $query = 
"DELETE FROM crs_items ".
 
  547                         "WHERE parent_id = ".$ilDB->quote($this->course_ref_id,
'integer').
" ";
 
  558                 $this->items = array();
 
  560                 $ilBench->start(
"Course", 
"ilCouseItems_read - getChilds");
 
  561                 $all_items = $this->tree->getChilds($this->parent);
 
  562                 $ilBench->stop(
"Course", 
"ilCouseItems_read - getChilds");
 
  564                 foreach($all_items as $item)
 
  566                         if($item[
"type"] != 
'rolf')
 
  568                                 $this->items[] = $item;
 
  571                 $ilBench->start(
"Course", 
"ilCouseItems_read - getItemData");
 
  572                 for($i = 0;$i < count($this->items); ++$i)
 
  574                         if($this->items[$i][
"type"] == 
'rolf')
 
  576                                 unset($this->items[$i]);
 
  581                 $ilBench->stop(
"Course", 
"ilCouseItems_read - getItemData");
 
  583                 $ilBench->start(
"Course", 
"ilCouseItems_read - purge and sort");
 
  586                 $ilBench->stop(
"Course", 
"ilCouseItems_read - purge and sort");
 
  589                 $this->items_per_child = array();
 
  590                 foreach($this->items as $item)
 
  592                         $this->items_per_child[$item[
"child"]] = $item;
 
  604                 $query = 
"SELECT obj_id FROM crs_items ".
 
  605                         "WHERE parent_id = ".$ilDB->quote($this->
getParentId(),
'integer').
" ";
 
  622                 $query = 
"DELETE FROM crs_items ".
 
  623                         "WHERE parent_id = ".$ilDB->quote($this->
getParentId(),
'integer').
" ".
 
  624                         "AND obj_id = ".$ilDB->quote($a_obj_id,
'integer').
" ";
 
  634                 $ilBench->start(
"Course", 
"ilCourseItems_getItemData - 1");
 
  635                 $query = 
"SELECT * FROM crs_items  ".
 
  636                         "WHERE obj_id = ".$ilDB->quote($a_item[
'child'],
'integer').
" ".
 
  637                         "AND parent_id = ".$ilDB->quote($a_item[
'parent'],
'integer').
" ";
 
  639                 $ilBench->stop(
"Course", 
"ilCourseItems_getItemData - 1");
 
  642                         $ilBench->start(
"Course", 
"ilCourseItems_getItemData - 2");
 
  643                         $a_item[
"timing_type"] = 
$row->timing_type;
 
  644                         $a_item[
"timing_start"]         = 
$row->timing_start;
 
  645                         $a_item[
"timing_end"]           = 
$row->timing_end;
 
  646                         $a_item[
"suggestion_start"]             = 
$row->suggestion_start ? 
$row->suggestion_start :
 
  647                                 mktime(0,0,1,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  648                         $a_item[
"suggestion_end"]               = 
$row->suggestion_end ? 
$row->suggestion_end :
 
  649                                 mktime(23,55,00,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  650                         $a_item[
'changeable']                   = 
$row->changeable;
 
  651                         $a_item[
'earliest_start']               = 
$row->earliest_start ? 
$row->earliest_start :
 
  652                                 mktime(0,0,1,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  653                         $a_item[
'latest_end']                   = 
$row->latest_end ? 
$row->latest_end : 
 
  654                                 mktime(23,55,00,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  655                         $a_item[
'visible']                              = 
$row->visible;
 
  657                         include_once 
'Modules/Course/classes/Timings/class.ilTimingPlaned.php';
 
  659                         $ilBench->stop(
"Course", 
"ilCourseItems_getItemData - 2");
 
  661                         $ilBench->start(
"Course", 
"ilCourseItems_getItemData - 3");
 
  664                         $obj_id = ($a_item[
'obj_id'] > 0)
 
  666                                 : $ilObjDataCache->lookupObjId(
$row->obj_id);
 
  667                         $obj_type = ($a_item[
'type'] != 
"")
 
  669                                 : $ilObjDataCache->lookupType($obj_id);
 
  672                         $ilBench->stop(
"Course", 
"ilCourseItems_getItemData - 3");
 
  677                         $ilBench->start(
"Course", 
"ilCourseItems_getItemData - 4");
 
  678                         if($a_item[
'changeable'] and 
 
  681                                 if(
$data[
'planed_start'])
 
  683                                         $a_item[
'start'] = 
$data[
'planed_start'];
 
  684                                         $a_item[
'end'] = 
$data[
'planed_end'];
 
  685                                         $a_item[
'activation_info'] = 
'crs_timings_planed_info';
 
  689                                         $a_item[
'start'] = 
$row->suggestion_start;
 
  690                                         $a_item[
'end'] = 
$row->suggestion_end;
 
  691                                         $a_item[
'activation_info'] = 
'crs_timings_suggested_info';
 
  696                                 $a_item[
'start'] = 
$row->suggestion_start;
 
  697                                 $a_item[
'end'] = 
$row->suggestion_end;
 
  698                                 $a_item[
'activation_info'] = 
'crs_timings_suggested_info';
 
  702                                 $a_item[
'start'] = 
$row->timing_start;
 
  703                                 $a_item[
'end'] = 
$row->timing_end;
 
  704                                 $a_item[
'activation_info'] = 
'activation';
 
  706                         elseif($obj_type == 
'sess')
 
  708                                 include_once(
'./Modules/Session/classes/class.ilSessionAppointment.php');
 
  710                                 $ilBench->start(
"Course", 
"ilCourseItems_getItemData - lookupAppointment");
 
  712                                 $ilBench->stop(
"Course", 
"ilCourseItems_getItemData - lookupAppointment");
 
  715                                 $a_item[
'start'] = $info[
'start'];
 
  716                                 $a_item[
'end'] = $info[
'end'];
 
  717                                 $a_item[
'fullday'] = $info[
'fullday'];
 
  718                                 $a_item[
'activation_info'] = 
'crs_timings_suggested_info';
 
  722                                 $a_item[
'start'] = 999999999;
 
  724                         $ilBench->stop(
"Course", 
"ilCourseItems_getItemData - 4");
 
  727                 $ilBench->start(
"Course", 
"ilCourseItems_getItemData - 5");
 
  728                 if(!isset($a_item[
"timing_start"]))
 
  732                 $ilBench->stop(
"Course", 
"ilCourseItems_getItemData - 5");
 
  739                 global 
$ilDB, $objDefinition;
 
  742                 $a_item[
"timing_start"]         = time();
 
  743                 $a_item[
"timing_end"]           = time();
 
  744                 $a_item[
"suggestion_start"]             = time();
 
  745                 $a_item[
"suggestion_end"]               = time();
 
  746                 $a_item[
'visible']                              = 0;
 
  747                 $a_item[
'changeable']                   = 0;
 
  748                 $a_item[
'earliest_start']               = time();
 
  749                 $a_item[
'latest_end']           = mktime(23,55,00,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  750                 $a_item[
'visible']                              = 0;
 
  751                 $a_item[
'changeable']                   = 0;
 
  754                 $query = 
"INSERT INTO crs_items (parent_id,obj_id,timing_type,timing_start,timing_end," .
 
  755                         "suggestion_start,suggestion_end, ".
 
  756                         "changeable,earliest_start,latest_end,visible,position) ".
 
  758                         $ilDB->quote($a_item[
'parent'],
'integer').
",".
 
  759                         $ilDB->quote($a_item[
"child"],
'integer').
",".
 
  760                         $ilDB->quote($a_item[
"timing_type"],
'integer').
",".
 
  761                         $ilDB->quote($a_item[
"timing_start"],
'integer').
",".
 
  762                         $ilDB->quote($a_item[
"timing_end"],
'integer').
",".
 
  763                         $ilDB->quote($a_item[
"suggestion_start"],
'integer').
",".
 
  764                         $ilDB->quote($a_item[
"suggestion_end"],
'integer').
",".
 
  765                         $ilDB->quote($a_item[
"changeable"],
'integer').
",".
 
  766                         $ilDB->quote($a_item[
'earliest_start'],
'integer').
", ".
 
  767                         $ilDB->quote($a_item[
'latest_end'],
'integer').
", ".
 
  768                         $ilDB->quote($a_item[
"visible"],
'integer').
", ".
 
  769                         $ilDB->quote(0,
'integer').
")";
 
  780                 $query = 
"SELECT MAX(position) last_position FROM crs_items ".
 
  781                         "WHERE parent_id = ".$ilDB->quote($this->
getParentId(),
'integer').
" ";
 
  786                         $max = 
$row->last_position;
 
  788                 return $max ? $max : 0;
 
  795                 include_once 
'Modules/Session/classes/class.ilEventItems.php';
 
  797                 global $ilObjDataCache;
 
  799                 if($ilObjDataCache->lookupType($ilObjDataCache->lookupObjId($a_ref_id)) != 
'crs')
 
  814                 if(!$node_b[
"obj_id"])
 
  819                 $query = 
"UPDATE crs_items SET ".
 
  820                         "position = ".$ilDB->quote($node_a[
"position"],
'integer').
" ".
 
  821                         "WHERE obj_id = ".$ilDB->quote($node_b[
"obj_id"],
'integer').
" ".
 
  822                         "AND parent_id = ".$ilDB->quote($this->
getParentId(),
'integer').
"";
 
  825                 $query = 
"UPDATE crs_items SET ".
 
  826                         "position = ".$ilDB->quote($node_b[
"position"],
'integer').
" ".
 
  827                         "WHERE obj_id = ".$ilDB->quote($node_a[
"obj_id"],
'integer').
" ".
 
  828                         "AND parent_id = ".$ilDB->quote($this->
getParentId(),
'integer').
"";
 
  842         public static function _sort($a_sort_mode,$a_items)
 
  849                                 $inactive = $active = array();
 
  850                                 foreach($a_items as $item)
 
  864                                 return array_merge($sorted_active,$sorted_inactive);
 
  877                 include_once 
'./Services/Container/classes/class.ilContainerSortingSettings.php';
 
  889                                 $this->items = array_merge($sorted_active,$sorted_inactive);
 
  900                 $inactive = $active = array();
 
  901                 foreach($this->items as $item)
 
  912                 return array($active,$inactive);
 
  921                 include_once 
'Modules/Course/classes/class.ilObjCourse.php';
 
  923                 global 
$ilDB,$ilUser;
 
  925                 $query = 
"SELECT * FROM crs_items ".
 
  926                         "WHERE obj_id = ".$ilDB->quote($a_item_id,
'integer');
 
  934                         $data[
'timing_type'] = 
$row->timing_type;
 
  935                         $data[
'timing_start'] = 
$row->timing_start;
 
  937                         $data[
"suggestion_start"] = 
$row->suggestion_start ? 
$row->suggestion_start :
 
  938                                 mktime(0,0,1,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  939                         $data[
"suggestion_end"] = 
$row->suggestion_end ? 
$row->suggestion_end :
 
  940                                 mktime(23,55,00,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  942                         $data[
'earliest_start'] = 
$row->earliest_start ? 
$row->earliest_start :
 
  943                                 mktime(0,0,1,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  945                                 mktime(23,55,00,date(
'n',time()),date(
'j',time()),date(
'Y',time()));
 
  949                         include_once 
'Modules/Course/classes/Timings/class.ilTimingPlaned.php';
 
  953                         if(
$data[
'changeable'] and 
 
  956                                 if($user_data[
'planed_start'])
 
  958                                         $data[
'start'] = $user_data[
'planed_start'];
 
  959                                         $data[
'end'] = $user_data[
'planed_end'];
 
  960                                         $data[
'activation_info'] = 
'crs_timings_planed_info';
 
  966                                         $data[
'activation_info'] = 
'crs_timings_suggested_info';
 
  973                                 $data[
'activation_info'] = 
'crs_timings_suggested_info';
 
  979                                 $data[
'activation_info'] = 
'activation';
 
  983                                 $data[
'start'] = 999999999;
 
  993                 $query = 
"SELECT * FROM crs_items ".
 
  994                         "WHERE obj_id = ".$ilDB->quote($a_item_id,
'integer').
" ";
 
  999                         if(
$row->activation_unlimited)
 
 1003                         if(time() > 
$row->activation_start and time() < 
$row->activation_end)
 
 1022                 if(!is_array($a_ref_ids) or !$a_ref_ids)
 
 1027                 $query = 
"SELECT obj_id,timing_type,timing_start,timing_end,visible FROM crs_items ".
 
 1028                         "WHERE ".$ilDB->in(
'obj_id',$a_ref_ids,
false,
'integer');
 
 1033                         $ac_times[(string) 
$row->obj_id][
'obj_id'] = 
$row->obj_id;
 
 1034                         $ac_times[(
string) 
$row->obj_id][
'timing_type'] = 
$row->timing_type;
 
 1035                         $ac_times[(string) 
$row->obj_id][
'timing_start'] = 
$row->timing_start;
 
 1036                         $ac_times[(
string) 
$row->obj_id][
'timing_end'] = 
$row->timing_end;
 
 1037                         $ac_times[(string) 
$row->obj_id][
'visible'] = 
$row->visible;
 
 1040                 return $ac_times ? $ac_times : array();
 
 1048                 if (is_array($this->items_per_child[$a_item[
"child"]]))
 
 1050                         $a_item = array_merge($a_item, $this->items_per_child[$a_item[
"child"]]);