From 02990f73bd61f7dbccd9ca9971d1aee72130d8e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20Schr=C3=B6der=2C=20M=2E=20A=2E?= Date: Fri, 20 Dec 2024 10:55:36 +0000 Subject: Resolve "Anzeige von ILIAS-Kursen auf "Mein Arbeitsplatz"" Closes #4264 Merge request studip/studip!3367 --- app/controllers/admin/ilias_interface.php | 13 ++- app/controllers/my_ilias_accounts.php | 127 ++++++++++++++++++++- .../ilias_interface/edit_interface_settings.php | 6 +- app/views/my_ilias_accounts/my_courses.php | 62 ++++++++++ app/views/my_ilias_accounts/view_course.php | 11 ++ lib/ilias_interface/ConnectedIlias.php | 21 ++++ lib/ilias_interface/IliasSoap.php | 74 +++++++++++- lib/ilias_interface/studip_referrer_7x.php | 4 + lib/ilias_interface/studip_referrer_8x.php | 4 + lib/modules/IliasInterfaceModule.php | 14 ++- 10 files changed, 320 insertions(+), 16 deletions(-) create mode 100644 app/views/my_ilias_accounts/my_courses.php create mode 100644 app/views/my_ilias_accounts/view_course.php diff --git a/app/controllers/admin/ilias_interface.php b/app/controllers/admin/ilias_interface.php index 9399a63..543324e 100644 --- a/app/controllers/admin/ilias_interface.php +++ b/app/controllers/admin/ilias_interface.php @@ -95,12 +95,13 @@ class Admin_IliasInterfaceController extends AuthenticatedController public function save_interface_settings_action() { if (Request::submitted('submit')) { - $this->ilias_interface_config['edit_moduletitle'] = (boolean)Request::get('ilias_interface_edit_moduletitle'); - $this->ilias_interface_config['show_offline'] = (boolean)Request::get('ilias_interface_show_offline'); - $this->ilias_interface_config['search_active'] = (boolean)Request::get('ilias_interface_search_active'); - $this->ilias_interface_config['show_tools_page'] = (boolean)Request::get('ilias_interface_show_tools_page'); - $this->ilias_interface_config['add_statusgroups'] = (boolean)Request::get('ilias_interface_add_statusgroups'); - $this->ilias_interface_config['cache'] = (boolean)Request::get('ilias_interface_cache'); + $this->ilias_interface_config['edit_moduletitle'] = Request::bool('ilias_interface_edit_moduletitle', false); + $this->ilias_interface_config['show_offline'] = Request::bool('ilias_interface_show_offline', false); + $this->ilias_interface_config['search_active'] = Request::bool('ilias_interface_search_active', false); + $this->ilias_interface_config['show_course_paths'] = Request::bool('ilias_interface_show_course_paths', false); + $this->ilias_interface_config['show_tools_page'] = Request::bool('ilias_interface_show_tools_page', false); + $this->ilias_interface_config['add_statusgroups'] = Request::bool('ilias_interface_add_statusgroups', false); + $this->ilias_interface_config['cache'] = Request::bool('ilias_interface_cache', false); $this->ilias_interface_config['allow_change_course'] = Request::get('ilias_interface_allow_change_course'); $this->ilias_interface_config['allow_add_own_course'] = Request::get('ilias_interface_allow_add_own_course'); diff --git a/app/controllers/my_ilias_accounts.php b/app/controllers/my_ilias_accounts.php index 84060ac..2501382 100644 --- a/app/controllers/my_ilias_accounts.php +++ b/app/controllers/my_ilias_accounts.php @@ -44,9 +44,9 @@ class MyIliasAccountsController extends AuthenticatedController */ public function index_action() { - Navigation::activateItem('/contents/my_ilias_accounts'); + Navigation::activateItem('/contents/my_ilias_accounts/my_accounts'); - PageLayout::setTitle(_('ILIAS-Schnittstelle')); + PageLayout::setTitle(_('Meine Lernobjekte und Accounts')); $this->ilias_list = []; foreach (Config::get()->ILIAS_INTERFACE_SETTINGS as $ilias_index => $ilias_config) { @@ -72,6 +72,111 @@ class MyIliasAccountsController extends AuthenticatedController } /** + * Shows ilias courses for active user + */ + public function my_courses_action() + { + Navigation::activateItem('/contents/my_ilias_accounts/my_courses'); + + PageLayout::setTitle(_('Meine ILIAS-Kurse')); + + if (Semester::exists(Request::option('sem_select'))) { + $this->selected_semester = Request::option('sem_select'); + } else { + $this->selected_semester = ''; + } + + // set up connected ilias classes + $this->ilias_list = []; + foreach (Config::get()->ILIAS_INTERFACE_SETTINGS as $ilias_index => $ilias_config) { + if ($ilias_config['is_active']) { + $this->ilias_list[$ilias_index] = new ConnectedIlias($ilias_index); + $this->ilias_list[$ilias_index]->checkUser(); + $this->ilias_list[$ilias_index]->soap_client->clearCache(); + } + } + + if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) { + // get semesters and set up filter widget + $semesters = new SimpleCollection(Semester::getAll()); + $semesters = $semesters->orderBy('beginn desc'); + $current_semester = Semester::findCurrent()->id; + + $widget = new SelectWidget(_('Semesterfilter'), $this->url_for('my_ilias_accounts/my_courses'), 'sem_select'); + $widget->setMaxLength(50); + + $sem_entries = [ + $current_semester => _('Aktuelles Semester'), + '' => _('Alle Semester') + ]; + foreach ($sem_entries as $key => $label) { + $widget->addElement(new SelectElement($key, $label, $this->selected_semester === $key)); + } + + foreach ($semesters as $key => $semester_entry) { + $widget->addElement(new SelectElement($key, $semester_entry->name, $this->selected_semester === $key)); + } + $this->sidebar->addWidget($widget); + } + + $widget = new ActionsWidget(); + foreach ($this->ilias_list as $ilias_list_index => $ilias) { + if ($GLOBALS['perm']->have_perm('autor')) { + $widget->addLink( + sprintf(_('Zur %s-Startseite'), $ilias->getName()), + $this->url_for('my_ilias_accounts/redirect/' . $ilias_list_index . '/login'), + Icon::create('link-extern'), + ['target' => '_blank', 'rel' => 'noopener noreferrer'] + ); + + // fetch connected course ids for user + $this->connected_courses_list[$ilias_list_index] = $ilias->getConnectedCoursesForUser($ilias->user->studip_id); + + // fetch ilias courses for user + $member_courses = $ilias->soap_client->getCoursesForUserStatus($ilias->user->id, 1); + $tutor_courses = $ilias->soap_client->getCoursesForUserStatus($ilias->user->id, 2); + $admin_courses = $ilias->soap_client->getCoursesForUserStatus($ilias->user->id, 4); + $this->courses_list[$ilias_list_index] = $member_courses + $tutor_courses + $admin_courses; + + // add paths and studip objects + foreach ($this->courses_list[$ilias_list_index] as $crs_id => $course_data) { + $this->courses_list[$ilias_index][$crs_id]['studip_object'] = ''; + if ( + array_key_exists($ilias_list_index, $this->connected_courses_list) + && array_key_exists($crs_id, $this->connected_courses_list[$ilias_list_index]) + ) { + $this->courses_list[$ilias_index][$crs_id]['studip_object'] = $this->connected_courses_list[$ilias_list_index][$crs_id]; + } + + // filter offline courses for mere members + if ( + !Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_offline'] + && !$course_data['online'] + && !in_array($course_data['status'], [2, 4]) + ) { + unset($this->courses_list[$ilias_list_index][$crs_id]); + } + + // filter by semester + if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) { + $this->courses_list[$ilias_list_index][$crs_id]['path'] = $ilias->soap_client->getPath($crs_id); + if ( + $this->selected_semester + && !str_contains( + $this->courses_list[$ilias_list_index][$crs_id]['path'], + Semester::find($this->selected_semester)->name + ) + ) { + unset($this->courses_list[$ilias_list_index][$crs_id]); + } + } + } + } + } + $this->sidebar->addWidget($widget); + } + + /** * View ILIAS module Details * @param $index Index of ILIAS installation * @param $module_id module ID @@ -90,6 +195,24 @@ class MyIliasAccountsController extends AuthenticatedController } /** + * View ILIAS course details + * @param $index Index of ILIAS installation + * @param $crs_id course ID + */ + public function view_course_action($index, $crs_id) + { + $this->ilias = new ConnectedIlias($index); + if ($this->ilias->isActive()) { + $this->module = $this->ilias->getModule($crs_id); + $this->module->module_type_name = _('ILIAS-Kurs'); + PageLayout::setTitle($this->module->getTitle()); + $this->ilias_index = $index; + } else { + PageLayout::postError(_('Diese ILIAS-Installation ist nicht aktiv.')); + } + } + + /** * Add module to ILIAS installation * @param $index Index of ILIAS installation */ diff --git a/app/views/admin/ilias_interface/edit_interface_settings.php b/app/views/admin/ilias_interface/edit_interface_settings.php index 0e273bc..5936d5e 100644 --- a/app/views/admin/ilias_interface/edit_interface_settings.php +++ b/app/views/admin/ilias_interface/edit_interface_settings.php @@ -32,8 +32,12 @@ +