Select Git revision
FileType.php
Forked from
Stud.IP / Stud.IP
Source project has a limited visibility.
-
Jan-Hendrik Willms authoredJan-Hendrik Willms authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
StudipSemTree.class.php 12.07 KiB
<?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;
}
}