getPath(' > '); }; } elseif ($group_field === 'sem_status') { $mapper = function ($key): string { $sem_type = $GLOBALS['SEM_TYPE'][$key]; return "{$sem_type['name']} ({$GLOBALS['SEM_CLASS'][$sem_type['class']]['name']})"; }; } elseif ($group_field === 'no_grouped') { $mapper = function (): string { return _('keine Gruppierung'); }; } elseif ($group_field === 'gruppe') { $groupcount = 0; $mapper = function () use (&$groupcount): string { $groupcount += 1; return _('Gruppe') . " {$groupcount}"; }; } elseif ($group_field === 'dozent_id') { $mapper = function ($key): string { return get_fullname($key, 'no_title_short'); }; } elseif ($group_field === 'mvv') { $mapper = function ($key): string { $module = Modul::find($key); return $module ? (string) $module->getDisplayName() : _('Keinem Modul zugeordnet'); }; } $result = []; foreach (array_keys($groups) as $key) { $result[$key] = $mapper($key); } return $result; } /** * * @param string $group_field * @param array $groups */ function sort_groups($group_field, &$groups) { switch ($group_field) { case 'sem_number': krsort($groups, SORT_NUMERIC); break; case 'gruppe': ksort($groups, SORT_NUMERIC); break; case 'sem_tree_id': uksort($groups, function ($a, $b) { $a_obj = StudipStudyArea::getNode($a); $b_obj = StudipStudyArea::getNode($b); return strcmp($a_obj->name, $b_obj->name); }); break; case 'sem_status': uksort($groups, function ($a, $b) { global $SEM_CLASS,$SEM_TYPE; return strnatcasecmp( $SEM_TYPE[$a]['name'] . ' (' . $SEM_CLASS[$SEM_TYPE[$a]['class']]['name'] . ')', $SEM_TYPE[$b]['name'] . ' (' . $SEM_CLASS[$SEM_TYPE[$b]['class']]['name'] . ')' ); }); break; case 'dozent_id': uksort($groups, function ($a,$b) { $replacements = ['ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue']; return strnatcasecmp( str_replace(array_keys($replacements), array_values($replacements), mb_strtolower(get_fullname($a, 'no_title_short'))), str_replace(array_keys($replacements), array_values($replacements), mb_strtolower(get_fullname($b, 'no_title_short'))) ); }); break; case 'mvv': uksort($groups, function ($a, $b): int { $module_a = Modul::find($a); $module_b = Modul::find($b); if (!$module_a) { return 1; } if (!$module_b) { return -1; } return strnatcasecmp($module_a->getDisplayName(), $module_b->getDisplayName()); }); break; } foreach ($groups as $key => &$value) { usort($value, function ($a, $b) { if ($a['gruppe'] != $b['gruppe']) { return (int)($a['gruppe'] - $b['gruppe']); } else { if (Config::get()->IMPORTANT_SEMNUMBER) { return strnatcasecmp($a['sem_nr'] ?? '', $b['sem_nr'] ?? ''); } else { return strnatcmp($a['name'], $b['name']); } } }); } return true; } /** * * @param array $groups * @param array $my_obj */ function correct_group_sem_number(&$groups, &$my_obj): bool { if (!is_array($groups) || !is_array($my_obj)) { return false; } $current_semester = Semester::findCurrent(); $my_sem = array_filter( $my_obj, fn($values) => $values['obj_type'] === 'sem' ); Course::findEachMany( function (Course $course) use (&$groups, &$my_obj, $current_semester) { if (count($course->semesters) === 1) { return; } $obj_data = $my_obj[$course->id]; if ( $course->isOpenEnded() && $course->start_semester->beginn < $current_semester->beginn ) { unset($groups[$obj_data['sem_number']][$course->id]); fill_groups($groups, Semester::getIndexById($current_semester->id), [ 'seminar_id' => $course->id, 'name' => $obj_data['name'], 'gruppe' => $obj_data['gruppe'], ]); if (count($groups[$obj_data['sem_number']]) === 0) { unset($groups[$obj_data['sem_number']]); } } else { $to_sem = $obj_data['sem_number_end']; for ($i = $obj_data['sem_number']; $i <= $to_sem; ++$i){ fill_groups($groups, $i, [ 'seminar_id' => $course->id, 'name' => $obj_data['name'], 'gruppe' => $obj_data['gruppe'] ]); } } if (User::findCurrent()->getConfiguration()->getValue('SHOWSEM_ENABLE')) { $my_obj[$course->id]['name'] .= ' (' . $course->getTextualSemester() . ')'; } }, array_keys($my_sem) ); return true; } /** * * @param mixed $my_obj */ function add_sem_name(&$my_obj): bool { if ($GLOBALS['user']->cfg->getValue('SHOWSEM_ENABLE')) { $sem_data = Semester::findAllVisible(); if (is_array($my_obj)) { foreach ($my_obj as $seminar_id => $values){ if ($values['obj_type'] == 'sem' && $values['sem_number'] != $values['sem_number_end']){ $sem_name = " (" . $sem_data[$values['sem_number']]['name'] . " - "; $sem_name .= (($values['sem_number_end'] == -1) ? _("unbegrenzt") : $sem_data[$values['sem_number_end']]['name']) . ")"; $my_obj[$seminar_id]['name'] .= $sem_name; } else { $my_obj[$seminar_id]['name'] .= " (" . $sem_data[$values['sem_number']]['name'] . ") "; } } } } return true; } /** * * @param array $groups * @param string|null $group_key * @param array $group_entry * * @return bool */ function fill_groups(array &$groups, ?string $group_key, array $group_entry): bool { if (is_null($group_key)){ $group_key = 'not_grouped'; } if (!isset($groups[$group_key]) || !is_array($groups[$group_key])) { $groups[$group_key] = []; } $group_entry['name'] = str_replace( ['ä', 'ö', 'ü'], ['ae', 'oe', 'ue'], mb_strtolower($group_entry['name']) ); if (!in_array($group_entry, $groups[$group_key])) { $groups[$group_key][$group_entry['seminar_id']] = $group_entry; return true; } return false; } /** * This function returns all valid fields that may be used for course * grouping in "My Courses". * * @return array All fields that may be specified for course grouping */ function getValidGroupingFields(): array { $valid = [ 'not_grouped', 'sem_number', 'sem_tree_id', 'sem_status', 'gruppe', 'dozent_id', ]; if (LvgruppeSeminar::countBySql('1') > 0) { $valid[] = 'mvv'; } return $valid; }