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/StudipRangeTree.php | |
| parent | da0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff) | |
| parent | 97a188592c679890a25c37ab78463add76a52ff7 (diff) | |
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/classes/StudipRangeTree.php')
| -rw-r--r-- | lib/classes/StudipRangeTree.php | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/lib/classes/StudipRangeTree.php b/lib/classes/StudipRangeTree.php new file mode 100644 index 0000000..5e1aefe --- /dev/null +++ b/lib/classes/StudipRangeTree.php @@ -0,0 +1,222 @@ +<? +# Lifter002: TODO +# Lifter007: TODO +# Lifter003: TODO +# Lifter010: TODO +// +---------------------------------------------------------------------------+ +// This file is part of Stud.IP +// StudipRangeTree.php +// Class to handle structure of the "range tree" +// +// Copyright (c) 2002 André Noack <noack@data-quest.de> +// Suchi & Berg GmbH <info@data-quest.de> +// +---------------------------------------------------------------------------+ +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or any later version. +// +---------------------------------------------------------------------------+ +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +---------------------------------------------------------------------------+ + +/** +* class to handle the "range tree" +* +* This class provides an interface to the structure of the "range tree" +* +* @access public +* @author André Noack <noack@data-quest.de> +* @package +*/ +class StudipRangeTree extends TreeAbstract +{ + var $sem_number; + var $sem_status; + var $sem_dates; + var $studip_objects = []; + var $visible_only; + var $entries_init_done = false; + + /** + * constructor + * + * do not use directly, call TreeAbstract::GetInstance("StudipRangeTree") + * @access private + */ + function __construct($args) { + DbView::addView('range_tree'); + + $this->root_name = Config::get()->UNI_NAME_CLEAN; + $this->studip_objects['inst'] = ['pk' => 'Institut_id', 'table' => 'Institute']; + $this->studip_objects['fak'] = ['pk' => 'Institut_id', 'table' => 'Institute']; + if (isset($args['sem_number']) ){ + $this->sem_number = array_map('intval', $args['sem_number']); + } + if (isset($args['sem_status']) ){ + $this->sem_status = array_map('intval', $args['sem_status']); + } + $this->visible_only = (int)($args['visible_only'] ?? 0); + parent::__construct(); //calling the baseclass constructor + $this->sem_dates = Semester::findAllVisible(); + } + + /** + * initializes the tree + * + * stores all rows from table range_tree in array $tree_data + * @access public + */ + function init(){ + parent::init(); + $this->tree_data['root']['studip_object_id'] = 'root'; + $db = $this->view->get_query("view:TREE_GET_DATA"); + while ($db->next_record()){ + $item_name = $db->f("name"); + if ($db->f("studip_object")){ + $item_name = $db->f("studip_object_name"); + } + $this->tree_data[$db->f("item_id")] = ["studip_object" => $db->f("studip_object"), + "studip_object_id" => $db->f("studip_object_id"), + "fakultaets_id" => $db->f("fakultaets_id"),"entries" => 0]; + $this->storeItem($db->f("item_id"), $db->f("parent_id"), $item_name, $db->f("priority")); + } + } + + function initEntries(){ + $this->view->params[0] = (isset($this->sem_status)) ? " AND d.status IN('" . join("','", $this->sem_status) . "')" : " "; + $this->view->params[0] .= $this->visible_only ? " AND visible=1 " : ""; + $this->view->params[1] = (isset($this->sem_number)) ? " WHERE ((" . $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:TREE_GET_SEM_ENTRIES"); + while ($db->next_record()){ + $this->tree_data[$db->f("item_id")]['entries'] = $db->f('entries'); + } + $this->entries_init_done = true; + } + + /** + * Returns Stud.IP range_id of the next "real" object + * + * This function finds the next item wich is a real Stud.IP Object, either an "Einrichtung" or a "Fakultaet"<br> + * useful for the user rights management + * @access public + * @param string $item_id + * @return bool|array of primary keys from table "institute" + */ + function getAdminRange($item_id) { + if (empty($this->tree_data[$item_id])) { + return false; + } + + $found = false; + $ret = false; + $next_link = $item_id; + + while(($next_link = $this->getNextLink($next_link)) != 'root') { + if ($this->tree_data[$next_link]['studip_object'] == 'inst') { + $found[] = $next_link; + } + + if ($this->tree_data[$next_link]['studip_object'] == 'fak') { + if (is_array($found) && count($found)) { + foreach($found as $f) { + if ($this->tree_data[$f]['fakultaets_id'] == $this->tree_data[$next_link]['studip_object_id']) { + $ret[] = $this->tree_data[$f]['studip_object_id']; + } + } + + $ret[] = $this->tree_data[$next_link]['studip_object_id']; + } else { + $ret[] = $this->tree_data[$next_link]['studip_object_id']; + } + break; + } + $next_link = $this->tree_data[$next_link]['parent_id']; + } + + if (!$ret){ + $ret[] = $next_link; + } + + return $ret; + } + /** + * returns the next item_id upwards the tree which is a Stud.IP object + * + * help function for getAdminRange() + * + * @access private + * @param string $item_id + * @return string + */ + + function getNextLink($item_id){ + if (!$this->tree_data[$item_id]) + return false; + $ret_id = $item_id; + while (!$this->tree_data[$ret_id]['studip_object_id']){ + $ret_id = $this->tree_data[$ret_id]['parent_id']; + } + return $ret_id; + } + + function getSemIds($item_id,$ids_from_kids = false){ + if (!$this->tree_data[$item_id]) + return false; + if ($ids_from_kids){ + $this->view->params[0] = $this->getKidsKids($item_id); + } + $this->view->params[0][] = $item_id; + $this->view->params[1] = (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; + $rs = $this->view->get_query("view:RANGE_TREE_GET_SEMIDS"); + while($rs->next_record()){ + $ret[] = $rs->f(0); + } + return $ret; + } + + function getNumEntries($item_id, $num_entries_from_kids = false){ + if (!$this->tree_data[$item_id]) + return false; + if (!$this->entries_init_done) $this->initEntries(); + + return parent::getNumEntries($item_id, $num_entries_from_kids); + } + + function InsertItem($item_id, $parent_id, $item_name, $priority,$studip_object,$studip_object_id){ + $view = new DbView(); + $view->params = [$item_id,$parent_id,$item_name,$priority,$studip_object,$studip_object_id]; + $rs = $view->get_query("view:TREE_INS_ITEM"); + return $rs->affected_rows(); + } + + function UpdateItem($item_name,$studip_object,$studip_object_id,$item_id){ + $view = new DbView(); + $view->params = [$item_name,$studip_object,$studip_object_id,$item_id]; + $rs = $view->get_query("view:TREE_UPD_ITEM"); + return $rs->affected_rows(); + } + + 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:TREE_DEL_ITEM"); + $deleted['items'] = $rs->affected_rows(); + $rs = $view->get_query("view:CAT_DEL_RANGE"); + $deleted['categories'] = $rs->affected_rows(); + return $deleted; + } +} +?> |
