diff --git a/app/controllers/lvgruppen/lvgruppen.php b/app/controllers/lvgruppen/lvgruppen.php index 194f1718ba0b1e4b91b8d978703c61b04233531a..5bac0fdd1f37f0d7bcbdd259f17bd884ddf52a22 100644 --- a/app/controllers/lvgruppen/lvgruppen.php +++ b/app/controllers/lvgruppen/lvgruppen.php @@ -41,6 +41,25 @@ class Lvgruppen_LvgruppenController extends MVVController $search_result = $this->getSearchResult('Lvgruppe'); + $lvg_ids = []; + if (count($search_result) > 0) { + $lvg_ids = $search_result; + } else { + if (!empty($_SESSION['mvv_filter_lvg_fach_id'])) { + $lvg_ids = $this->findLvgIdsByFach($_SESSION['mvv_filter_lvg_fach_id']); + } + if (!empty($_SESSION['mvv_filter_lvg_abschluss_id'])) { + if (count($lvg_ids) > 0) { + $lvg_ids = array_intersect( + $lvg_ids, + $this->findLvgIdsByAbschluss($_SESSION['mvv_filter_lvg_abschluss_id']) + ); + } else { + $lvg_ids = $this->findLvgIdsByAbschluss($_SESSION['mvv_filter_lvg_abschluss_id']); + } + } + } + // Nur LvGruppen an Modulen von verantwortlichen Einrichtungen an denen der User // eine Rolle hat $own_institutes = MvvPerm::getOwnInstitutes(); @@ -342,7 +361,7 @@ class Lvgruppen_LvgruppenController extends MVVController $sidebar = Sidebar::get(); $widget = new SelectWidget( - _('Verwendung in Semester:'), + _('Verwendet in Semester'), $this->action_url('set_filter', ['fachbereich_filter' => $selected_fachbereich]), 'semester_filter' ); @@ -368,7 +387,7 @@ class Lvgruppen_LvgruppenController extends MVVController $perm_institutes = MvvPerm::getOwnInstitutes(); if ($perm_institutes !== false) { $widget = new SelectWidget( - _('Verwendet von Fachbereich:'), + _('Verwendet von Fachbereich'), $this->action_url('set_filter', ['semester_filter' => $this->semester_filter]), 'fachbereich_filter' ); @@ -400,6 +419,52 @@ class Lvgruppen_LvgruppenController extends MVVController $sidebar->addWidget($widget, 'fachbereich_filter'); } + + $selected_fach = $_SESSION['mvv_filter_lvg_fach_id'] ?? ''; + $widget = new SelectWidget( + _('Verwendet von Fach'), + $this->action_url('set_filter', ['fach_filter' => $selected_fach]), + 'fach_filter' + ); + $widget->class = 'nested-select'; + $widget->addElement( + new SelectElement('select-none', _('Alle'), $selected_fach === '') + ); + $faecher = Fach::findBySQL(' 1 ORDER BY `name`'); + foreach ($faecher as $fach) { + $widget->addElement( + new SelectElement( + $fach->id, + $fach->name, + $selected_fach === $fach->id + ), + 'select-' . $fach->name + ); + } + $sidebar->addWidget($widget, 'fach_filter'); + + $selected_abschluss = $_SESSION['mvv_filter_lvg_abschluss_id'] ?? ''; + $widget = new SelectWidget( + _('Verwendet von Abschluss'), + $this->action_url('set_filter', ['abschluss_filter' => $selected_abschluss]), + 'abschluss_filter' + ); + $widget->class = 'nested-select'; + $widget->addElement( + new SelectElement('select-none', _('Alle'), $selected_abschlussh === '') + ); + $abschluesse = Abschluss::findBySQL(' 1 ORDER BY `name`'); + foreach ($abschluesse as $abschluss) { + $widget->addElement( + new SelectElement( + $abschluss->id, + $abschluss->name, + $selected_abschluss === $abschluss->id + ), + 'select-' . $abschluss->name + ); + } + $sidebar->addWidget($widget, 'abschluss_filter'); } /** @@ -415,6 +480,12 @@ class Lvgruppen_LvgruppenController extends MVVController $this->semester_filter = mb_strlen(Request::get('semester_filter')) ? Request::option('semester_filter') : null; + // Fach + $_SESSION['mvv_filter_lvg_fach_id'] = Request::option('fach_filter', ''); + + // Abschluss + $_SESSION['mvv_filter_lvg_abschluss_id'] = Request::option('abschluss_filter', ''); + // store filter $this->reset_page(); $this->sessSet('filter', $this->filter); @@ -424,6 +495,9 @@ class Lvgruppen_LvgruppenController extends MVVController public function reset_filter_action() { + $_SESSION['mvv_filter_lvg_fach_id'] = ''; + $_SESSION['mvv_filter_lvg_abschluss_id'] = ''; + $this->filter = []; $this->sessRemove('filter'); $this->semester_filter = null; @@ -467,4 +541,43 @@ class Lvgruppen_LvgruppenController extends MVVController } ); } + + /** + * Returns the ids of the lvgruppen related to the given subject id. + * + * @param string $fach_id The id of the selected subject. + * @return array The ids of the modules related to the subject. + */ + private function findLvgIdsByFach(string $fach_id): array + { + $query = "SELECT `mvv_lvgruppe_modulteil`.`lvgruppe_id` + FROM `mvv_lvgruppe_modulteil` + JOIN `mvv_modulteil` USING (`modulteil_id`) + JOIN `mvv_stgteilabschnitt_modul` USING (`modul_id`) + JOIN `mvv_stgteilabschnitt` USING (`abschnitt_id`) + JOIN `mvv_stgteilversion` USING (`version_id`) + JOIN `mvv_stgteil` USING (`stgteil_id`) + WHERE `mvv_stgteil`.`fach_id` = ?"; + return DBManager::get()->fetchFirst($query, [$fach_id]); + } + + /** + * Returns the ids of the lvgruppen related to the given degree id. + * + * @param string $abschluss_id The id of the selected degree. + * @return array The ids of the lvgruppen related to the degree. + */ + private function findLvgIdsByAbschluss(string $abschluss_id): array + { + $query = "SELECT `mvv_lvgruppe_modulteil`.`lvgruppe_id` + FROM `mvv_lvgruppe_modulteil` + JOIN `mvv_modulteil` USING (`modulteil_id`) + JOIN `mvv_stgteilabschnitt_modul` USING (`modul_id`) + JOIN `mvv_stgteilabschnitt` USING (`abschnitt_id`) + JOIN `mvv_stgteilversion` USING (`version_id`) + JOIN `mvv_stg_stgteil` USING (`stgteil_id`) + JOIN `mvv_studiengang` USING (`studiengang_id`) + WHERE `mvv_studiengang`.`abschluss_id` = ?"; + return DBManager::get()->fetchFirst($query, [$abschluss_id]); + } } diff --git a/app/controllers/materialien/files.php b/app/controllers/materialien/files.php index 65c9b4404e37ecfd5b561ef63616bda44a4f1500..804668ef60355c82984cb5c1379deaaa4b5662d1 100644 --- a/app/controllers/materialien/files.php +++ b/app/controllers/materialien/files.php @@ -38,11 +38,31 @@ class Materialien_FilesController extends MVVController $this->initSearchParams(); $search_result = $this->getSearchResult('MvvFile'); - if ($search_result) { + + $file_ids = []; + if (count($search_result) > 0) { + $file_ids = $search_result; + } else { + if (!empty($_SESSION['mvv_filter_files_fach_id'])) { + $file_ids = $this->findFileIdsByFach($_SESSION['mvv_filter_contacts_fach_id']); + } + if (!empty($_SESSION['mvv_filter_files_abschluss_id'])) { + if (count($file_ids) > 0) { + $file_ids = array_intersect( + $file_ids, + $this->findFileIdsByAbschluss($_SESSION['mvv_filter_contacts_abschluss_id']) + ); + } else { + $file_ids = $this->findFileIdsByAbschluss($_SESSION['mvv_filter_contacts_abschluss_id']); + } + } + } + + if ($file_ids) { $ranges = []; $refs = []; $this->filter = array_merge( - ['mvv_files.mvvfile_id' => $search_result], + ['mvv_files.mvvfile_id' => $file_ids], (array) $this->filter ); } @@ -589,6 +609,13 @@ class Materialien_FilesController extends MVVController } else { $this->sessRemove('filter'); } + + // Fach + $_SESSION['mvv_filter_files_fach_id'] = Request::option('fach_filter', ''); + + // Abschluss + $_SESSION['mvv_filter_files_abschluss_id'] = Request::option('abschluss_filter', ''); + // store filter $this->reset_page(); $this->sessSet('filter', $this->filter); @@ -597,6 +624,9 @@ class Materialien_FilesController extends MVVController public function reset_filter_action() { + $_SESSION['mvv_filter_files_fach_id'] = ''; + $_SESSION['mvv_filter_files_abschluss_id'] = ''; + $this->filter = []; $this->reset_search(); $this->sessRemove('filter'); @@ -652,7 +682,9 @@ class Materialien_FilesController extends MVVController $this->filter ); unset($institute_filter['searchnames']); - + $file_ids = MvvFile::getIdsFiltered($this->filter, true, false); + $count_faecher = $this->countFaecher($file_ids, $_SESSION['mvv_filter_files_fach_id'] ?? ''); + $count_abschluesse = $this->countAbschluesse($file_ids, $_SESSION['mvv_filter_files_abschluss_id'] ?? ''); $semesters = new SimpleCollection(array_reverse(Semester::getAll())); $filter_template = $template_factory->render('shared/filter', [ 'name_search' => true, @@ -666,6 +698,16 @@ class Materialien_FilesController extends MVVController 'selected_institut' => $this->filter['mvv_studiengang.institut_id'] ?? '', 'zuordnungen' => !empty($this->search_result['MvvFile']) ? MvvFile::getAllRelations($this->search_result['MvvFile']) : [], 'selected_zuordnung' => $this->filter['mvv_files_ranges.range_type'] ?? '', + 'faecher' => SimpleORMapCollection::createFromArray( + Fach::findMany(array_keys($count_faecher)) + )->orderBy('name'), + 'count_faecher' => $count_faecher, + 'selected_fach' => $_SESSION['mvv_filter_files_fach_id'] ?? '', + 'abschluesse' => SimpleORMapCollection::createFromArray( + Abschluss::findMany(array_keys($count_abschluesse)) + )->orderBy('name'), + 'count_abschluesse' => $count_abschluesse, + 'selected_abschluss' => $_SESSION['mvv_filter_files_abschluss_id'] ?? '', 'action' => $this->action_url('set_filter'), 'action_reset' => $this->action_url('reset_filter')] ); @@ -895,4 +937,227 @@ class Materialien_FilesController extends MVVController $this->redirect($this->url_for('materialien/files/add_dokument', 'index', $range_type, implode(',', Request::getArray('range_id')))); } } + + /** + * Returns the number of files grouped by subjects for given file ids. + * + * @param array $module_ids The ids of the files. + * @param string $fach_id The id of the selected subject. + * @return array Number of files grouped by subjects. + */ + private function countFaecher(array $file_ids, string $fach_id): array + { + if ($fach_id === '') { + $params = [':file_ids' => $file_ids]; + $where = "`mvv_files_ranges`.`mvvfile_id` IN (:file_ids)"; + } else { + $params = [ + ':fach_id' => $fach_id, + ':file_ids' => $file_ids + ]; + $where = "`fach`.`fach_id` = :fach_id + AND `mvv_files_ranges`.`mvvfile_id` IN (:file_ids)"; + } + $query = "SELECT `counting`.`fach_id`, COUNT(DISTINCT `counting`.`mvvfile_id`) + FROM ( + SELECT `fach_id`, `mvvfile_id` + FROM `fach` + JOIN `mvv_stgteil` USING (`fach_id`) + JOIN `mvv_stg_stgteil` USING (`stgteil_id`) + JOIN `mvv_studiengang` USING (`studiengang_id`) + JOIN `mvv_abschl_zuord` USING (`abschluss_id`) + JOIN `mvv_files_ranges` + ON ( + `mvv_files_ranges`.`range_id` = `mvv_abschl_zuord`.`kategorie_id` + AND `mvv_files_ranges`.`range_type` = 'AbschlussKategorie' + ) + WHERE {$where} + + UNION ALL + + SELECT `fach_id`, `mvvfile_id` + FROM `fach` + JOIN `mvv_stgteil` USING (`fach_id`) + JOIN `mvv_stg_stgteil` USING (`stgteil_id`) + JOIN `mvv_studiengang` USING (`studiengang_id`) + JOIN `mvv_files_ranges` + ON ( + `mvv_files_ranges`.`range_id` = `mvv_studiengang`.`studiengang_id` + AND `mvv_files_ranges`.`range_type` = 'Studiengang' + ) + WHERE {$where} + + UNION ALL + + SELECT `fach_id`, `mvvfile_id` + FROM `fach` + JOIN `mvv_stgteil` USING (`fach_id`) + JOIN `mvv_stgteilversion` USING(`stgteil_id`) + JOIN `mvv_files_ranges` + ON ( + `mvv_files_ranges`.`range_id` = `mvv_stgteilversion`.`version_id` + AND `mvv_files_ranges`.`range_type` = 'StgteilVersion' + ) + WHERE {$where} + ) AS `counting` + GROUP BY `counting`.`fach_id`"; + return DBManager::get()->fetchPairs($query, $params); + } + + /** + * Returns the ids of the files related to the given subject id. + * + * @param string $fach_id The id of the selected subject. + * @return array The ids of the files related to the subject. + */ + private function findFileIdsByFach(string $fach_id): array + { + $query = "SELECT `mvv_files_ranges`.`mvvfile_id` + FROM `mvv_files_ranges` + JOIN `mvv_stgteilversion` + ON ( + `mvv_stgteilversion`.`version_id` = `mvv_files_ranges`.`range_id` + AND `mvv_files_ranges`.`range_type` = 'StgteilVersion' + ) + JOIN `mvv_stgteil` USING (`stgteil_id`) + WHERE `mvv_stgteil`.`fach_id` = :fach_id + + UNION + + SELECT `mvv_files_ranges`.`mvvfile_id` + FROM `mvv_files_ranges` + JOIN `mvv_studiengang` + ON ( + `mvv_studiengang`.`studiengang_id` = `mvv_files_ranges`.`range_id` + AND `mvv_files_ranges`.`range_type` = 'Studiengang' + ) + JOIN `mvv_stg_stgteil` USING (`studiengang_id`) + JOIN `mvv_stgteil` USING (`stgteil_id`) + WHERE `mvv_stgteil`.`fach_id` = :fach_id + + UNION + + SELECT `mvv_files_ranges`.`mvvfile_id` + FROM `mvv_files_ranges` + JOIN `mvv_abschl_zuord` + ON ( + `mvv_files_ranges`.`range_id` = `mvv_abschl_zuord`.`kategorie_id` + AND `mvv_files_ranges`.`range_type` = 'AbschlussKategorie' + ) + JOIN `mvv_studiengang` USING (`abschluss_id`) + JOIN `mvv_stg_stgteil` USING (`studiengang_id`) + JOIN `mvv_stgteil` USING (`stgteil_id`) + WHERE `mvv_stgteil`.`fach_id` = :fach_id"; + + return DBManager::get()->fetchFirst($query, [':fach_id' => $fach_id]); + } + + /** + * Returns the number of files grouped by degrees for given file ids. + * + * @param array $module_ids The ids of the files. + * @param string $abschluss_id The id of the selected degree. + * @return array Number of files grouped by degrees. + */ + private function countAbschluesse(array $file_ids, string $abschluss_id): array + { + if ($abschluss_id === '') { + $params = [':file_ids' => $file_ids]; + $where = "`mvv_files_ranges`.`mvvfile_id` IN (:file_ids)"; + } else { + $params = [ + ':abschluss_id' => $abschluss_id, + ':file_ids' => $file_ids + ]; + $where = "`abschluss`.`abschluss_id` = :abschluss_id + AND `mvv_files_ranges`.`mvvfile_id` IN (:file_ids)"; + } + $query = "SELECT `counting`.`abschluss_id`, COUNT(DISTINCT `counting`.`mvvfile_id`) + FROM ( + SELECT `abschluss_id`, `mvvfile_id` + FROM `abschluss` + JOIN `mvv_studiengang` USING (`abschluss_id`) + JOIN `mvv_stg_stgteil` USING (`studiengang_id`) + JOIN `mvv_stgteilversion` USING (`stgteil_id`) + JOIN `mvv_files_ranges` + ON ( + `mvv_files_ranges`.`range_id` = `mvv_stgteilversion`.`version_id` + AND `mvv_files_ranges`.`range_type` = 'StgteilVersion' + ) + WHERE {$where} + + UNION ALL + + SELECT `abschluss_id`, `mvvfile_id` + FROM `abschluss` + JOIN `mvv_studiengang` USING (`abschluss_id`) + JOIN `mvv_files_ranges` + ON ( + `mvv_files_ranges`.`range_id` = `mvv_studiengang`.`studiengang_id` + AND `mvv_files_ranges`.`range_type` = 'Studiengang' + ) + WHERE {$where} + + UNION ALL + + SELECT `abschluss_id`, `mvvfile_id` + FROM `abschluss` + JOIN `mvv_studiengang` USING (`abschluss_id`) + JOIN `mvv_abschl_zuord` USING (`abschluss_id`) + JOIN `mvv_files_ranges` + ON ( + `mvv_files_ranges`.`range_id` = `mvv_abschl_zuord`.`kategorie_id` + AND `mvv_files_ranges`.`range_type` = 'AbschlussKategorie' + ) + WHERE {$where} + ) AS `counting` + GROUP BY `counting`.`abschluss_id`"; + + return DBManager::get()->fetchPairs($query, $params); + } + + /** + * Returns the ids of the files related to the given degree id. + * + * @param string $abschluss_id The id of the selected degree. + * @return array The ids of the files related to the degree. + */ + private function findFileIdsByAbschluss(string $abschluss_id): array + { + $query = "SELECT `mvv_files_ranges`.`mvvfile_id` + FROM `mvv_files_ranges` + JOIN `mvv_abschl_zuord` + ON ( + `mvv_abschl_zuord`.`kategorie_id` = `mvv_files_ranges`.`range_id` + AND `mvv_files_ranges`.`range_type` = 'AbschlussKategorie' + ) + JOIN `mvv_studiengang` USING(`abschluss_id`) + WHERE `mvv_studiengang`.`abschluss_id` = :abschluss_id + + UNION + + SELECT `mvv_files_ranges`.`mvvfile_id` + FROM `mvv_files_ranges` + JOIN `mvv_studiengang` + ON ( + `mvv_studiengang`.`studiengang_id` = `mvv_files_ranges`.`range_id` + AND `mvv_files_ranges`.`range_type` = 'Studiengang' + ) + WHERE `mvv_studiengang`.`abschluss_id` = :abschluss_id + + UNION + + SELECT `mvv_files_ranges`.`mvvfile_id` + FROM `mvv_files_ranges` + JOIN `mvv_stgteilversion` + ON ( + `mvv_files_ranges`.`range_id` = `mvv_stgteilversion`.`version_id` + AND `mvv_files_ranges`.`range_type` = 'StgteilVersion' + ) + JOIN `mvv_stg_stgteil` USING(`stgteil_id`) + JOIN `mvv_studiengang` USING(`studiengang_id`) + WHERE `mvv_studiengang`.`abschluss_id` = :abschluss_id"; + + return DBManager::get()->fetchFirst($query, [':abschluss_id' => $abschluss_id]); + } } diff --git a/app/controllers/module/module.php b/app/controllers/module/module.php index f8c99174c8cad04f9e42030df71590be4743d79f..852e9d976660829883427bd0d250d83bfbeed646 100644 --- a/app/controllers/module/module.php +++ b/app/controllers/module/module.php @@ -50,9 +50,29 @@ class Module_ModuleController extends MVVController if (empty($this->filter['mvv_modul_inst.institut_id'])) { unset($this->filter['mvv_modul_inst.institut_id']); } + + $module_ids = []; + if (count($search_result) > 0) { + $module_ids = $search_result; + } else { + if ($_SESSION['mvv_filter_module_fach_id']) { + $module_ids = $this->findModuleIdsByFach($_SESSION['mvv_filter_module_fach_id']); + } + if (!empty($_SESSION['mvv_filter_module_abschluss_id'])) { + if (count($module_ids) > 0) { + $module_ids = array_intersect( + $module_ids, + $this->findModuleIdsByAbschluss($_SESSION['mvv_filter_module_abschluss_id']) + ); + } else { + $module_ids = $this->findModuleIdsByAbschluss($_SESSION['mvv_filter_module_abschluss_id']); + } + } + } + $this->filter = array_merge( [ - 'mvv_modul.modul_id' => $search_result, + 'mvv_modul.modul_id' => $module_ids, 'mvv_modul_inst.gruppe' => 'hauptverantwortlich', 'mvv_modul_inst.institut_id' => MvvPerm::getOwnInstitutes() ], @@ -1286,6 +1306,12 @@ class Module_ModuleController extends MVVController $this->filter['mvv_modul_inst.institut_id'] = MvvPerm::getOwnInstitutes(); } + // Fach + $_SESSION['mvv_filter_module_fach_id'] = Request::option('fach_filter', ''); + + // Abschluss + $_SESSION['mvv_filter_module_abschluss_id'] = Request::option('abschluss_filter', ''); + // store filter $this->reset_page(); $this->sessSet('filter', $this->filter); @@ -1296,6 +1322,9 @@ class Module_ModuleController extends MVVController { $this->reset_page(); + $_SESSION['mvv_filter_module_fach_id'] = ''; + $_SESSION['mvv_filter_module_abschluss_id'] = ''; + $this->sessSet('filter', []); $this->redirect($this->indexURL()); } @@ -1380,6 +1409,21 @@ class Module_ModuleController extends MVVController $selected_semester = $semesters->findOneBy('beginn', $this->filter['start_sem.beginn']); } + // Fach + $count_faecher = $this->countFaecher($modul_ids, $_SESSION['mvv_filter_module_fach_id'] ?? ''); + $template->set_attribute('faecher', SimpleORMapCollection::createFromArray( + Fach::findMany(array_keys($count_faecher)) + )->orderBy('name')); + $template->set_attribute('count_faecher', $count_faecher); + $template->set_attribute('selected_fach', $_SESSION['mvv_filter_module_fach_id'] ?? ''); + + // Abschluss + $count_abschluesse = $this->countAbschluesse($modul_ids, $_SESSION['mvv_filter_module_abschluss_id'] ?? ''); + $template->set_attribute('abschluesse', SimpleORMapCollection::createFromArray( + Abschluss::findMany(array_keys($count_abschluesse)) + )->orderBy('name')); + $template->set_attribute('count_abschluesse', $count_abschluesse); + $template->set_attribute('selected_abschluss', $_SESSION['mvv_filter_module_abschluss_id'] ?? ''); $template->set_attribute('semester', $semesters); $template->set_attribute('selected_semester', $selected_semester->id ?? ''); @@ -1432,4 +1476,102 @@ class Module_ModuleController extends MVVController ); $sidebar->addWidget($widget, 'search'); } + + /** + * Returns the number of modules grouped by subjects for given module ids. + * + * @param array $module_ids The ids of the modules. + * @param string $fach_id The id of the selected subject. + * @return array Number of modules grouped by subjects. + */ + private function countFaecher(array $module_ids, string $fach_id): array + { + if ($fach_id === '') { + $params = [':module_ids' => $module_ids]; + $where = "`mvv_stgteilabschnitt_modul`.`modul_id` IN (:module_ids)"; + } else { + $params = [ + ':fach_id' => $fach_id, + ':module_ids' => $module_ids + ]; + $where = "`fach`.`fach_id` = :fach_id + AND `mvv_stgteilabschnitt_modul`.`modul_id` IN (:module_ids)"; + } + $query = "SELECT `fach`.`fach_id`, COUNT(DISTINCT `modul_id`) AS `count_faecher` + FROM `fach` + JOIN `mvv_stgteil` USING (`fach_id`) + JOIN `mvv_stgteilversion` USING (`stgteil_id`) + JOIN `mvv_stgteilabschnitt` USING (`version_id`) + JOIN `mvv_stgteilabschnitt_modul` USING (`abschnitt_id`) + WHERE {$where} + GROUP BY `fach_id`"; + return DBManager::get()->fetchPairs($query, $params); + } + + /** + * Returns the ids of the modules related to the given subject id. + * + * @param string $fach_id The id of the selected subject. + * @return array The ids of the modules related to the subject. + */ + private function findModuleIdsByFach(string $fach_id): array + { + $query = "SELECT `mvv_stgteilabschnitt_modul`.`modul_id` + FROM `mvv_stgteilabschnitt_modul` + JOIN `mvv_stgteilabschnitt` USING (`abschnitt_id`) + JOIN `mvv_stgteilversion` USING (`version_id`) + JOIN `mvv_stgteil` USING (`stgteil_id`) + WHERE `mvv_stgteil`.`fach_id` = ?"; + return DBManager::get()->fetchFirst($query, [$fach_id]); + } + + /** + * Returns the number of modules grouped by degrees for given module ids. + * + * @param array $module_ids The ids of the modules. + * @param string $abschluss_id The id of the selected degree. + * @return array Number of modules grouped by degrees. + */ + private function countAbschluesse(array $module_ids, $abschluss_id): array + { + if ($abschluss_id === '') { + $params = [':module_ids' => $module_ids]; + $where = "`mvv_stgteilabschnitt_modul`.`modul_id` IN (:module_ids)"; + } else { + $params = [ + ':abschluss_ids' => $abschluss_id, + ':module_ids' => $module_ids + ]; + $where = "`abschluss`.`abschluss_id` = :abschluss_ids + AND `mvv_stgteilabschnitt_modul`.`modul_id` IN (:module_ids)"; + } + $query = "SELECT `abschluss`.`abschluss_id`, COUNT(DISTINCT `modul_id`) AS `count_abschluesse` + FROM `abschluss` + JOIN `mvv_studiengang` USING (`abschluss_id`) + JOIN `mvv_stg_stgteil` USING (`studiengang_id`) + JOIN `mvv_stgteilversion` USING (`stgteil_id`) + JOIN `mvv_stgteilabschnitt` USING (`version_id`) + JOIN `mvv_stgteilabschnitt_modul` USING (`abschnitt_id`) + WHERE {$where} + GROUP BY `abschluss_id`"; + return DBManager::get()->fetchPairs($query, $params); + } + + /** + * Returns the ids of the modules related to the given degree id. + * + * @param string $abschluss_id The id of the selected degree. + * @return array The ids of the modules related to the degree. + */ + private function findModuleIdsByAbschluss(string $abschluss_id): array + { + $query = "SELECT `mvv_stgteilabschnitt_modul`.`modul_id` + FROM `mvv_stgteilabschnitt_modul` + JOIN `mvv_stgteilabschnitt` USING (`abschnitt_id`) + JOIN `mvv_stgteilversion` USING (`version_id`) + JOIN `mvv_stg_stgteil` USING (`stgteil_id`) + JOIN `mvv_studiengang` USING (`studiengang_id`) + WHERE `mvv_studiengang`.`abschluss_id` = ?"; + return DBManager::get()->fetchFirst($query, [$abschluss_id]); + } } diff --git a/app/controllers/shared/contacts.php b/app/controllers/shared/contacts.php index a3da1a787789dca394ca5cece5d4bfe1d48a24f9..98670f4b9bd58cf90a3ce7d9ef7a0bbc571f5d01 100644 --- a/app/controllers/shared/contacts.php +++ b/app/controllers/shared/contacts.php @@ -64,8 +64,28 @@ class Shared_ContactsController extends MVVController if (empty($this->filter['mvv_modul_inst.institut_id'])) { unset($this->filter['mvv_modul_inst.institut_id']); } - if ($search_result) { - $this->filter['mvv_contacts.contact_id'] = $search_result; + + $contact_ids = []; + if (count($search_result) > 0) { + $contact_ids = $search_result; + } else { + if (!empty($_SESSION['mvv_filter_contacts_fach_id'])) { + $contact_ids = $this->findContactIdsByFach($_SESSION['mvv_filter_contacts_fach_id']); + } + if (!empty($_SESSION['mvv_filter_contacts_abschluss_id'])) { + if (count($contact_ids) > 0) { + $contact_ids = array_intersect( + $contact_ids, + $this->findContactIdsByAbschluss($_SESSION['mvv_filter_contacts_abschluss_id']) + ); + } else { + $contact_ids = $this->findContactIdsByAbschluss($_SESSION['mvv_filter_contacts_abschluss_id']); + } + } + } + + if (count($contact_ids) > 0) { + $this->filter['mvv_contacts.contact_id'] = $contact_ids; } $own_institutes = MvvPerm::getOwnInstitutes(); @@ -241,6 +261,12 @@ class Shared_ContactsController extends MVVController $this->filter['mvv_contacts_ranges.range_type'] = Request::option('zuordnung_filter'); } + // Fach + $_SESSION['mvv_filter_contacts_fach_id'] = Request::option('fach_filter', ''); + + // Abschluss + $_SESSION['mvv_filter_contacts_abschluss_id'] = Request::option('abschluss_filter', ''); + // store filter $this->reset_page(); $this->sessSet('filter', $this->filter); @@ -249,6 +275,9 @@ class Shared_ContactsController extends MVVController public function reset_filter_action() { + $_SESSION['mvv_filter_contacts_fach_id'] = ''; + $_SESSION['mvv_filter_contacts_abschluss_id'] = ''; + $this->filter = []; $this->reset_search(); $this->sessRemove('filter'); @@ -346,6 +375,9 @@ class Shared_ContactsController extends MVVController $this->filter ); + $contact_ids = MvvContact::getIdsFiltered($this->filter); + $count_faecher = $this->countFaecher($contact_ids, $_SESSION['mvv_filter_contacts_fach_id'] ?? ''); + $count_abschluesse = $this->countAbschluesse($contact_ids, $_SESSION['mvv_filter_contacts_abschluss_id'] ?? ''); $semesters = new SimpleCollection(array_reverse(Semester::getAll())); $filter_template = $template_factory->render('shared/filter', [ 'semester' => $semesters, @@ -365,6 +397,16 @@ class Shared_ContactsController extends MVVController 'status' => $this->findStatusByIds(), 'selected_status' => $this->filter['mvv_contacts.contact_status'] ?? '', 'status_array' => ['intern' => ['name' => _('Intern')], 'extern' => ['name' =>_('Extern')]], + 'faecher' => SimpleORMapCollection::createFromArray( + Fach::findMany(array_keys($count_faecher)) + )->orderBy('name'), + 'count_faecher' => $count_faecher, + 'selected_fach' => $_SESSION['mvv_filter_contacts_fach_id'] ?? '', + 'abschluesse' => SimpleORMapCollection::createFromArray( + Abschluss::findMany(array_keys($count_abschluesse)) + )->orderBy('name'), + 'count_abschluesse' => $count_abschluesse, + 'selected_abschluss' => $_SESSION['mvv_filter_contacts_abschluss_id'] ?? '', 'action' => $this->action_url('set_filter'), 'action_reset' => $this->action_url('reset_filter') ]); @@ -991,4 +1033,231 @@ class Shared_ContactsController extends MVVController } return $result; } + + /** + * Returns the number of contacts grouped by subjects for given contact ids. + * + * @param array $contact_ids The ids of the contacts. + * @param string $fach_id The id of the selected subject. + * @return array Number of contacts grouped by subjects. + */ + private function countFaecher(array $contact_ids, string $fach_id): array + { + if ($fach_id === '') { + $params = [':contact_ids' => $contact_ids]; + $where = "`mvv_contacts_ranges`.`contact_id` IN (:contact_ids)"; + } else { + $params = [ + ':fach_id' => $fach_id, + ':contact_ids' => $contact_ids + ]; + $where = "`fach`.`fach_id` = :fach_id + AND `mvv_contacts_ranges`.`contact_id` IN (:contact_ids)"; + } + $query = "SELECT `counting`.`fach_id`, COUNT(DISTINCT `counting`.`contact_id`) + FROM ( + SELECT `fach_id`, `contact_id` + FROM `fach` + JOIN `mvv_stgteil` USING (`fach_id`) + JOIN `mvv_contacts_ranges` + ON ( + `mvv_contacts_ranges`.`range_id` = `mvv_stgteil`.`stgteil_id` + AND `mvv_contacts_ranges`.`range_type` = 'StudiengangTeil' + ) + WHERE {$where} + + UNION ALL + + SELECT `fach_id`, `contact_id` + FROM `fach` + JOIN `mvv_stgteil` USING (`fach_id`) + JOIN `mvv_stg_stgteil` USING (`stgteil_id`) + JOIN `mvv_studiengang` USING (`studiengang_id`) + JOIN `mvv_contacts_ranges` + ON ( + `mvv_contacts_ranges`.`range_id` = `mvv_studiengang`.`studiengang_id` + AND `mvv_contacts_ranges`.`range_type` = 'Studiengang' + ) + WHERE {$where} + + UNION ALL + + SELECT `fach_id`, `contact_id` + FROM `fach` + JOIN `mvv_stgteil` USING (`fach_id`) + JOIN `mvv_stgteilversion` USING (`stgteil_id`) + JOIN `mvv_stgteilabschnitt` USING (`version_id`) + JOIN `mvv_stgteilabschnitt_modul` USING (`abschnitt_id`) + JOIN `mvv_contacts_ranges` + ON ( + `mvv_contacts_ranges`.`range_id` = `mvv_stgteilabschnitt_modul`.`modul_id` + AND `mvv_contacts_ranges`.`range_type` = 'Modul' + ) + WHERE {$where} + ) AS `counting` + GROUP BY `counting`.`fach_id`"; + return DBManager::get()->fetchPairs($query, $params); + } + + /** + * Returns the ids of the contacts related to the given subject id. + * + * @param string $fach_id The id of the selected subject. + * @return array The ids of the contacts related to the subject. + */ + private function findContactIdsByFach(string $fach_id): array + { + $query = "SELECT `mvv_contacts_ranges`.`contact_id` + FROM `mvv_contacts_ranges` + JOIN `mvv_stgteilabschnitt_modul` + ON ( + `mvv_stgteilabschnitt_modul`.`modul_id` = `mvv_contacts_ranges`.`range_id` + AND `mvv_contacts_ranges`.`range_type` = 'Modul' + ) + JOIN `mvv_stgteilabschnitt` USING (`abschnitt_id`) + JOIN `mvv_stgteilversion` USING (`version_id`) + JOIN `mvv_stgteil` USING (`stgteil_id`) + WHERE `mvv_stgteil`.`fach_id` = :fach_id + + UNION + + SELECT `mvv_contacts_ranges`.`contact_id` + FROM `mvv_contacts_ranges` + JOIN `mvv_studiengang` + ON ( + `mvv_studiengang`.`studiengang_id` = `mvv_contacts_ranges`.`range_id` + AND `mvv_contacts_ranges`.`range_type` = 'Studiengang' + ) + JOIN `mvv_stg_stgteil` USING (`studiengang_id`) + JOIN `mvv_stgteil` USING (`stgteil_id`) + WHERE `mvv_stgteil`.`fach_id` = :fach_id + + UNION + + SELECT `mvv_contacts_ranges`.`contact_id` + FROM `mvv_contacts_ranges` + JOIN `mvv_stgteil` + ON ( + `mvv_contacts_ranges`.`range_id` = `mvv_stgteil`.`stgteil_id` + AND `mvv_contacts_ranges`.`range_type` = 'StudiengangTeil' + ) + WHERE `mvv_stgteil`.`fach_id` = :fach_id"; + + return DBManager::get()->fetchFirst($query, [':fach_id' => $fach_id]); + } + + /** + * Returns the number of contacts grouped by degrees for given contact ids. + * + * @param array $contact_ids The ids of the contacts. + * @param string $abschluss_id The id of the selected degree. + * @return array Number of contacts grouped by degrees. + */ + private function countAbschluesse(array $contact_ids, string $abschluss_id): array + { + if ($abschluss_id === '') { + $params = [':contact_ids' => $contact_ids]; + $where = "`mvv_contacts_ranges`.`contact_id` IN (:contact_ids)"; + } else { + $params = [ + ':abschluss_id' => $abschluss_id, + ':contact_ids' => $contact_ids + ]; + $where = "`abschluss`.`abschluss_id` = :abschluss_id + AND `mvv_contacts_ranges`.`contact_id` IN (:contact_ids)"; + } + $query = "SELECT `counting`.`abschluss_id`, COUNT(DISTINCT `counting`.`contact_id`) + FROM ( + SELECT `abschluss_id`, `contact_id` + FROM `abschluss` + JOIN `mvv_studiengang` USING (`abschluss_id`) + JOIN `mvv_stg_stgteil` USING (`studiengang_id`) + JOIN `mvv_stgteil` USING (`stgteil_id`) + JOIN `mvv_contacts_ranges` + ON ( + `mvv_contacts_ranges`.`range_id` = `mvv_stgteil`.`stgteil_id` + AND `mvv_contacts_ranges`.`range_type` = 'StudiengangTeil' + ) + WHERE {$where} + + UNION ALL + + SELECT `abschluss_id`, `contact_id` + FROM `abschluss` + JOIN `mvv_studiengang` USING (`abschluss_id`) + JOIN `mvv_contacts_ranges` + ON ( + `mvv_contacts_ranges`.`range_id` = `mvv_studiengang`.`studiengang_id` + AND `mvv_contacts_ranges`.`range_type` = 'Studiengang' + ) + WHERE {$where} + + UNION ALL + + SELECT `abschluss_id`, `contact_id` + FROM `abschluss` + JOIN `mvv_studiengang` USING (`abschluss_id`) + JOIN `mvv_stg_stgteil` USING (`studiengang_id`) + JOIN `mvv_stgteilversion` USING (`stgteil_id`) + JOIN `mvv_stgteilabschnitt` USING (`version_id`) + JOIN `mvv_stgteilabschnitt_modul` USING (`abschnitt_id`) + JOIN `mvv_contacts_ranges` + ON ( + `mvv_contacts_ranges`.`range_id` = `mvv_stgteilabschnitt_modul`.`modul_id` + AND `mvv_contacts_ranges`.`range_type` = 'Modul' + ) + WHERE {$where} + ) AS `counting` + GROUP BY `counting`.`abschluss_id`"; + + return DBManager::get()->fetchPairs($query, $params); + } + + /** + * Returns the ids of the contacts related to the given degree id. + * + * @param string $abschluss_id The id of the selected degree. + * @return array The ids of the contacts related to the degree. + */ + private function findContactIdsByAbschluss(string $abschluss_id): array + { + $query = "SELECT `mvv_contacts_ranges`.`contact_id` + FROM `mvv_contacts_ranges` + JOIN `mvv_stgteilabschnitt_modul` + ON ( + `mvv_stgteilabschnitt_modul`.`modul_id` = `mvv_contacts_ranges`.`range_id` + AND `mvv_contacts_ranges`.`range_type` = 'Modul' + ) + JOIN `mvv_stgteilabschnitt` USING (`abschnitt_id`) + JOIN `mvv_stgteilversion` USING (`version_id`) + JOIN `mvv_stg_stgteil` USING (`stgteil_id`) + JOIN `mvv_studiengang` USING (`studiengang_id`) + WHERE `mvv_studiengang`.`abschluss_id` = :abschluss_id + + UNION + + SELECT `mvv_contacts_ranges`.`contact_id` + FROM `mvv_contacts_ranges` + JOIN `mvv_studiengang` + ON ( + `mvv_studiengang`.`studiengang_id` = `mvv_contacts_ranges`.`range_id` + AND `mvv_contacts_ranges`.`range_type` = 'Studiengang' + ) + WHERE `mvv_studiengang`.`abschluss_id` = :abschluss_id + + UNION + + SELECT `mvv_contacts_ranges`.`contact_id` + FROM `mvv_contacts_ranges` + JOIN `mvv_stgteil` + ON ( + `mvv_contacts_ranges`.`range_id` = `mvv_stgteil`.`stgteil_id` + AND `mvv_contacts_ranges`.`range_type` = 'StudiengangTeil' + ) + JOIN `mvv_stg_stgteil` USING (`stgteil_id`) + JOIN `mvv_studiengang` USING (`studiengang_id`) + WHERE `mvv_studiengang`.`abschluss_id` = :abschluss_id"; + + return DBManager::get()->fetchFirst($query, [':abschluss_id' => $abschluss_id]); + } } diff --git a/app/controllers/studiengaenge/studiengaenge.php b/app/controllers/studiengaenge/studiengaenge.php index e0dec62f3a6a37e845521907421dfae5094d4ca5..d053f48291598d342422e4e20e3f4cc39dadb294 100644 --- a/app/controllers/studiengaenge/studiengaenge.php +++ b/app/controllers/studiengaenge/studiengaenge.php @@ -975,8 +975,9 @@ class Studiengaenge_StudiengaengeController extends MVVController if (mb_strlen(Request::get('kategorie_filter'))) { $this->filter['mvv_abschl_zuord.kategorie_id'] = Request::option('kategorie_filter'); } - if (mb_strlen(Request::get('kategorie_filter'))) { - $this->filter['mvv_abschl_zuord.kategorie_id'] = Request::option('kategorie_filter'); + // Fach + if (mb_strlen(Request::get('fach_filter'))) { + $this->filter['mvv_stgteil.fach_id'] = Request::option('fach_filter'); } // Verantwortliche Einrichtung if (mb_strlen(Request::get('institut_filter'))) { @@ -1057,6 +1058,7 @@ class Studiengaenge_StudiengaengeController extends MVVController $semesters = $semesters->orderBy('beginn desc'); $selected_semester = $semesters->findOneBy('beginn', $this->filter['start_sem.beginn']); + $count_faecher = $this->countFaecher($studiengang_ids, $this->filter['mvv_stgteil.fach_id'] ?? ''); $filter_template = $template_factory->render('shared/filter', [ 'semester' => $semesters, 'selected_semester' => $selected_semester ? $selected_semester->id : '', @@ -1074,6 +1076,11 @@ class Studiengaenge_StudiengaengeController extends MVVController 'selected_institut' => $this->filter['mvv_studiengang.institut_id'], 'fachbereiche' => Fach::getAllAssignedInstitutes($studiengang_ids), 'selected_fachbereich' => $this->filter['mvv_fach_inst.institut_id'] ?? '', + 'faecher' => SimpleORMapCollection::createFromArray( + Fach::findMany(array_keys($count_faecher)) + )->orderBy('name'), + 'selected_fach' => $this->filter['mvv_stgteil.fach_id'] ?? '', + 'count_faecher' => $count_faecher, 'action' => $this->action_url('set_filter'), 'action_reset' => $this->action_url('reset_filter') ]); @@ -1130,6 +1137,35 @@ class Studiengaenge_StudiengaengeController extends MVVController } + /** + * Returns the number of study courses grouped by subjects for given study cours ids. + * + * @param array $studiengang_ids The ids of the study courses. + * @param string $fach_id The id of the selected subject. + * @return array Number of study courses grouped by subjects. + */ + private function countFaecher(array $studiengang_ids, string $fach_id): array + { + if ($fach_id === '') { + $params = [':studiengang_ids' => $studiengang_ids]; + $where = "`mvv_stg_stgteil`.`studiengang_id` IN (:studiengang_ids)"; + } else { + $params = [ + ':fach_id' => $fach_id, + ':studiengang_ids' => $studiengang_ids + ]; + $where = "`fach`.`fach_id` = :fach_id + AND `mvv_stg_stgteil`.`studiengang_id` IN (:studiengang_ids)"; + } + $query = "SELECT `fach`.`fach_id`, COUNT(DISTINCT `studiengang_id`) AS `count_faecher` + FROM `fach` + JOIN `mvv_stgteil` USING(`fach_id`) + JOIN `mvv_stg_stgteil` USING(`stgteil_id`) + WHERE {$where} + GROUP BY `fach_id`"; + return DBManager::get()->fetchPairs($query, $params); + } + public function approve_action($studiengang_id) { $this->studiengang_id = $studiengang_id; diff --git a/app/views/shared/filter.php b/app/views/shared/filter.php index 6674ef3de3781edcb82b3335901d0be52cf6882f..2b1e0274f0fb290433a07668d6dc43008193ac92 100644 --- a/app/views/shared/filter.php +++ b/app/views/shared/filter.php @@ -1,4 +1,16 @@ -<? if (!empty($selected_status) || !empty($selected_kategorie) || !empty($selected_abschluss) || !empty($selected_fachbereich) || !empty($selected_zuordnung) || !empty($selected_institut) || !empty($selected_name) || (!empty($selected_semester) && !empty($default_semester) && $selected_semester != $default_semester)) : ?> +<? if (!empty($selected_status) + || !empty($selected_fach) + || !empty($selected_kategorie) + || !empty($selected_abschluss) + || !empty($selected_fachbereich) + || !empty($selected_zuordnung) + || !empty($selected_institut) + || !empty($selected_name) + || ( + !empty($selected_semester) + && !empty($default_semester) + && $selected_semester !== $default_semester) + ) : ?> <div style="width: 100%; text-align: right;"> <a href="<?= $action_reset ?>"> <?= Icon::create('refresh', 'clickable', ['title' => _('Filter zurücksetzen')])->asImg(); ?> @@ -9,14 +21,14 @@ <form id="index_filter" action="<?= $action ?>" method="post"> <? if (!empty($name_search)) : ?> <label class="mvv-name-search"> - <?= $name_caption ?: _('Name') ?>: + <?= $name_caption ?: _('Name') ?> <input type="text" name="name_filter" value="<?= htmlReady($selected_name) ?>"> <input type="submit" value="<?= _('Suchen') ?>"> </label> <? endif ?> <? if (!empty($semester)) : ?> <label> - <?= $semester_caption ?? _('Semester') . ':' ?><br> + <?= $semester_caption ?? _('Semester') ?><br> <select name="semester_filter" class="sidebar-selectlist submit-upon-select"> <option value="all"<?= (!$selected_semester ? ' selected' : '') ?>><?= _('Alle Semester') ?></option> <? foreach ($semester as $sem) : ?> @@ -27,7 +39,7 @@ <? endif; ?> <? if (!empty($zuordnungen)) : ?> <label> - <?= _('Zugeordnet zu Objekten') ?>: + <?= _('Zugeordnet zu Objekten') ?> <select name="zuordnung_filter" class="sidebar-selectlist submit-upon-select"> <option value=""><?= _('Alle') ?></option> <? foreach ($zuordnungen as $object_type => $zuordnung) : ?> @@ -39,7 +51,7 @@ <? endif; ?> <? if (!empty($status)) : ?> <label> - <?= _('Status') ?>:<br> + <?= _('Status') ?><br> <select name="status_filter" class="sidebar-selectlist submit-upon-select"> <option value=""><?= _('Alle') ?></option> <? foreach ($status_array as $key => $stat) : ?> @@ -54,14 +66,35 @@ </select> </label> <? endif; ?> + <? if (!empty($faecher)) : ?> + <label> + <?= _('Fach') ?><br> + <select name="fach_filter" class="sidebar-selectlist submit-upon-select nested-select"> + <option value=""><?= _('Alle') ?></option> + <? foreach ($faecher as $fach) : ?> + <option value="<?= htmlReady($fach->id) ?>" + <?= $fach->id === $selected_fach ? 'selected' : '' ?> + > + <?= htmlReady($fach->name) . ' (' . $count_faecher[$fach->id] . ')' ?> + </option> + <? endforeach; ?> + </select> + </label> + <? endif; ?> <? if (!empty($kategorien)) : ?> <label> - <?= _('Kategorie') ?>:<br> + <?= _('Kategorie') ?><br> <select name="kategorie_filter" class="sidebar-selectlist submit-upon-select"> <option value=""><?= _('Alle') ?></option> <? foreach ($kategorien as $kategorie) : ?> <option value="<?= $kategorie->id ?>" - <? if ($kategorie->id === $selected_kategorie || (isset($abschluesse) && isset($abschluesse[$selected_abschluss]) && $abschluesse[$selected_abschluss]->kategorie_id == $kategorie->id)) : ?> selected<? endif; ?>> + <? if ( + $kategorie->id === $selected_kategorie + || ( + isset($abschluesse, $abschluesse[$selected_abschluss]) + && $abschluesse[$selected_abschluss]->kategorie_id == $kategorie->id + ) + ) echo 'selected'; ?>> <?= htmlReady($kategorie->name) . ' (' . $kategorie->count_objects . ')' ?> </option> <? endforeach; ?> @@ -70,11 +103,15 @@ <? endif; ?> <? if (!empty($abschluesse)) : ?> <label> - <?= _('Abschluss') ?>:<br> + <?= _('Abschluss') ?><br> <select name="abschluss_filter" class="sidebar-selectlist submit-upon-select"> <option value=""><?= _('Alle') ?></option> <? foreach ($abschluesse as $abschluss) : ?> - <option value="<?= $abschluss->getId() ?>"<?= ($abschluss->getId() == $selected_abschluss ? ' selected' : '') ?>><?= htmlReady($abschluss->name) . ' (' . $abschluss->count_objects . ')' ?></option> + <option value="<?= htmlReady($abschluss->id) ?>" + <?= $abschluss->getId() == $selected_abschluss ? ' selected' : '' ?> + > + <?= htmlReady($abschluss->name) . ' (' . ($abschluss->count_objects ?? $count_abschluesse[$abschluss->id]) . ')' ?> + </option> <? endforeach; ?> </select> </label> @@ -83,7 +120,7 @@ <? $perm_institutes = MvvPerm::getOwnInstitutes() ?> <? if ($perm_institutes !== false) : ?> <label> - <?= _('Verantw. Einrichtung') ?>:<br> + <?= _('Verantwortliche Einrichtung') ?><br> <select name="institut_filter" class="sidebar-selectlist nested-select submit-upon-select"> <option value=""><?= _('Alle') ?></option> <? foreach ($institute as $institut) : ?> @@ -108,7 +145,7 @@ <? $perm_institutes = MvvPerm::getOwnInstitutes() ?> <? if ($perm_institutes !== false) : ?> <label> - <?= _('Fachbereiche') ?>:<br> + <?= _('Fachbereiche') ?><br> <select name="fachbereich_filter" class="sidebar-selectlist nested-select institute-list submit-upon-select"> <option value=""><?= _('Alle') ?></option> <? foreach ($fachbereiche as $fachbereich) : ?> diff --git a/lib/models/MvvFile.php b/lib/models/MvvFile.php index 50cd9b21a9871f414f12de95a0401f0d06c699e2..67b8b5fbc25a2db8b78191c8f078906fd44c142a 100644 --- a/lib/models/MvvFile.php +++ b/lib/models/MvvFile.php @@ -465,18 +465,13 @@ class MvvFile extends ModuleManagementModel * @staticvar array $ids The range_ids of assigned files after filtration. * @param array $filter An array with keys (table_name.column_name) and * values (skalar or array) used in where clause. - * @param boolean $refresh Refresh ids if true. + * @param boolean $file_ids Return the file ids instead of the range ids. * @return array An array with range_ids of assigned files. */ - public static function getIdsFiltered($filter, $refresh = false) + public static function getIdsFiltered($filter, $file_ids = false) { - static $ids = null; - - if (is_array($ids) && !$refresh) { - return $ids; - } - - $sql = "SELECT DISTINCT `mvv_files_ranges`.`range_id` + $id_type = $file_ids ? 'mvvfile_id' : 'range_id'; + $sql = "SELECT DISTINCT `mvv_files_ranges`.`{$id_type}` FROM `mvv_files` LEFT JOIN `mvv_files_ranges` USING (`mvvfile_id`) LEFT JOIN `mvv_abschl_zuord` ON (`mvv_abschl_zuord`.`kategorie_id` = `mvv_files_ranges`.`range_id`)