From 78da395bb3ab4ab149994b48111b2d8ffad4f20a Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms <tleilax+studip@gmail.com> Date: Fri, 11 Nov 2022 15:22:18 +0000 Subject: [PATCH] valid semester from config, fixes #1774 Closes #1774 Merge request studip/studip!1151 --- app/controllers/my_courses.php | 53 +++++++++++++++++++++++++++++----- lib/classes/MyRealmModel.php | 11 ++++--- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/app/controllers/my_courses.php b/app/controllers/my_courses.php index 7f98f1ba797..94ac6259e19 100644 --- a/app/controllers/my_courses.php +++ b/app/controllers/my_courses.php @@ -803,12 +803,8 @@ class MyCoursesController extends AuthenticatedController $widget = new SelectWidget(_('Semesterfilter'), $this->url_for('my_courses/set_semester'), 'sem_select'); $widget->setMaxLength(50); - $widget->addElement(new SelectElement('current', _('Aktuelles Semester'), $sem === 'current')); - $widget->addElement(new SelectElement('future', _('Aktuelles und nächstes Semester'), $sem === 'future')); - $widget->addElement(new SelectElement('last', _('Aktuelles und letztes Semester'), $sem === 'last')); - $widget->addElement(new SelectElement('lastandnext', _('Letztes, aktuelles, nächstes Semester'), $sem === 'lastandnext')); - if (Config::get()->MY_COURSES_ENABLE_ALL_SEMESTERS) { - $widget->addElement(new SelectElement('all', _('Alle Semester'), $sem === 'all')); + foreach ($this->getTextualSemesterEntries() as $key => $label) { + $widget->addElement(new SelectElement($key, $label, $sem === $key)); } $query = "SELECT semester_data.semester_id @@ -846,7 +842,7 @@ class MyCoursesController extends AuthenticatedController } // create settings url depended on selected cycle - if (isset($sem) && !in_array($sem, words('future all last current'))) { + if (isset($sem) && !$this->isValidTextualSemesterEntry($sem)) { $this->settings_url = "dispatch.php/my_courses/groups/{$sem}"; } else { $this->settings_url = 'dispatch.php/my_courses/groups'; @@ -1074,12 +1070,21 @@ class MyCoursesController extends AuthenticatedController $config_sem = 'future'; } + if ( + $config_sem + && !$this->isValidTextualSemesterEntry($config_sem) + && !Semester::exists($config_sem) + ) { + $config_sem = null; + } + $sem = Request::get( 'sem_select', $config_sem ?: Config::get()->MY_COURSES_DEFAULT_CYCLE ); - if ($sem && !in_array($sem, ['future', 'all', 'last', 'current'])) { + + if ($sem && !$this->isValidTextualSemesterEntry($sem)) { Request::set('sem_select', $sem); } @@ -1108,4 +1113,36 @@ class MyCoursesController extends AuthenticatedController return $group_field === 'not_grouped' ? 'sem_number' : $group_field; } + + /** + * Returns all valid textual semester entries like 'last', 'future' etc + * + * @return array<string, string> + */ + private function getTextualSemesterEntries(): array + { + $entries = [ + 'current' => _('Aktuelles Semester'), + 'future' => _('Aktuelles und nächstes Semester'), + 'last' => _('Aktuelles und letztes Semester'), + 'lastandnext' => _('Letztes, aktuelles, nächstes Semester'), + ]; + + if (Config::get()->MY_COURSES_ENABLE_ALL_SEMESTERS) { + $entries['all'] = _('Alle Semester'); + } + + return $entries; + } + + /** + * Returns whether the given entry is a valid textual semester entry. + * + * @see getTextualSemesterEntries() + * @return bool + */ + private function isValidTextualSemesterEntry(string $entry): bool + { + return array_key_exists($entry, $this->getTextualSemesterEntries()); + } } diff --git a/lib/classes/MyRealmModel.php b/lib/classes/MyRealmModel.php index 9f62b427cb2..9d225821aa8 100644 --- a/lib/classes/MyRealmModel.php +++ b/lib/classes/MyRealmModel.php @@ -169,12 +169,15 @@ class MyRealmModel $sem_data = Semester::getAllAsArray(); - $semester_ids = []; - for ($i = $min_sem_key; $i <= $max_sem_key; $i++) { - if (!empty($sem_data[$i]['semester_id'])) { - $semester_ids[] = $sem_data[$i]['semester_id']; + $semester_ids = []; + if (is_numeric($min_sem_key) && is_numeric($max_sem_key)) { + foreach ($sem_data as $index => $data) { + if ($index >= $min_sem_key && $index <= $max_sem_key) { + $semester_ids[] = $data['semester_id']; + } } } + $semesters = Semester::findMany($semester_ids); $studygroup_filter = !$params['studygroups_enabled'] ? false : true; $ordering = ''; -- GitLab