19 declare(strict_types=1);
57 $this->error = $DIC[
"ilErr"];
58 $this->
lng = $DIC->language();
59 $this->db = $DIC->database();
64 $this->timing_type = $type;
74 $this->timing_start = $start;
84 $this->timing_end = $end;
97 $this->suggestion_start = $start;
105 $this->suggestion_start_rel = $start;
113 $this->suggestion_end_rel = $end;
121 $this->suggestion_end = $end;
126 $this->visible = $status;
136 $this->changeable = (
int) $status;
149 "timing_end" => [
"integer", $this->
getTimingEnd() ?? 0],
150 "suggestion_start" => [
"integer", $this->suggestion_start ?? 0],
151 "suggestion_end" => [
"integer", $this->suggestion_end ?? 0],
153 "suggestion_start_rel" => [
"integer", $this->suggestion_start_rel ?? 0],
154 "suggestion_end_rel" => [
"integer", $this->suggestion_end_rel ?? 0],
158 if (!is_null($parent_id)) {
159 $values[
"parent_id"] = [
"integer", $parent_id];
163 "obj_id" => [
"integer",
$ref_id]
166 $this->db->update(
"crs_items", $values, $where);
168 unset(self::$preloaded_data[$ref_id]);
179 $db = $DIC->database();
182 "SELECT parent_id, obj_id, timing_type, timing_start, timing_end, suggestion_start," . PHP_EOL
183 .
"suggestion_end, changeable, visible, position, suggestion_start_rel, suggestion_end_rel" . PHP_EOL
184 .
"FROM crs_items" . PHP_EOL
185 .
"WHERE " . $db->
in(
"obj_id", $ref_ids,
false,
"integer") . PHP_EOL
187 $set = $db->
query($sql);
189 self::$preloaded_data[$row[
"obj_id"]] = $row;
196 $db = $DIC->database();
198 if (isset(self::$preloaded_data[$ref_id])) {
199 return self::$preloaded_data[
$ref_id];
203 "SELECT parent_id, obj_id, timing_type, timing_start, timing_end, suggestion_start," . PHP_EOL
204 .
"suggestion_end, changeable, visible, position, suggestion_start_rel, suggestion_end_rel" . PHP_EOL
205 .
"FROM crs_items" . PHP_EOL
206 .
"WHERE obj_id = " . $db->
quote($ref_id,
"integer") . PHP_EOL
208 $set = $db->
query($sql);
211 if (!isset($row[
"obj_id"])) {
212 $row = self::createDefaultEntry($ref_id);
214 self::$preloaded_data[$row[
"obj_id"]] = $row;
225 $ilUser = $DIC->user();
227 $item_array = self::getItem((
int) $item[
'ref_id']);
229 $item[
'obj_id'] = ($item[
'obj_id'] > 0)
232 $item[
'type'] = ($item[
'type'] !=
'')
236 $item[
'timing_type'] = $item_array[
'timing_type'] ?? 0;
238 if ($item_array[
'timing_type'] == self::TIMINGS_PRESETTING &&
240 ($item_array[
'changeable'] ??
false) ||
245 $user_data =
new ilTimingUser((
int) $item[
'ref_id'], $ilUser->getId());
246 if ($user_data->isScheduled()) {
248 $item[
'end'] = $user_data->getEnd()->get(
IL_CAL_UNIX);
249 $item[
'activation_info'] =
'crs_timings_planed_info';
251 $item[
'start'] = $item_array[
'suggestion_start'] ??
"";
252 $item[
'end'] = $item_array[
'suggestion_end'] ??
"";
253 $item[
'activation_info'] =
'crs_timings_suggested_info';
256 } elseif (($item_array[
'timing_type'] ?? 0) == self::TIMINGS_PRESETTING) {
257 $item[
'start'] = $item_array[
'suggestion_start'] ??
"";
258 $item[
'end'] = $item_array[
'suggestion_end'] ??
"";
259 $item[
'activation_info'] =
'crs_timings_suggested_info';
260 } elseif (($item_array[
'timing_type'] ?? 0) == self::TIMINGS_ACTIVATION) {
261 $item[
'start'] = $item_array[
'timing_start'] ??
"";
262 $item[
'end'] = $item_array[
'timing_end'] ??
"";
263 $item[
'activation_info'] =
'obj_activation_list_gui';
267 if ($item[
'type'] ==
'sess') {
270 $item[
'masked_start'] = $item[
'start'] ??
'';
271 $item[
'masked_end'] = $item[
'end'] ??
'';
272 $item[
'start'] = $info[
'start'] ??
'';
273 $item[
'end'] = $info[
'end'] ??
'';
282 self::addAdditionalSubItemInformation($item);
283 if (isset($item[
'timing_type'])) {
284 if (!isset($item[
'masked_start'])) {
285 $start = $item[
'start'] ?? 0;
286 $end = $item[
'end'] ?? 0;
288 $start = $item[
'masked_start'];
289 $end = $item[
'masked_end'];
292 switch ($item[
'timing_type']) {
307 if ($activation !=
"") {
310 $lng = $DIC->language();
314 $lng->
txt($item[
'activation_info']),
330 $db = $DIC->database();
331 $tree = $DIC->repositoryTree();
333 $parent_id = $tree->getParentId($ref_id);
339 $ilAtomQuery->addTableLock(
"crs_items");
341 $ilAtomQuery->addQueryCallable(
function (
ilDBInterface $db) use ($ref_id, $parent_id, &$item):
void {
343 "SELECT parent_id, obj_id, timing_type, timing_start, timing_end, suggestion_start," . PHP_EOL
344 .
"suggestion_end, changeable, visible, position, suggestion_start_rel, suggestion_end_rel" . PHP_EOL
345 .
"FROM crs_items" . PHP_EOL
346 .
"WHERE obj_id = " . $db->
quote($ref_id,
"integer") . PHP_EOL
348 $set = $db->
query($sql);
353 $item[
"timing_type"] = self::TIMINGS_DEACTIVATED;
354 $item[
"timing_start"] = $now;
355 $item[
"timing_end"] = $now;
356 $item[
"suggestion_start"] = $now;
357 $item[
"suggestion_end"] = $now;
358 $item[
'visible'] = 0;
359 $item[
'changeable'] = 0;
362 "parent_id" => [
"integer", $parent_id],
363 "obj_id" => [
"integer",
$ref_id],
364 "timing_type" => [
"integer", $item[
"timing_type"]],
365 "timing_start" => [
"integer", $item[
"timing_start"]],
366 "timing_end" => [
"integer", $item[
"timing_end"]],
367 "suggestion_start" => [
"integer", $item[
"suggestion_start"]],
368 "suggestion_end" => [
"integer", $item[
"suggestion_end"]],
369 "changeable" => [
"integer", $item[
"changeable"]],
370 "visible" => [
"integer", $item[
"visible"]],
371 "suggestion_start_rel" => [
"integer", $item[
"suggestion_start_rel"] ?? 0],
372 "suggestion_end_rel" => [
"integer", $item[
"suggestion_end_rel"] ?? 0],
373 "position" => [
"integer", 0]
375 $db->
insert(
"crs_items", $values);
383 $item[
"parent_id"] = $parent_id;
395 $db = $DIC->database();
402 "DELETE FROM crs_items " . PHP_EOL
403 .
"WHERE obj_id = " . $db->
quote($ref_id,
'integer') . PHP_EOL
408 "DELETE FROM crs_items " . PHP_EOL
409 .
"WHERE parent_id = " . $db->
quote($ref_id,
'integer') . PHP_EOL
420 $ilLog = $DIC[
"ilLog"];
422 $ilLog->write(__METHOD__ .
': Begin course items...' . $ref_id);
424 $items = self::getItems($ref_id,
false);
426 $ilLog->write(__METHOD__ .
': No course items found.');
432 $ilLog->write(__METHOD__ .
': Cannot create target object.');
437 $mappings = $cp_options->getMappings();
439 foreach ($items as $item) {
440 if (!isset($mappings[$item[
'parent_id']]) or !$mappings[$item[
'parent_id']]) {
441 $ilLog->write(__METHOD__ .
': No mapping for parent nr. ' . $item[
'parent_id']);
444 if (!isset($mappings[$item[
'obj_id']]) or !$mappings[$item[
'obj_id']]) {
445 $ilLog->write(__METHOD__ .
': No mapping for item nr. ' . $item[
'obj_id']);
448 $new_item_id = $mappings[$item[
'obj_id']];
449 $new_parent = $mappings[$item[
'parent_id']];
451 $new_item =
new self();
452 $new_item->setTimingType((
int) $item[
'timing_type']);
453 $new_item->setTimingStart((
int) $item[
'timing_start']);
454 $new_item->setTimingEnd((
int) $item[
'timing_end']);
455 $new_item->setSuggestionStart((
int) $item[
'suggestion_start']);
456 $new_item->setSuggestionEnd((
int) $item[
'suggestion_end']);
457 $new_item->toggleChangeable((
bool) $item[
'changeable']);
458 $new_item->toggleVisible((
bool) $item[
'visible']);
459 $new_item->update($new_item_id, $new_parent);
460 $new_item->setSuggestionStartRelative((
int) ($item[
'suggestion_start_rel'] ?? 0));
461 $new_item->setSuggestionEndRelative((
int) ($item[
'suggestion_end_rel'] ?? 0));
462 $new_item->createDefaultEntry($new_item_id);
463 $new_item->update($new_item_id);
479 $tree = $DIC->repositoryTree();
480 $db = $DIC->database();
482 $subtree = $tree->getSubTree($tree->getNodeData($ref_id));
484 foreach ($subtree as $node) {
485 $ref_ids[] = $node[
'ref_id'];
489 "SELECT parent_id" . PHP_EOL
490 .
"FROM crs_items" . PHP_EOL
491 .
"WHERE timing_type = " . $db->
quote(self::TIMINGS_PRESETTING,
'integer') . PHP_EOL
492 .
"AND " . $db->
in(
'obj_id', $ref_ids,
false,
'integer') . PHP_EOL
495 return (
bool)
$res->numRows();
505 $tree = $DIC->repositoryTree();
506 $db = $DIC->database();
508 $subtree = $tree->getSubTree($tree->getNodeData($ref_id));
510 foreach ($subtree as $node) {
511 $ref_ids[] = $node[
'ref_id'];
515 "SELECT parent_id" . PHP_EOL
516 .
"FROM crs_items" . PHP_EOL
517 .
"WHERE timing_type = " . $db->
quote(self::TIMINGS_PRESETTING,
'integer') . PHP_EOL
518 .
"AND changeable = " . $db->
quote(1,
'integer') . PHP_EOL
519 .
"AND " . $db->
in(
'obj_id', $ref_ids,
false,
'integer') . PHP_EOL
522 return (
bool)
$res->numRows();
532 $tree = $DIC->repositoryTree();
536 foreach (array_map(
'intval', $ref_ids) as $item_ref_id) {
537 if ($tree->isDeleted($item_ref_id)) {
541 $node = $tree->getNodeData($item_ref_id);
542 if (!isset($node[
"ref_id"]) || (
int) $node[
"ref_id"] !== $item_ref_id) {
545 $res[$item_ref_id] = $node;
549 self::preloadData(array_keys(
$res));
550 foreach (
$res as $idx => $item) {
551 self::addAdditionalSubItemInformation($item);
556 return array_values(
$res);
565 return self::processListItems($event_items->getItems());
574 $items = $ig_items->getValidItems();
575 return self::processListItems($items);
584 return self::processListItems($item_ids);
590 public static function getItems(
int $parent_id,
bool $with_list_data =
true): array
594 $tree = $DIC->repositoryTree();
599 foreach ($tree->getChilds($parent_id) as $item) {
600 if ($item[
'type'] !==
'rolf') {
602 $ref_ids[] = (
int) $item[
'ref_id'];
607 self::preloadData($ref_ids);
609 foreach ($items as $idx => $item) {
610 if (!$with_list_data) {
611 $items[$idx] = array_merge($item, self::getItem((
int) $item[
'ref_id']));
613 self::addAdditionalSubItemInformation($item);
614 $items[$idx] = $item;
626 $items = self::getItems($parent_id,
false);
627 $active = $availability = $inactive = [];
628 foreach ($items as $item) {
629 if ($item[
'timing_type'] == self::TIMINGS_DEACTIVATED) {
631 } elseif ($item[
'timing_type'] == self::TIMINGS_ACTIVATION) {
632 $availability[] = $item;
641 $items = array_merge($active, $availability, $inactive);
652 $objDefinition = $DIC[
"objDefinition"];
657 foreach (self::getTimingsAdministrationItems($container_ref_id) as $item) {
658 if (!in_array($item[
'ref_id'], $event_items) &&
659 !$objDefinition->isSideBlock($item[
'type'])) {
670 $db = $DIC->database();
673 "SELECT parent_id, obj_id, timing_type, timing_start, timing_end, suggestion_start," . PHP_EOL
674 .
"suggestion_end, changeable, visible, position, suggestion_start_rel, suggestion_end_rel" . PHP_EOL
675 .
"FROM crs_items" . PHP_EOL
676 .
"WHERE obj_id = " . $db->
quote($ref_id,
'integer') . PHP_EOL
680 $sql .=
"AND parent_id = " . $db->
quote($parent_id,
"integer") . PHP_EOL;
static lookupTimingMode(int $a_obj_id)
static deleteAllEntries(int $ref_id)
Delete all db entries for ref id.
static _getAssignedMaterials(int $a_objective_id)
int $suggestion_start_rel
numRows(ilDBStatement $statement)
insert(string $table_name, array $values)
static hasChangeableTimings(int $ref_id)
Check if there is any active changeable timing (in subtree)
getStart()
Use to set start date.
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
static getItemsByEvent(int $event_id)
Get session material / event items.
fetchAssoc(ilDBStatement $statement)
static processListItems(array $ref_ids)
Validate ref ids and add list data.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
toggleChangeable(bool $status)
const TIMINGS_DEACTIVATED
setSuggestionEnd(?int $end)
quote($value, string $type)
loadLanguageModule(string $a_module)
Load language module.
setTimingStart(?int $start)
static createDefaultEntry(int $ref_id)
Create db entry with default values.
static _getItemsOfContainer(int $a_ref_id)
static cloneDependencies(int $ref_id, int $target_id, int $copy_id)
static _lookupObjId(int $ref_id)
static getItems(int $parent_id, bool $with_list_data=true)
Get sub item data.
static array $preloaded_data
static getTimingsAdministrationItems(int $parent_id)
Get (sub) item data for timings administration view (active/inactive)
static _lookupAppointment(int $a_obj_id)
static preloadData(array $ref_ids)
Preload data to internal cache.
static getTimingsItems(int $container_ref_id)
Get (sub) item data for timings view (no session material, no side blocks)
read(int $ref_id, int $parent_id=0)
static getInstanceByRefId(int $ref_id, bool $stop_on_error=true)
get an instance of an Ilias object by reference id
setSuggestionStartRelative(?int $start)
const IL_CRS_VIEW_TIMING_RELATIVE
static addListGUIActivationProperty(ilObjectListGUI $list_gui, array &$item)
Get timing details for list gui.
query(string $query)
Run a (read-only) Query on the database.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
toggleVisible(bool $status)
static getItemsByItemGroup(int $item_group_ref_id)
Get materials of item group.
setSuggestionEndRelative(int $end)
in(string $field, array $values, bool $negate=false, string $type="")
static getItem(int $ref_id)
Error Handling & global info handling.
static getItemsByObjective(int $objective_id)
Get objective items.
static formatPeriod(ilDateTime $start, ilDateTime $end, bool $a_skip_starting_day=false)
Format a period of two dates Shows: 14.
static addAdditionalSubItemInformation(array &$item)
Parse item data for list entries.
static hasTimings(int $ref_id)
Check if there is any active timing (in subtree)
static _getInstance(int $a_copy_id)
manipulate(string $query)
Run a (write) Query on the database.
static _lookupType(int $id, bool $reference=false)
setSuggestionStart(?int $start)
update(int $ref_id, ?int $parent_id=null)
Class ilObjectActivation.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
addCustomProperty(string $property='', string $value='', bool $alert=false, bool $newline=false)
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)