diff options
| author | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
|---|---|---|
| committer | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
| commit | 4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch) | |
| tree | 5c07151ae61276d334e88f6309c30d439a85c12e /lib/classes/StudipSemTree.php | |
| parent | da0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff) | |
| parent | 97a188592c679890a25c37ab78463add76a52ff7 (diff) | |
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/classes/StudipSemTree.php')
| -rw-r--r-- | lib/classes/StudipSemTree.php | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/lib/classes/StudipSemTree.php b/lib/classes/StudipSemTree.php new file mode 100644 index 0000000..70743ad --- /dev/null +++ b/lib/classes/StudipSemTree.php @@ -0,0 +1,312 @@ +<?php +# Lifter007: TODO +# Lifter003: TODO + +/** + * class to handle the seminar tree + * + * This class provides an interface to the structure of the seminar tree + * + * @access public + * @author André Noack <noack@data-quest.de> + * @license GPL2 or any later version + * @copyright 2003 André Noack <noack@data-quest.de>, + * Suchi & Berg GmbH <info@data-quest.de> + */ +class StudipSemTree extends TreeAbstract +{ + public $sem_dates = []; + public $sem_number = null; + public $visible_only = false; + public $sem_status = []; + protected $entries_init_done = false; + + /** + * constructor + * + * do not use directly, call TreeAbstract::GetInstance("StudipRangeTree") + * @access private + */ + public function __construct($args) + { + DbView::addView('sem_tree'); + + $this->root_name = Config::get()->UNI_NAME_CLEAN; + if (isset($args['visible_only'])) { + $this->visible_only = (int) $args['visible_only']; + } + if (isset($args['sem_number']) ){ + $this->sem_number = array_map('intval', $args['sem_number']); + } + if (!empty($args['sem_status'])) { + $this->sem_status = array_map('intval', $args['sem_status']); + } else { + foreach ($GLOBALS['SEM_CLASS'] as $key => $value){ + if ($value['bereiche']){ + foreach ($GLOBALS['SEM_TYPE'] as $type_key => $type_value) { + if($type_value['class'] == $key) + $this->sem_status[] = $type_key; + } + } + } + } + + if (!count($this->sem_status)){ + $this->sem_status[] = -1; + } + + parent::__construct(); //calling the baseclass constructor + if (isset($args['build_index']) ){ + $this->buildIndex(); + } + + $this->sem_dates = Semester::findAllVisible(); + } + + /** + * initializes the tree + * + * stores all rows from table sem_tree in array $tree_data + * @access public + */ + public function init() + { + parent::init(); + + $db = $this->view->get_query("view:SEM_TREE_GET_DATA_NO_ENTRIES"); + + while ($db->next_record()){ + $this->tree_data[$db->f("sem_tree_id")] = ['type' => $db->f('type'), "info" => $db->f("info"), "entries" => 0]; + $name = $db->f("name"); + $this->storeItem($db->f("sem_tree_id"), $db->f("parent_id"), $name, $db->f("priority")); + } + } + + public function initEntries() + { + $this->view->params[0] = $this->sem_status; + $this->view->params[1] = $this->visible_only ? "visible=1" : "1"; + $this->view->params[1] .= (isset($this->sem_number)) ? " AND ((" . $this->view->sem_number_sql + . ") IN (" . join(",",$this->sem_number) .") OR ((" . $this->view->sem_number_sql + .") <= " . $this->sem_number[count($this->sem_number)-1] + . " AND ((" . $this->view->sem_number_end_sql . ") >= " . $this->sem_number[count($this->sem_number)-1] + . " OR (" . $this->view->sem_number_end_sql . ") = -1))) " : ""; + + $db = $this->view->get_query("view:SEM_TREE_GET_ENTRIES"); + while ($db->next_record()){ + $this->tree_data[$db->f("sem_tree_id")]['entries'] = $db->f('entries'); + } + $this->entries_init_done = true; + } + + public function isModuleItem($item_id) + { + return isset($GLOBALS['SEM_TREE_TYPES'][$this->getValue($item_id, 'type')]['is_module']); + } + + public function isHiddenItem($item_id) + { + return !empty($GLOBALS['SEM_TREE_TYPES'][$this->getValue($item_id, 'type')]['hidden']); + } + + public function getSemIds($item_id,$ids_from_kids = false) + { + if (empty($this->tree_data[$item_id])) { + return false; + } + $this->view->params[0] = $this->sem_status; + $this->view->params[1] = $this->visible_only ? "visible=1" : "1"; + if ($ids_from_kids && $item_id != 'root'){ + $this->view->params[2] = $this->getKidsKids($item_id); + } + $this->view->params[2][] = $item_id; + $this->view->params[3] = (isset($this->sem_number)) ? " HAVING sem_number IN (" . join(",",$this->sem_number) .") OR (sem_number <= " . $this->sem_number[count($this->sem_number)-1] . " AND (sem_number_end >= " . $this->sem_number[count($this->sem_number)-1] . " OR sem_number_end = -1)) " : ""; + $ret = false; + if ($item_id == 'root' && $ids_from_kids) { + unset($this->view->params[2]); + $this->view->params = array_values($this->view->params); + $rs = $this->view->get_query("view:SEM_TREE_GET_SEMIDS_ROOT"); + } else { + $rs = $this->view->get_query("view:SEM_TREE_GET_SEMIDS"); + } + while($rs->next_record()){ + $ret[] = $rs->f(0); + } + return $ret; + } + + public function getSemData($item_id,$sem_data_from_kids = false) + { + if (!$this->tree_data[$item_id]) + return false; + $this->view->params[0] = $this->sem_status; + $this->view->params[1] = $this->visible_only ? "visible=1" : "1"; + if ($sem_data_from_kids && $item_id != 'root'){ + $this->view->params[2] = $this->getKidsKids($item_id); + } + $this->view->params[2][] = $item_id; + $this->view->params[3] = (isset($this->sem_number)) ? " HAVING sem_number IN (" . join(",",$this->sem_number) .") OR (sem_number <= " . $this->sem_number[count($this->sem_number)-1] . " AND (sem_number_end >= " . $this->sem_number[count($this->sem_number)-1] . " OR sem_number_end = -1)) " : ""; + if ($item_id == 'root' && $sem_data_from_kids) { + unset($this->view->params[2]); + $this->view->params = array_values($this->view->params); + $rs = $this->view->get_query("view:SEM_TREE_GET_SEMDATA_ROOT"); + } else { + $rs = $this->view->get_query("view:SEM_TREE_GET_SEMDATA"); + } + return new DbSnapshot($rs); + } + + public function getLonelySemData($item_id) + { + if (!$institut_id = $this->tree_data[$item_id]['studip_object_id']) + return false; + $this->view->params[0] = $this->sem_status; + $this->view->params[1] = $this->visible_only ? "visible=1" : "1"; + $this->view->params[2] = $institut_id; + $this->view->params[3] = (isset($this->sem_number)) ? " HAVING sem_number IN (" . join(",",$this->sem_number) .") OR (sem_number <= " . $this->sem_number[count($this->sem_number)-1] . " AND (sem_number_end >= " . $this->sem_number[count($this->sem_number)-1] . " OR sem_number_end = -1)) " : ""; + return new DbSnapshot($this->view->get_query("view:SEM_TREE_GET_LONELY_SEM_DATA")); + } + + public function getNumEntries($item_id, $num_entries_from_kids = false) + { + if (empty($this->tree_data[$item_id])) { + return false; + } + + if (empty($this->entries_init_done)) { + $this->initEntries(); + } + + return parent::getNumEntries($item_id, $num_entries_from_kids); + /* + if (!$num_entries_from_kids){ + return $this->tree_data[$item_id]["entries"]; + } else { + $item_list = $this->getKidsKids($item_id); + $item_list[] = $item_id; + $ret = 0; + $num_items = count($item_list); + for ($i = 0; $i < $num_items; ++$i){ + $ret += $this->tree_data[$item_list[$i]]["entries"]; + } + return $ret; + } + */ + } + + public function getAdminRange($item_id) + { + if (!$this->tree_data[$item_id]) + return false; + if ($item_id == "root") + return "root"; + $ret_id = $item_id; + while ($ret_id != "root"){ + $ret_id = $this->tree_data[$ret_id]['parent_id']; + } + return $ret_id; + } + + public function InsertItem($item_id, $parent_id, $item_name, $item_info, $priority, $studip_object_id, $type) + { + $view = new DbView(); + $view->params = [$item_id,$parent_id,$item_name,$priority,$item_info,$studip_object_id, $type]; + $rs = $view->get_query("view:SEM_TREE_INS_ITEM"); + // Logging + StudipLog::log("STUDYAREA_ADD",$item_id); + NotificationCenter::postNotification("StudyAreaDidCreate", $item_id, $GLOBALS['user']->id); + + return $rs->affected_rows(); + } + + public function UpdateItem($item_id, $item_name, $item_info, $type) + { + $view = new DbView(); + $view->params = [$item_name,$item_info,$type,$item_id]; + $rs = $view->get_query("view:SEM_TREE_UPD_ITEM"); + NotificationCenter::postNotification("StudyAreaDidUpdate", $item_id, $GLOBALS['user']->id); + + return $rs->affected_rows(); + } + + public function DeleteItems($items_to_delete) + { + $view = new DbView(); + $view->params[0] = (is_array($items_to_delete)) ? $items_to_delete : [$items_to_delete]; + $view->auto_free_params = false; + $rs = $view->get_query("view:SEM_TREE_DEL_ITEM"); + $deleted['items'] = $rs->affected_rows(); + $rs = $view->get_query("view:SEMINAR_SEM_TREE_DEL_RANGE"); + $deleted['entries'] = $rs->affected_rows(); + // Logging + foreach ($items_to_delete as $item_id) { + StudipLog::log("STUDYAREA_DELETE",$item_id); + NotificationCenter::postNotification("StudyAreaDidDelete", $item_id, $GLOBALS['user']->id); + } + return $deleted; + } + + public function DeleteSemEntries($item_ids = null, $sem_entries = null) + { + $view = new DbView(); + if ($item_ids && $sem_entries) { + $sem_tree_ids = $view->params[0] = (is_array($item_ids)) ? $item_ids : [$item_ids]; + $seminar_ids = $view->params[1] = (is_array($sem_entries)) ? $sem_entries : [$sem_entries]; + $rs = $view->get_query("view:SEMINAR_SEM_TREE_DEL_SEM_RANGE"); + $ret = $rs->affected_rows(); + // Logging + foreach ($sem_tree_ids as $range) { + foreach ($seminar_ids as $sem) { + StudipLog::log("SEM_DELETE_STUDYAREA",$sem,$range); + } + } + if($ret){ + foreach ($sem_tree_ids as $sem_tree_id){ + $studyarea = StudipStudyArea::find($sem_tree_id); + if($studyarea->isModule()) { + foreach ($seminar_ids as $seminar_id) { + NotificationCenter::postNotification('CourseRemovedFromModule', $studyarea, ['module_id' => $sem_tree_id, 'course_id' => $seminar_id]); + } + } + } + } + } elseif ($item_ids){ + $view->params[0] = (is_array($item_ids)) ? $item_ids : [$item_ids]; + // Logging + foreach ($view->params[0] as $range) { + StudipLog::log("SEM_DELETE_STUDYAREA","all",$range); + } + $rs = $view->get_query("view:SEMINAR_SEM_TREE_DEL_RANGE"); + $ret = $rs->affected_rows(); + } elseif ($sem_entries){ + $view->params[0] = (is_array($sem_entries)) ? $sem_entries : [$sem_entries]; + // Logging + foreach ($view->params[0] as $sem) { + StudipLog::log("SEM_DELETE_STUDYAREA",$sem,"all"); + } + $rs = $view->get_query("view:SEMINAR_SEM_TREE_DEL_SEMID_RANGE"); + $ret = $rs->affected_rows(); + } else { + $ret = false; + } + + return $ret; + } + + public function InsertSemEntry($sem_tree_id, $seminar_id) + { + $view = new DbView(); + $view->params[0] = $seminar_id; + $view->params[1] = $sem_tree_id; + $rs = $view->get_query("view:SEMINAR_SEM_TREE_INS_ITEM"); + if($ret = $rs->affected_rows()){ + // Logging + StudipLog::log("SEM_ADD_STUDYAREA",$seminar_id,$sem_tree_id); + $studyarea = StudipStudyArea::find($sem_tree_id); + if($studyarea->isModule()){ + NotificationCenter::postNotification('CourseAddedToModule', $studyarea, ['module_id' => $sem_tree_id, 'course_id' => $seminar_id]); + } + } + return $ret; + } +} |
