From 9cb5d0895d5cd2ea3e4ab8c5b83a803a6aa8ec8b Mon Sep 17 00:00:00 2001 From: chfhtw Date: Mon, 29 Jun 2026 16:12:32 +0200 Subject: [PATCH] Rework Treemenu endpoint and libraries --- .../config/menubuilder/config_stg_based.php | 141 ------- .../config/{menubuilder.php => treemenu.php} | 11 +- application/config/treemenu/stg_base.php | 65 ++++ .../controllers/api/frontend/v1/Treemenu.php | 94 ++++- application/libraries/MenuBuilderLib.php | 222 ----------- application/libraries/menu/StvMenuLib.php | 78 ---- application/libraries/treemenu/StudVwLib.php | 247 ++++++++++++ .../base/StgLib.php} | 359 ++++++++---------- 8 files changed, 565 insertions(+), 652 deletions(-) delete mode 100644 application/config/menubuilder/config_stg_based.php rename application/config/{menubuilder.php => treemenu.php} (80%) create mode 100644 application/config/treemenu/stg_base.php delete mode 100644 application/libraries/MenuBuilderLib.php delete mode 100644 application/libraries/menu/StvMenuLib.php create mode 100644 application/libraries/treemenu/StudVwLib.php rename application/libraries/{menu/StgBasedMenuLib.php => treemenu/base/StgLib.php} (52%) diff --git a/application/config/menubuilder/config_stg_based.php b/application/config/menubuilder/config_stg_based.php deleted file mode 100644 index 3fbb3b9a8..000000000 --- a/application/config/menubuilder/config_stg_based.php +++ /dev/null @@ -1,141 +0,0 @@ -. - */ - -if (!defined('BASEPATH')) exit('No direct script access allowed'); - -$config_part_stg_orgform = [ - 'prestudent' => [ - 'name' => ['stv', 'prestudent'], - 'no_sem_reload' => true, - 'children' => [ - 'stdsem' => [ - 'generationFunc' => 'getStdSemester', - 'children' => [ - 'interessenten' => [ - 'name' => ['stv', 'interessenten'], - 'children' => [ - 'bewerbungnichtabgeschickt' => [ - 'name' => 'Bewerbung nicht abgeschickt' - ], - 'bewerbungabgeschickt' => [ - 'name' => 'Bewerbung abgeschickt, Status unbestätigt' - ], - 'zgv' => [ - 'name' => 'ZGV erfüllt' - ], - 'statusbestaetigt' => [ - 'name' => 'Status bestätigt', - 'children' => [ - 'statusbestaetigtrtnichtangemeldet' => [ - 'name' => 'Nicht zum Reihungstest angemeldet' - ], - 'statusbestaetigtrtangemeldet' => [ - 'name' => 'Reihungstest angemeldet' - ] - ] - ], - 'reihungstestnichtangemeldet' => [ - 'name' => 'Nicht zum Reihungstest angemeldet' - ], - 'reihungstestangemeldet' => [ - 'name' => 'Reihungstest angemeldet' - ] - - ] - ], - 'bewerber' => [ - 'name' => ['stv', 'bewerber'], - 'children' => [ - 'bewerberrtnichtangemeldet' => [ - 'name' => 'Nicht zum Reihungstest angemeldet' - ], - 'bewerberrtangemeldet' => [ - 'name' => 'Reihungstest angemeldet', - 'children' => [ - 'bewerberrtangemeldetteilgenommen' => [ - 'name' => 'Teilgenommen' - ], - 'bewerberrtangemeldetnichtteilgenommen' => [ - 'name' => 'Nicht teilgenommen' - ] - ] - ] - ] - ], - 'aufgenommen' => [ - 'name' => ['stv', 'aufgenommen'] - ], - 'warteliste' => [ - 'name' => ['stv', 'warteliste'] - ], - 'absage' => [ - 'name' => ['stv', 'absage'] - ], - 'incoming' => [ - 'name' => ['stv', 'incoming'] - ] - ] - ] - ] - ], - 'semester' => [ - 'generationFunc' => 'getSemester', - 'children' => [ - 'group' => [ - 'generationFunc' => 'getGroups' - ], - 'verband' => [ - 'generationFunc' => 'getVerbaende', - 'children' => [ - 'group' => [ - 'generationFunc' => 'getVerbandGroups' - ] - ] - ] - ] - ] -]; -$config['config_stg_based'] = [ - 'stg' => [ - 'generationFunc' => 'getStgs', - 'children' => array_merge( - $config_part_stg_orgform, - [ - 'orgform' => [ - 'generationFunc' => 'getOrgforms', - 'children' => $config_part_stg_orgform - ] - ] - ) - ], - 'inout' => [ - 'name' => ['stv', 'inout'], - 'children' => [ - 'incoming' => [ - 'name' => ['stv', 'incoming'] - ], - 'outgoing' => [ - 'name' => ['stv', 'outgoing'] - ], - 'shared_studies' => [ - 'name' => ['stv', 'shared_studies'] - ] - ] - ] -]; diff --git a/application/config/menubuilder.php b/application/config/treemenu.php similarity index 80% rename from application/config/menubuilder.php rename to application/config/treemenu.php index 07fff2f6b..d7e704222 100644 --- a/application/config/menubuilder.php +++ b/application/config/treemenu.php @@ -19,10 +19,7 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); -$config['stv'] = "menu/StvMenuLib"; - -$CI =& get_instance(); - -$CI->load->config('menubuilder/config_stg_based'); - -$config['config_stg_based'] = $CI->config->item('config_stg_based'); +$config['stv'] = [ + "library" => "treemenu/StudVwLib", + "permissions" => ["admin:r", "assistenz:r"] +]; diff --git a/application/config/treemenu/stg_base.php b/application/config/treemenu/stg_base.php new file mode 100644 index 000000000..fcb9748b7 --- /dev/null +++ b/application/config/treemenu/stg_base.php @@ -0,0 +1,65 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +$config['root'] = [ + 'stg' => [ + 'prestudent' => [ + 'stdsem' => [ + 'interessenten' => [ + 'bewerbungnichtabgeschickt', + 'bewerbungabgeschickt', + 'zgv', + 'statusbestaetigt' => [ + 'statusbestaetigtrtnichtangemeldet', + 'statusbestaetigtrtangemeldet' + ], + 'reihungstestnichtangemeldet', + 'reihungstestangemeldet' + ], + 'bewerber' => [ + 'bewerberrtnichtangemeldet', + 'bewerberrtangemeldet' => [ + 'bewerberrtangemeldetteilgenommen', + 'bewerberrtangemeldetnichtteilgenommen' + ] + ], + 'aufgenommen', + 'warteliste', + 'absage', + 'incoming' + ] + ], + 'semester' => [ + 'group', + 'verband' => [ + 'group' + ] + ] + ], + 'inout' => [ + 'incoming', + 'outgoing', + 'shared_studies' + ] +]; + +// copy stg tree into stg/orgforms +$config['root']['stg']['orgform'] = $config['root']['stg']; diff --git a/application/controllers/api/frontend/v1/Treemenu.php b/application/controllers/api/frontend/v1/Treemenu.php index fbaaa2c97..2b02b7704 100644 --- a/application/controllers/api/frontend/v1/Treemenu.php +++ b/application/controllers/api/frontend/v1/Treemenu.php @@ -19,6 +19,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +use \ReflectionMethod as ReflectionMethod; + /** * This controller operates between (interface) the JS (GUI) and the back-end * Provides data to the ajax get calls about menues @@ -28,14 +30,28 @@ class Treemenu extends FHCAPI_Controller { public function __construct() { - $permissions = []; + // Load Router $router = load_class('Router'); - // TODO(chris): permission - $permissions[$router->method] = ['admin:r', 'assistenz:r']; - parent::__construct($permissions); // Load Config - $this->config->load('menubuilder'); + $config = load_class('Config'); + $config->load('treemenu'); + + // Get Treemenu name & config + $name = $router->method; + $conf = $config->item($name); + + // Get Permissions from config + $permissions = $conf['permissions'] ?? self::PERM_ANONYMOUS; + + // Call constructor + parent::__construct([ + $name => $permissions + ]); + + // Load Library + $libraryName = $conf['library'] ?? null; + $this->load->library($libraryName, null, 'treemenulib'); } /** @@ -46,13 +62,69 @@ class Treemenu extends FHCAPI_Controller */ public function _remap($method, $params = []) { - $this->load->library($this->config->item($method), null, 'menulib'); - - if (!$this->menulib) + if (!$this->treemenulib) show_404(); - - $submenu = $this->menulib->build($params); - $this->terminateWithSuccess($submenu); + $this->addMeta('ci_method', $method); + $this->addMeta('ci_params', $params); + + $params = $this->uri->uri_to_assoc(6); // 6 = start of $params + $config = $this->treemenulib->config; + + foreach (array_keys($params) as $key) { + if (!isset($config[$key]) || !$config[$key]) + show_404(); + + $config = $config[$key]; + } + + // Prepare aliases + $argumentaliases = []; + if (property_exists($this->treemenulib, 'path_to_argument')) + $argumentaliases = array_flip($this->treemenulib->path_to_argument); + $methodaliases = []; + if (property_exists($this->treemenulib, 'redirect_method')) + $methodaliases = $this->treemenulib->redirect_method; + + $items = []; + foreach ($config as $uripart => $children) { + if (!is_array($children)) { + $uripart = $children; + $children = []; + } + + $methodName = $uripart; + if (isset($methodaliases[$methodName])) { + $methodName = $methodaliases[$methodName]; + } elseif (strpbrk($methodName, ' _-') !== false) { + $methodName = lcfirst(str_replace([' ', '_', '-'], '', ucwords($methodName, " \t\r\n\f\v_-"))); + } + + // Prepare arguments + $reflection = new ReflectionMethod($this->treemenulib, $methodName); + $arguments = []; + foreach ($reflection->getParameters() as $arg) { + if ($arg->name == 'path_template') { + $path = $params; + $path[$uripart] = '%s'; + $arguments[] = $this->uri->assoc_to_uri($path); + } elseif ($arg->name == 'has_children') { + $arguments[] = $children; + } elseif ($arg->name == 'original_method') { + $arguments[] = $uripart; + } elseif (isset($argumentaliases[$arg->name]) && isset($params[$argumentaliases[$arg->name]])) { + $arguments[] = $params[$argumentaliases[$arg->name]]; + } elseif (isset($params[$arg->name])) { + $arguments[] = $params[$arg->name]; + } else { + $arguments[] = null; + } + } + + // Call function from lib + $items = array_merge($items, call_user_func_array([$this->treemenulib, $methodName], $arguments)); + } + + $this->terminateWithSuccess($items); } } diff --git a/application/libraries/MenuBuilderLib.php b/application/libraries/MenuBuilderLib.php deleted file mode 100644 index 0509c98aa..000000000 --- a/application/libraries/MenuBuilderLib.php +++ /dev/null @@ -1,222 +0,0 @@ -. - */ - -if (! defined('BASEPATH')) exit('No direct script access allowed'); - -/** - * MenuBuilder library - * TODO(chris): docu - */ -class MenuBuilderLib -{ - const GENERATOR_FUNC_KEY = 'generationFunc'; - - protected $_ci; - - protected $config = []; - - /** - * Constructor - */ - public function __construct() - { - // Get code igniter instance - $this->_ci =& get_instance(); - } - - // TODO(chris): abstract - - /** - * TODO(chris): comment - * - * @param string $key - * @param mixed $value - * - * @return array - */ - protected function mapUrlPartToVars($key, $value) - { - return [ $key, $value ]; - } - - protected function getPathTemplate($vars) - { - return implode('/', $vars['_url']) . '/%s'; - } - - protected function getLinkTemplate($vars) - { - return implode('/', $vars['_url']) . '/%s'; - } - - protected function buildMenu() - { - return $this->buildMenuRecursive($this->config, [ - '_url' => [], - '_path' => [] - ]); - } - - private function buildMenuRecursive($config, $vars) - { - $result = []; - - foreach ($config as $key => $conf) { - $res = $this->buildConfigItem($key, $conf, $vars); - if (isset($conf['children'])) { - foreach ($res as $k => $menuitem) { - // convert stdClass to associative array if necessary - if (!is_array($menuitem)) { - $menuitem = get_object_vars($menuitem); - $res[$k] = $menuitem; - } - - $child_vars = $menuitem; - unset($child_vars['name']); - $child_vars['_url'] = explode('/', $child_vars['path']); - unset($child_vars['path']); - $child_vars = array_merge($vars, $child_vars); - $child_vars['_path'][] = $key; - - $res[$k]['children'] = $this->buildMenuRecursive($conf['children'], $child_vars); - } - } - $result = array_merge($result, $res); - } - - return $result; - } - - protected function buildSubmenu($url_segments) - { - $vars = $this->convertUrlPathToVars($url_segments); - if ($vars === null) - return null; - - $config = $this->getSubconfig($vars['_path']); - if ($config === null) - return null; - - $result = []; - - foreach ($config as $key => $conf) { - $res = $this->buildConfigItem($key, $conf, $vars); - $result = array_merge($result, $res); - } - - return $result; - } - - /** - * @param array $path - * - * @return array|null - */ - private function getSubconfig($path) - { - $config = $this->config; - - while (count($path)) { - $part = array_shift($path); - - if (!isset($config[$part])) - return null; - if (!isset($config[$part]['children'])) - return null; - - $config = $config[$part]['children']; - } - - return $config; - } - - /** - * @param array $url_segments - * @return array|null - */ - private function convertUrlPathToVars($url_segments) - { - $config = $this->config; - - $result = [ - '_url' => $url_segments, - '_path' => [] - ]; - while (count($url_segments)) { - if (!$config) - return null; - - $segment = array_shift($url_segments); - - if (!isset($config[$segment])) - return null; - - $config = $config[$segment]; - $result['_path'][] = $segment; - - if (isset($config[self::GENERATOR_FUNC_KEY])) { - $value = array_shift($url_segments); - list($key, $value) = $this->mapUrlPartToVars($segment, $value); - $result[$key] = $value; - } - - $config = isset($config['children']) ? $config['children'] : null; - } - - return $result; - } - - protected function buildConfigItem($key, $config, $vars) - { - if (isset($config[self::GENERATOR_FUNC_KEY])) - return $this->buildItemWithMethod($key, $config, $vars); - else - return $this->buildGenericItem($key, $config, $vars); - } - - protected function buildItemWithMethod($key, $config, $vars) - { - $vars['_url'][] = $key; - - $method = $config[self::GENERATOR_FUNC_KEY]; - - return $this->$method($vars); - } - - protected function buildGenericItem($key, $config, $vars) - { - $url_segments = $vars['_url']; - $url_segments[] = $key; - - $result = array_merge($config, $vars); - - if (!isset($result['children'])) - $result['leaf'] = true; - else - unset($result['children']); - - $result['path'] = sprintf($this->getPathTemplate($result), $key); - $result['link'] = sprintf($this->getLinkTemplate($result), $key); - - unset($result['_url']); - unset($result['_path']); - - return [ $result ]; - } -} diff --git a/application/libraries/menu/StvMenuLib.php b/application/libraries/menu/StvMenuLib.php deleted file mode 100644 index 0bd975937..000000000 --- a/application/libraries/menu/StvMenuLib.php +++ /dev/null @@ -1,78 +0,0 @@ -. - */ - -if (! defined('BASEPATH')) exit('No direct script access allowed'); - -require_once(APPPATH . 'libraries/menu/StgBasedMenuLib.php'); - -/** - * StudVw Menu library - */ -class StvMenuLib extends StgBasedMenuLib -{ - public function build($url_segments = []) - { - $result = $this->buildSubmenu($url_segments); - - if ($result === null) - show_404(); - - return $result; - } - public function buildAll() - { - return $this->buildMenu(); - } - - protected function getLinkTemplate($vars) - { - $result = $this->convertFullUrlToLinkUrl($vars['_url'], $this->config); - - $firstLevelPrestudent = (count($vars['_path']) > 1 && $vars['_path'][1] == 'prestudent'); - $secondLevelPrestudent = (count($vars['_path']) > 2 && $vars['_path'][2] == 'prestudent'); - if (!$firstLevelPrestudent && !$secondLevelPrestudent) - $result = 'CURRENT_SEMESTER/' . $result; - - if ($result) - return $result . '/%s'; - - return '%s'; - } - - private function convertFullUrlToLinkUrl($url_segments, $config) - { - if (!count($url_segments)) - return ''; - $result = $current_segment = array_shift($url_segments); - - if (isset($config[$current_segment][self::GENERATOR_FUNC_KEY])) { - $result = array_shift($url_segments); - } - - $children = ''; - - if (isset($config[$current_segment]['children'])) - $children = $this->convertFullUrlToLinkUrl($url_segments, $config[$current_segment]['children']); - - if ($children) - return $result . '/' . $children; - - return $result; - } -} diff --git a/application/libraries/treemenu/StudVwLib.php b/application/libraries/treemenu/StudVwLib.php new file mode 100644 index 000000000..c986f2ba0 --- /dev/null +++ b/application/libraries/treemenu/StudVwLib.php @@ -0,0 +1,247 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * StudVw Menu library + */ +class StudVwLib +{ + protected $_ci = null; + + public $config = []; + + public $redirect_method = [ + 'interessenten' => 'filter', + 'bewerbungnichtabgeschickt' => 'filter', + 'bewerbungabgeschickt' => 'filter', + 'zgv' => 'filter', + 'statusbestaetigt' => 'filter', + 'statusbestaetigtrtnichtangemeldet' => 'filter', + 'statusbestaetigtrtangemeldet' => 'filter', + 'reihungstestnichtangemeldet' => 'filter', + 'reihungstestangemeldet' => 'filter', + 'bewerber' => 'filter', + 'bewerberrtnichtangemeldet' => 'filter', + 'bewerberrtangemeldet' => 'filter', + 'bewerberrtangemeldetteilgenommen' => 'filter', + 'bewerberrtangemeldetnichtteilgenommen' => 'filter', + 'aufgenommen' => 'filter', + 'warteliste' => 'filter', + 'absage' => 'filter', + 'incoming' => 'filter', + 'incoming' => 'inout', + 'outgoing' => 'inout', + 'shared_studies' => 'inout' + ]; + + public function __construct() + { + // Get code igniter instance + $this->_ci =& get_instance(); + + // Load Tree-config + $this->_ci->load->config('treemenu/stg_base'); + $this->config = $this->_ci->config->item('root'); + + // Load Libraries + $this->_ci->load->library('treemenu/base/StgLib'); + + // Load Model + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + } + + public function stg($path_template) + { + $permittedStgs = $this->getPermittedStudiengangKzs(); + + if (!$permittedStgs) + return []; + + return $this->_ci->stglib->studiengang($path_template, $permittedStgs); + } + + public function prestudent($path_template, $stg) + { + // TODO(chris): permission check stg + + return [ + [ + 'path' => sprintf($path_template, '1'), + 'name' => 'Prestudent', + 'no_sem_reload' => true + ] + ]; + } + + public function stdsem($path_template, $stg) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + return $this->_ci->stglib->studiensemester($path_template, $stg->studiengang_kz); + } + + public function semester($path_template, $stg, $orgform) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if ($orgform !== null) { + $orgform = $this->getOrgform($orgform); + if ($orgform === null) + return []; + $orgform = $orgform->orgform_kurzbz; + } + + return $this->_ci->stglib->semester($path_template, $stg->studiengang_kz, $orgform); + } + + public function verband($path_template, $stg, $semester, $orgform) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if ($orgform !== null) { + $orgform = $this->getOrgform($orgform); + if ($orgform === null) + return []; + $orgform = $orgform->orgform_kurzbz; + } + + $this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf"); + + return $this->_ci->stglib->verband($path_template, $stg->studiengang_kz, $semester, $orgform); + } + + public function group($path_template, $stg, $semester, $verband, $orgform) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if ($orgform !== null) { + $orgform = $this->getOrgform($orgform); + if ($orgform === null) + return []; + $orgform = $orgform->orgform_kurzbz; + } + + $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false); + + if ($verband === null) + return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester, $orgform); + + return $this->_ci->stglib->verbandsgroup($path_template, $stg->studiengang_kz, $semester, $verband, $orgform); + } + + public function orgform($path_template, $stg) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if (!$stg->mischform) + return []; + + return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz); + } + + public function filter($original_method, $has_children, $path_template, $stg) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + $item = [ + 'path' => sprintf($path_template, '1'), + 'name' => $original_method + ]; + + if (!$has_children) + $item['leaf'] = true; + + return [ $item ]; + } + + public function inout($original_method, $has_children, $path_template) + { + if (!$this->_ci->permissionlib->isBerechtigt('inout/uebersicht')) + return []; + + $item = [ + 'path' => sprintf($path_template, '1'), + 'name' => $original_method + ]; + + if (!$has_children) + $item['leaf'] = true; + + return [ $item ]; + } + + protected function getOrgform($orgform) + { + $this->_ci->load->model('codex/Orgform_model', 'OrgformModel'); + $orgform = $this->_ci->OrgformModel->loadWhere([ + 'LOWER(orgform_kurzbz) =' => $orgform + ]); + + if (!hasData($orgform)) + return null; + + return current(getData($orgform)); + } + + protected function getPermittedStudiengangKzs() + { + $permittedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: []; + $permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []); + + return $permittedStgs; + } + + protected function getStgFromUrl($stg) + { + $permittedStgs = $this->getPermittedStudiengangKzs(); + + if (!$permittedStgs) + return null; + + $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs); + $stg = $this->_ci->StudiengangModel->loadWhere([ + 'LOWER(CONCAT(typ, kurzbz)) =' => $stg + ]); + + if (!hasData($stg)) + return null; + + return current(getData($stg)); + } +} diff --git a/application/libraries/menu/StgBasedMenuLib.php b/application/libraries/treemenu/base/StgLib.php similarity index 52% rename from application/libraries/menu/StgBasedMenuLib.php rename to application/libraries/treemenu/base/StgLib.php index bcff3f7a3..84665639d 100644 --- a/application/libraries/menu/StgBasedMenuLib.php +++ b/application/libraries/treemenu/base/StgLib.php @@ -19,49 +19,27 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); -require_once(APPPATH . 'libraries/MenuBuilderLib.php'); - /** - * StudVw Menu library + * Stg Base library */ -class StgBasedMenuLib extends MenuBuilderLib +class StgLib { - /** - * Constructor - */ + protected $_ci = null; + public function __construct() { - parent::__construct(); - $this->config = $this->_ci->config->item('config_stg_based'); + // Get code igniter instance + $this->_ci =& get_instance(); } - protected function mapUrlPartToVars($key, $value) + public function studiengang($path_template, $permittedStgs = []) { - if ($key == 'stg') - $key = 'studiengang_kz'; - if ($key == 'orgform') - $key = 'org_form'; - return [ $key, $value ]; - } - - protected function getStgs($vars) - { - $stgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: []; - $stgs = array_merge($stgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []); - - if (!$stgs) - return []; - - $pathTemplate = $this->getPathTemplate($vars); - $linkTemplate = $this->getLinkTemplate($vars); - $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); $this->_ci->StudiengangModel->addDistinct(); - $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($pathTemplate) . ", v.studiengang_kz) AS path"); - $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($linkTemplate) . ", v.studiengang_kz) AS link"); + $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", LOWER(CONCAT(typ, kurzbz))) AS path"); $this->_ci->StudiengangModel->addSelect( "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name", false @@ -78,28 +56,22 @@ class StgBasedMenuLib extends MenuBuilderLib $this->_ci->StudiengangModel->addOrder('typ'); $this->_ci->StudiengangModel->addOrder('kurzbz'); - $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $stgs); + if ($permittedStgs) + $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs); $result = $this->_ci->StudiengangModel->loadWhere(['v.aktiv' => true]); return getData($result) ?: []; } - protected function getSemester($vars) + public function semester($path_template, $studiengang_kz, $orgform_kurzbz = null) { - // TODO(chris): permission on stg - // TODO(chris): check vars - - $pathTemplate = $this->getPathTemplate($vars); - $linkTemplate = $this->getLinkTemplate($vars); - $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); $this->_ci->StudiengangModel->addDistinct(); - $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($pathTemplate) . ", semester) AS path", false); - $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($linkTemplate) . ", semester) AS link", false); + $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", semester) AS path", false); $this->_ci->StudiengangModel->addSelect("CONCAT( UPPER(CONCAT(typ, kurzbz)), '-', @@ -113,53 +85,181 @@ class StgBasedMenuLib extends MenuBuilderLib ) AS name", false); $this->_ci->StudiengangModel->addSelect('semester'); - $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($vars['studiengang_kz']) . '::integer AS stg_kz', false); + $this->_ci->StudiengangModel->addSelect('v.studiengang_kz AS stg_kz'); $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); $this->_ci->StudiengangModel->addOrder('semester'); - if (isset($vars['org_form'])) { - $this->_ci->StudiengangModel->addSelect("v.orgform_kurzbz"); + if ($orgform_kurzbz !== null) { + $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($orgform_kurzbz) . " AS orgform_kurzbz", false); + $this->_ci->StudiengangModel->addDistinct(); $this->_ci->StudiengangModel->db->group_start(); $this->_ci->StudiengangModel->db->where('v.semester', 0); - $this->_ci->StudiengangModel->db->or_where('v.orgform_kurzbz', $vars['org_form']); + $this->_ci->StudiengangModel->db->or_where('v.orgform_kurzbz', $orgform_kurzbz); $this->_ci->StudiengangModel->db->group_end(); } $result = $this->_ci->StudiengangModel->loadWhere([ - 'v.studiengang_kz' => $vars['studiengang_kz'], + 'studiengang_kz' => $studiengang_kz, 'v.aktiv' => true ]); + return getData($result) ?: []; } - protected function getOrgforms($vars) + public function group($path_template, $studiengang_kz, $semester, $orgform_kurzbz = null) { - // TODO(chris): permission on stg - // TODO(chris): check vars + $this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel'); - $pathTemplate = $this->getPathTemplate($vars); - $linkTemplate = $this->getLinkTemplate($vars); + $this->_ci->GruppeModel->addDistinct(); + $this->_ci->GruppeModel->addSelect("FORMAT(" . $this->_ci->GruppeModel->escape($path_template) . ", gruppe_kurzbz) AS path", false); + $this->_ci->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false); + $this->_ci->GruppeModel->addSelect('sort'); + $this->_ci->GruppeModel->addSelect('gruppe_kurzbz'); + $this->_ci->GruppeModel->addSelect($this->_ci->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false); + $this->_ci->GruppeModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); + + $this->_ci->GruppeModel->addOrder('sort'); + $this->_ci->GruppeModel->addOrder('gruppe_kurzbz'); + + $where = [ + 'studiengang_kz' => $studiengang_kz, + 'semester' => $semester, + 'lehre' => true, + 'sichtbar' => true, + 'aktiv' => true, + 'direktinskription' => false + ]; + + if ($orgform_kurzbz !== null) + $where['orgform_kurzbz'] = $orgform_kurzbz; + + $result = $this->_ci->GruppeModel->loadWhere($where); + + return getData($result) ?: []; + } + + public function verband($path_template, $studiengang_kz, $semester, $orgform_kurzbz = null) + { + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); + + $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", verband) AS path", false); + $this->_ci->StudiengangModel->addSelect("CONCAT( + UPPER(CONCAT(typ, kurzbz)), + '-', + semester, + verband, + ( + SELECT + CASE + WHEN bezeichnung IS NULL OR bezeichnung='' + THEN ''::TEXT + ELSE CONCAT(' (', bezeichnung, ')') + END + FROM public.tbl_lehrverband + WHERE studiengang_kz=v.studiengang_kz + AND semester=v.semester + AND verband=v.verband + ORDER BY gruppe + LIMIT 1 + ) + ) AS name", false); + + $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($semester) . ' AS semester'); + $this->_ci->StudiengangModel->addSelect('verband'); + $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); + $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); + + $this->_ci->StudiengangModel->addOrder('verband'); + + $this->_ci->StudiengangModel->addGroupBy('path, name, verband'); + + $where = [ + 'v.studiengang_kz' => $studiengang_kz, + 'v.semester' => $semester, + 'v.verband !=' => '', + 'v.aktiv' => true + ]; + + if ($orgform_kurzbz !== null && $semester) // NOTE(chris): on semester 0 show all? + $where['v.orgform_kurzbz'] = $orgform_kurzbz; + + $result = $this->_ci->StudiengangModel->loadWhere($where); + + return getData($result) ?: []; + } + + public function verbandsgroup($path_template, $studiengang_kz, $semester, $verband, $orgform_kurzbz = null) + { $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); - // NOTE(chris): if mischform show orgforms - $result = $this->_ci->StudiengangModel->load($vars['studiengang_kz']); + $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); + + $this->_ci->StudiengangModel->addDistinct(); + $this->_ci->StudiengangModel->addSelect("FORMAT( + " . $this->_ci->StudiengangModel->escape($path_template) . ", + gruppe + ) AS path", false); + $this->_ci->StudiengangModel->addSelect("CONCAT( + UPPER(CONCAT(typ, kurzbz)), + '-', + semester, + verband, + gruppe, + ( + SELECT + CASE + WHEN bezeichnung IS NULL OR bezeichnung='' + THEN ''::TEXT + ELSE CONCAT(' (', bezeichnung, ')') + END + FROM public.tbl_lehrverband + WHERE studiengang_kz=v.studiengang_kz + AND semester=v.semester + AND verband=v.verband + AND gruppe=v.gruppe + ORDER BY gruppe + LIMIT 1 + ) + ) AS name", false); - if (!hasData($result)) - return []; + $this->_ci->StudiengangModel->addSelect('v.semester'); + $this->_ci->StudiengangModel->addSelect('v.verband'); + $this->_ci->StudiengangModel->addSelect('gruppe'); + $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); + $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); + + $this->_ci->StudiengangModel->addOrder('gruppe'); - $stg = current(getData($result)); + $where = [ + 'v.studiengang_kz' => $studiengang_kz, + 'v.semester' => $semester, + 'v.verband' => $verband, + 'v.gruppe !=' => '', + 'v.aktiv' => true + ]; - if (!$stg->mischform) - return []; + if ($orgform_kurzbz !== null && $semester) // NOTE(chris): on semester 0 show all? + $where['v.orgform_kurzbz'] = $orgform_kurzbz; + $result = $this->_ci->StudiengangModel->loadWhere($where); + + return getData($result) ?: []; + } + + public function orgform($path_template, $studiengang_kz) + { $this->_ci->load->model('organisation/Studienordnung_model', 'StudienordnungModel'); $this->_ci->StudienordnungModel->addDistinct(); - $this->_ci->StudienordnungModel->addSelect("FORMAT(" . $this->_ci->StudienordnungModel->escape($pathTemplate) . ", p.orgform_kurzbz) AS path"); - $this->_ci->StudienordnungModel->addSelect("FORMAT(" . $this->_ci->StudienordnungModel->escape($linkTemplate) . ", p.orgform_kurzbz) AS link"); + $this->_ci->StudienordnungModel->addSelect("FORMAT( + " . $this->_ci->StudienordnungModel->escape($path_template) . ", + LOWER(p.orgform_kurzbz) + ) AS path"); $this->_ci->StudienordnungModel->addSelect("p.orgform_kurzbz AS name"); $this->_ci->StudienordnungModel->addSelect("studiengang_kz AS stg_kz"); @@ -167,145 +267,16 @@ class StgBasedMenuLib extends MenuBuilderLib $result = $this->_ci->StudienordnungModel->loadWhere([ 'aktiv' => true, - 'studiengang_kz' => $vars['studiengang_kz'], + 'studiengang_kz' => $studiengang_kz, 'p.orgform_kurzbz !=' => 'DDP' ]); - return getData($result) ?: []; - } - - protected function getGroups($vars) - { - // TODO(chris): permission on stg - // TODO(chris): check vars - - $pathTemplate = $this->getPathTemplate($vars); - $linkTemplate = $this->getLinkTemplate($vars); - - $this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel'); - - $this->_ci->GruppeModel->addDistinct(); - $this->_ci->GruppeModel->addSelect("FORMAT(" . $this->_ci->GruppeModel->escape($pathTemplate) . ", gruppe_kurzbz) AS path", false); - $this->_ci->GruppeModel->addSelect("FORMAT(" . $this->_ci->GruppeModel->escape($linkTemplate) . ", gruppe_kurzbz) AS link", false); - $this->_ci->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false); - $this->_ci->GruppeModel->addSelect("TRUE AS leaf", false); - - $this->_ci->GruppeModel->addSelect('sort'); - $this->_ci->GruppeModel->addSelect('gruppe_kurzbz'); - $this->_ci->GruppeModel->addSelect($this->_ci->GruppeModel->escape($vars['studiengang_kz']) . '::integer AS stg_kz', false); - $this->_ci->GruppeModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); - - $this->_ci->GruppeModel->addOrder('sort'); - $this->_ci->GruppeModel->addOrder('gruppe_kurzbz'); - - $where = [ - 'studiengang_kz' => $vars['studiengang_kz'], - 'semester' => $vars['semester'], - 'lehre' => true, - 'sichtbar' => true, - 'aktiv' => true, - 'direktinskription' => false - ]; - - if (isset($vars['org_form'])) - $where['orgform_kurzbz'] = $vars['org_form']; - - $result = $this->_ci->GruppeModel->loadWhere($where); return getData($result) ?: []; } - protected function getVerbaende($vars) + public function studiensemester($path_template, $studiengang_kz) { - // TODO(chris): permission on stg - // TODO(chris): check vars - - $pathTemplate = $this->getPathTemplate($vars); - $linkTemplate = $this->getLinkTemplate($vars); - - $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); - - $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); - - $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($pathTemplate) . ", verband) AS path", false); - $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($linkTemplate) . ", verband) AS link", false); - $this->_ci->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband ORDER BY gruppe LIMIT 1)) AS name", false); - $this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf"); - - $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($vars['semester']) . ' AS semester'); - $this->_ci->StudiengangModel->addSelect('verband'); - $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($vars['studiengang_kz']) . '::integer AS stg_kz', false); - $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); - - $this->_ci->StudiengangModel->addOrder('verband'); - - $this->_ci->StudiengangModel->addGroupBy('path, link, name, verband'); - - $where = [ - 'v.studiengang_kz' => $vars['studiengang_kz'], - 'v.semester' => $vars['semester'], - 'v.verband !=' => '', - 'v.aktiv' => true - ]; - - if (isset($vars['org_form']) && $vars['semester']) // NOTE(chris): on semester 0 show all? - $where['v.orgform_kurzbz'] = $vars['org_form']; - - $result = $this->_ci->StudiengangModel->loadWhere($where); - - return getData($result) ?: []; - } - - protected function getVerbandGroups($vars) - { - // TODO(chris): permission on stg - // TODO(chris): check vars - - $pathTemplate = $this->getPathTemplate($vars); - $linkTemplate = $this->getLinkTemplate($vars); - - $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); - - $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); - - $this->_ci->StudiengangModel->addDistinct(); - $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($pathTemplate) . ", gruppe) AS path", false); - $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($linkTemplate) . ", gruppe) AS link", false); - $this->_ci->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, gruppe, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband AND gruppe=v.gruppe ORDER BY gruppe LIMIT 1)) AS name", false); - $this->_ci->StudiengangModel->addSelect("TRUE AS leaf", false); - - $this->_ci->StudiengangModel->addSelect('v.semester'); - $this->_ci->StudiengangModel->addSelect('v.verband'); - $this->_ci->StudiengangModel->addSelect('gruppe'); - $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($vars['studiengang_kz']) . '::integer AS stg_kz', false); - $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); - - $this->_ci->StudiengangModel->addOrder('gruppe'); - - $where = [ - 'v.studiengang_kz' => $vars['studiengang_kz'], - 'v.semester' => $vars['semester'], - 'v.verband' => $vars['verband'], - 'v.gruppe !=' => '', - 'v.aktiv' => true - ]; - - if (isset($vars['org_form']) && $vars['semester']) // NOTE(chris): on semester 0 show all? - $where['v.orgform_kurzbz'] = $vars['org_form']; - - $result = $this->_ci->StudiengangModel->loadWhere($where); - - return getData($result) ?: []; - } - - protected function getStdSemester($vars) - { - // TODO(chris): permission on stg - // TODO(chris): check vars - - $pathTemplate = $this->getPathTemplate($vars); - $linkTemplate = $this->getLinkTemplate($vars); - $number_displayed_past_studiensemester = null; $this->_ci->load->model('system/Variable_model', 'VariableModel'); @@ -327,9 +298,11 @@ class StgBasedMenuLib extends MenuBuilderLib $this->_ci->StudiensemesterModel->addPlusMinus(null, $number_displayed_past_studiensemester); $this->_ci->StudiensemesterModel->addSelect("studiensemester_kurzbz AS name"); - $this->_ci->StudiensemesterModel->addSelect("FORMAT(" . $this->_ci->StudiensemesterModel->escape($pathTemplate) . ", studiensemester_kurzbz) AS path", false); - $this->_ci->StudiensemesterModel->addSelect("FORMAT(" . $this->_ci->StudiensemesterModel->escape($linkTemplate) . ", studiensemester_kurzbz) AS link", false); - $this->_ci->StudiensemesterModel->addSelect($this->_ci->StudiensemesterModel->escape($vars['studiengang_kz']) . " AS stg_kz", false); + $this->_ci->StudiensemesterModel->addSelect("FORMAT( + " . $this->_ci->StudiensemesterModel->escape($path_template) . ", + LOWER(studiensemester_kurzbz) + ) AS path", false); + $this->_ci->StudiensemesterModel->addSelect($this->_ci->StudiensemesterModel->escape($studiengang_kz) . " AS stg_kz", false); $this->_ci->StudiensemesterModel->addOrder('ende');