diff --git a/application/config/menubuilder.php b/application/config/menubuilder.php index 64337a691..b63b4f079 100644 --- a/application/config/menubuilder.php +++ b/application/config/menubuilder.php @@ -20,3 +20,196 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); $config['stv'] = "menu/StvMenuLib"; + +$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'] + ] + ] + ] +]; +/*$config['config_stg_based'] = [ + 'stgLib' => array_merge( + $config_part_stg_orgform, + [ + 'orgformLib' => [ + 'prestudentLib' => [ + 'stdsemLib' => [ + 'interessentenLib' + ], + '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' + ] + ] + ] + ] + ] + + ] + ] + ) + ], + 'inoutLib' => [ + 'incomingLib', + 'outgoingLib', + 'shared_studiesLib' + ] +]; +*/ \ No newline at end of file diff --git a/application/libraries/MenuBuilderLib.php b/application/libraries/MenuBuilderLib.php new file mode 100644 index 000000000..0509c98aa --- /dev/null +++ b/application/libraries/MenuBuilderLib.php @@ -0,0 +1,222 @@ +. + */ + +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/StgBasedMenuLib.php b/application/libraries/menu/StgBasedMenuLib.php new file mode 100644 index 000000000..bcff3f7a3 --- /dev/null +++ b/application/libraries/menu/StgBasedMenuLib.php @@ -0,0 +1,340 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +require_once(APPPATH . 'libraries/MenuBuilderLib.php'); + +/** + * StudVw Menu library + */ +class StgBasedMenuLib extends MenuBuilderLib +{ + /** + * Constructor + */ + public function __construct() + { + parent::__construct(); + $this->config = $this->_ci->config->item('config_stg_based'); + } + + protected function mapUrlPartToVars($key, $value) + { + 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( + "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name", + false + ); + $this->_ci->StudiengangModel->addSelect("studiengang_kz AS title"); + $this->_ci->StudiengangModel->addSelect("studiengang_kz AS search"); + $this->_ci->StudiengangModel->addSelect('erhalter_kz'); + $this->_ci->StudiengangModel->addSelect('typ'); + $this->_ci->StudiengangModel->addSelect('kurzbz'); + $this->_ci->StudiengangModel->addSelect('studiengang_kz'); + $this->_ci->StudiengangModel->addSelect('studiengang_kz AS stg_kz'); + + $this->_ci->StudiengangModel->addOrder('erhalter_kz'); + $this->_ci->StudiengangModel->addOrder('typ'); + $this->_ci->StudiengangModel->addOrder('kurzbz'); + + $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $stgs); + + $result = $this->_ci->StudiengangModel->loadWhere(['v.aktiv' => true]); + + return getData($result) ?: []; + } + + protected function getSemester($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) . ", semester) AS path", false); + $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($linkTemplate) . ", semester) AS link", false); + $this->_ci->StudiengangModel->addSelect("CONCAT( + UPPER(CONCAT(typ, kurzbz)), + '-', + semester, + ( + 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 + ORDER BY verband, gruppe LIMIT 1 + ) + ) 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("ARRAY['link-strict', 'student-collection'] AS droplink"); + + $this->_ci->StudiengangModel->addOrder('semester'); + + if (isset($vars['org_form'])) { + $this->_ci->StudiengangModel->addSelect("v.orgform_kurzbz"); + $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->group_end(); + } + + $result = $this->_ci->StudiengangModel->loadWhere([ + 'v.studiengang_kz' => $vars['studiengang_kz'], + 'v.aktiv' => true + ]); + + return getData($result) ?: []; + } + + protected function getOrgforms($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'); + + // NOTE(chris): if mischform show orgforms + $result = $this->_ci->StudiengangModel->load($vars['studiengang_kz']); + + if (!hasData($result)) + return []; + + $stg = current(getData($result)); + + if (!$stg->mischform) + return []; + + $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("p.orgform_kurzbz AS name"); + $this->_ci->StudienordnungModel->addSelect("studiengang_kz AS stg_kz"); + + $this->_ci->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id'); + + $result = $this->_ci->StudienordnungModel->loadWhere([ + 'aktiv' => true, + 'studiengang_kz' => $vars['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) + { + // 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'); + + $result = $this->_ci->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']); + if (isError($result)) + return []; + + $data = getData($result); + if ($data && isset($data['number_displayed_past_studiensemester'])) { + $number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester']; + } else { + $this->_ci->load->config('stv'); + $number_displayed_past_studiensemester = $this->_ci->config->item('number_displayed_past_studiensemester_default'); + } + + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $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->addOrder('ende'); + + $result = $this->_ci->StudiensemesterModel->load(); + + return getData($result) ?: []; + } +} diff --git a/application/libraries/menu/StvMenuLib.php b/application/libraries/menu/StvMenuLib.php new file mode 100644 index 000000000..0bd975937 --- /dev/null +++ b/application/libraries/menu/StvMenuLib.php @@ -0,0 +1,78 @@ +. + */ + +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; + } +}