diff --git a/app/controllers/admin/ilias_interface.php b/app/controllers/admin/ilias_interface.php index 9399a63f554cbe7f455568eefbc9111330e26cb5..543324ec9ca1c6465055043ed96843365fbdcdaa 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 84060acf9b50f87a2c6b623c9456fab0046ca563..2501382be4876704f0fd0eceb1b3c86061fb623b 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) { @@ -71,6 +71,111 @@ class MyIliasAccountsController extends AuthenticatedController $this->sidebar->addWidget($widget); } + /** + * 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 @@ -89,6 +194,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 0e273bcf71a3807f80698c10f19bf5fecf5bb9f9..5936d5e7c958e0203a0232f9ccb2b124ecb91243 100644 --- a/app/views/admin/ilias_interface/edit_interface_settings.php +++ b/app/views/admin/ilias_interface/edit_interface_settings.php @@ -31,9 +31,13 @@ <input type="checkbox" name="ilias_interface_allow_add_own_course" value="1" <?= !empty($ilias_interface_config['allow_add_own_course']) ? 'checked' : '' ?>> <span><?= _('Lehrende können einen eigenen ILIAS-Kurs verknüpfen, der noch nicht mit Stud.IP verbunden ist') ?></span> </label> + <label> + <input type="checkbox" name="ilias_interface_show_course_paths" value="1" <?= !empty($ilias_interface_config['show_course_paths']) ? 'checked' : '' ?>> + <span><?= _('Die Kursübersicht auf dem Arbeitsplatz zeigt die Magazinpfade der Kurse in ILIAS und erlaubt das Filtern nach Semesternamen') ?></span> + </label> <label> <input type="checkbox" name="ilias_interface_show_tools_page" value="1" <?= !empty($ilias_interface_config['show_tools_page']) ? 'checked' : '' ?>> - <span><?= _('Account-Seite im Tools-Bereich ist für alle Nutzenden (auch für Studierende ohne Berechtigung zum Anlegen von Lernobjekten) sichtbar') ?></span> + <span><?= _('Die Accountübersicht auf dem Arbeitsplatz ist für alle Nutzenden (auch für Studierende ohne Berechtigung zum Anlegen von Lernobjekten) sichtbar') ?></span> </label> <label> <input type="checkbox" name="ilias_interface_search_active" value="1" <?= !empty($ilias_interface_config['search_active']) ? 'checked' : '' ?>> diff --git a/app/views/my_ilias_accounts/my_courses.php b/app/views/my_ilias_accounts/my_courses.php new file mode 100644 index 0000000000000000000000000000000000000000..8b4eb805377e07e35cedc84e49411b809b924e82 --- /dev/null +++ b/app/views/my_ilias_accounts/my_courses.php @@ -0,0 +1,62 @@ +<form method="post"> +<? foreach ($ilias_list as $ilias_index => $ilias) : ?> + <table class="default"> + <caption> + <?= sprintf(_('Meine Kurse in %s'), htmlReady($ilias->getName())) ?> + </caption> + <colgroup> + <col style="width: 2%"> + <col> + <col style="width: 15%"> + <col style="width: 15%"> + <? if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) : ?> + <col style="width: 30%"> + <? endif ?> + </colgroup> + <thead> + <th></th> + <th><?= _('Name') ?></th> + <th><?= _('Stud.IP-Veranstaltung') ?></th> + <th><?= _('Status') ?></th> + <? if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) : ?> + <th><?= _('Pfad') ?></th> + <? endif ?> + </thead> + <? if (array_key_exists($ilias_index, $courses_list) && count($courses_list[$ilias_index]) > 0) : ?> + <? foreach ($courses_list[$ilias_index] as $crs_id => $course) : ?> + <tr> + <td><?= Icon::create('learnmodule', Icon::ROLE_INFO)->asImg(['title' => _('ILIAS-Kurs')]) ?></td> + <td> + <? if ($course['online'] || in_array($course['status'], [2, 4])) : ?> + <a href="<?= URLHelper::getLink("dispatch.php/my_ilias_accounts/view_course/{$ilias_index}/{$crs_id}")?>" data-dialog=""><?= htmlReady($course['title']) ?></a> + <? else : ?> + <?= htmlReady($course['title']) ?> + <? endif ?> + <?= !$course['online'] ? '(' . _('offline') . ')' : '' ?> + </td> + <td> + <? if ($course['studip_object']) : ?> + <a href="<?= URLHelper::getLink('dispatch.php/course/basicdata/view', ['cid' => $course['studip_object']]) ?>"> + <?= Icon::create('seminar')->asImg(['title' => Course::find($course['studip_object'])->Name]) ?> + </a> + <? endif ?> + </td> + <td><?= htmlReady($course['status_text'] ?: _('unbekannt')) ?></td> + <? if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) : ?> + <td><?= htmlReady($course['path']) ?></td> + <? endif ?> + </tr> + <? endforeach ?> + <? else : ?> + <tr> + <td colspan="5"> + <?= sprintf( + $selected_semester ? _('Keine Kurse im System %s zum gewählten Filter gefunden.') : _('Sie nehmen im System %s an keinen Kurs teil.'), + htmlReady($ilias->getName()) + )?> + </td> + </tr> + <? endif ?> + </table> +<? endforeach ?> +</form> \ No newline at end of file diff --git a/app/views/my_ilias_accounts/view_course.php b/app/views/my_ilias_accounts/view_course.php new file mode 100644 index 0000000000000000000000000000000000000000..168589728fde4c87624add818ae21bd9c16b049f --- /dev/null +++ b/app/views/my_ilias_accounts/view_course.php @@ -0,0 +1,11 @@ +<form class="default" action="<?= $controller->link_for($module->getRoute('view_tools')) ?>" method="post" target="_blank"> + <?= CSRFProtection::tokenTag() ?> + <?= $this->render_partial('my_ilias_accounts/_ilias_module.php') ?> + <footer data-dialog-button> + <? if ($ilias->isActive()) : ?> + <?= $module->isAllowed('start') ? Studip\LinkButton::create(_('Zum Kurs in ILIAS'), $controller->url_for($module->getRoute('start')), ['target' => '_blank', 'rel' => 'noopener noreferrer']) :'' ?> + <?= $module->isAllowed('edit') ? Studip\LinkButton::create(_('Kurs bearbeiten'), $controller->url_for($module->getRoute('edit')), ['target' => '_blank', 'rel' => 'noopener noreferrer']) :'' ?> + <? endif ?> + <?= Studip\Button::createCancel(_('Schließen'), 'cancel', ['data-dialog' => 'close']) ?> + </footer> +</form> \ No newline at end of file diff --git a/lib/ilias_interface/ConnectedIlias.php b/lib/ilias_interface/ConnectedIlias.php index 0dc172375b25275898adb73b1b438391b9e94e08..a917e1a797ee63b3e26c69624aab4e581a7976d3 100644 --- a/lib/ilias_interface/ConnectedIlias.php +++ b/lib/ilias_interface/ConnectedIlias.php @@ -606,6 +606,27 @@ class ConnectedIlias return $this->soap_client->getUserFullname($user_id); } + /** + * get connected studip courses list for given user + * + * @param string $user_id Stud.IP user id + * @return array course id array + */ + public function getConnectedCoursesForUser(string $user_id): array + { + $query = 'SELECT module_id, object_id + FROM object_contentmodules + JOIN seminar_user ON object_contentmodules.object_id = seminar_user.Seminar_id + WHERE seminar_user.user_id = ? + AND system_type = ? + AND module_type = ?'; + return DBManager::get()->fetchPairs($query, [ + $user_id, + $this->index, + 'crs' + ]); + } + /** * get ILIAS path * diff --git a/lib/ilias_interface/IliasSoap.php b/lib/ilias_interface/IliasSoap.php index 585595b3d88fb6f1fdd47a0b4600d5921310a47f..916819550205d6ee896226792dde788cdf65b4fa 100644 --- a/lib/ilias_interface/IliasSoap.php +++ b/lib/ilias_interface/IliasSoap.php @@ -28,7 +28,7 @@ class IliasSoap extends StudipSoapClient private $user_sid; private $user_type; private $soap_cache; - private $separator_string; + public $separator_string; private $caching_active = false; @@ -1170,8 +1170,7 @@ class IliasSoap extends StudipSoapClient * * returns repository-path to ilias-object * @access public - * @param string source_id reference-id - * @param string target_id reference-id + * @param string ref_id reference id * @return string result */ function getPath($ref_id) @@ -1202,8 +1201,7 @@ class IliasSoap extends StudipSoapClient * returns repository-path to ilias-object * * @access public - * @param string source_id reference-id - * @param string target_id reference-id + * @param string ref_id reference id * @return string result */ function getRawPath($ref_id) @@ -1679,6 +1677,72 @@ class IliasSoap extends StudipSoapClient } } + /** + * get courses for given user by status + * + * gets course array for given course data + * @access public + * @param string $user_id ilias user id + * @param string $status MEMBER = 1, TUTOR = 2, ADMIN = 4, OWNER = 8 + * @return array course array + */ + public function getCoursesForUserStatus(string $user_id, string $status): array + { + $courses = []; + $xmlrs = '<?xml version="1.0" encoding="utf-8"?> + <result> + <colspecs> + <colspec idx="0" name="user_id"/> + <colspec idx="1" name="status"/> + </colspecs> + <rows> + <row> + <column>'.$user_id.'</column> + <column>'.$status.'</column> + </row> + </rows> + </result>'; + $param = [ + 'sid' => $this->getSID(), + 'parameters' => $xmlrs + ]; + $result = $this->call('getCoursesForUser', $param); + + if ($result) { + $s = simplexml_load_string($result); + foreach ($s->rows->row as $row) { + $ref_id = (string)$row->column[0]; + $courses[$ref_id] = []; + $courses[$ref_id]['title'] = (string)$row->column[2]; + $s2 = simplexml_load_string((string)$row->column[1]); + $courses[$ref_id]['title'] = trim((string)$s2->MetaData->General->Title); + $courses[$ref_id]['description'] = trim((string)$s2->MetaData->General->Description); + $courses[$ref_id]['status_text'] = ''; + $courses[$ref_id]['status'] = $status; + switch ($status) { + case 1: + $courses[$ref_id]['status_text'] = _('Kursmitglied'); + break; + case 2: + $courses[$ref_id]['status_text'] = _('Kurstutor/-in'); + break; + case 4: + $courses[$ref_id]['status_text'] = _('Kursadministrator/-in'); + break; + } + if (isset($s2->Settings->Availability->Unlimited)) { + $courses[$ref_id]['online'] = 1; + } elseif (isset($s2->Settings->Availability->NotAvailable)) { + $courses[$ref_id]['online'] = 0; + } else { + $courses[$ref_id]['online'] = 1; + } + $courses[$ref_id]['availability'] = $s2->Settings->Availability; + } + } + return $courses; + } + /** * check reference by title * diff --git a/lib/ilias_interface/studip_referrer_7x.php b/lib/ilias_interface/studip_referrer_7x.php index e3675692cbf8c65be022b11006785ccad021ac40..fd62820f2d95c2463e1891552549febefec55a7b 100644 --- a/lib/ilias_interface/studip_referrer_7x.php +++ b/lib/ilias_interface/studip_referrer_7x.php @@ -107,6 +107,10 @@ if(file_exists("./ilias.ini.php")){ case 'exc': $base_url = "ilias.php?baseClass=ilExerciseHandlerGUI"; break; + case 'cat': + case 'crs': + $base_url= "ilias.php?baseClass=ilrepositorygui&cmd=edit"; + break; case 'webr': $base_url = "ilias.php?baseClass=ilLinkResourceHandlerGUI"; break; diff --git a/lib/ilias_interface/studip_referrer_8x.php b/lib/ilias_interface/studip_referrer_8x.php index f7552afb46fabcd358d99f98da70c45d85e1c7ba..fc9f66dc1710d069437d1a24e6f769ce4e02f87f 100644 --- a/lib/ilias_interface/studip_referrer_8x.php +++ b/lib/ilias_interface/studip_referrer_8x.php @@ -107,6 +107,10 @@ if(file_exists("./ilias.ini.php")){ case 'exc': $base_url = "ilias.php?baseClass=ilExerciseHandlerGUI"; break; + case 'cat': + case 'crs': + $base_url= "ilias.php?baseClass=ilrepositorygui&cmd=edit"; + break; case 'webr': $base_url = "ilias.php?baseClass=ilLinkResourceHandlerGUI"; break; diff --git a/lib/modules/IliasInterfaceModule.php b/lib/modules/IliasInterfaceModule.php index 2ab82ad1bb1614284f249d4cdbf7ed2a6a176c45..54a49169b9cc761871cb7718a6aeb490f29e7848 100644 --- a/lib/modules/IliasInterfaceModule.php +++ b/lib/modules/IliasInterfaceModule.php @@ -19,10 +19,20 @@ class IliasInterfaceModule extends CorePlugin implements StudipModule, SystemPlu Navigation::addItem('/admin/config/ilias_interface', new Navigation(_('ILIAS-Schnittstelle'), 'dispatch.php/admin/ilias_interface')); } - if (Seminar_Perm::get()->have_perm('tutor') || (Seminar_Perm::get()->have_perm('autor') && array_key_exists('show_tools_page', $ilias_interface_config) && $ilias_interface_config['show_tools_page'])) { - $ilias = new Navigation(_('ILIAS'), 'dispatch.php/my_ilias_accounts'); + if (Seminar_Perm::get()->have_perm('tutor') || Seminar_Perm::get()->have_perm('autor')) { + $ilias = new Navigation(_('ILIAS'), 'dispatch.php/my_ilias_accounts/my_courses'); $ilias->setImage(Icon::create('ilias')); $ilias->setDescription(_('Schnittstelle zu ILIAS')); + $ilias->addSubNavigation( + 'my_courses', + new Navigation(_('Meine Kurse'), 'dispatch.php/my_ilias_accounts/my_courses') + ); + if (!empty($ilias_interface_config['show_tools_page'])) { + $ilias->addSubNavigation( + 'my_accounts', + new Navigation(_('Meine Lernobjekte und Accounts'), 'dispatch.php/my_ilias_accounts') + ); + } Navigation::addItem('/contents/my_ilias_accounts', $ilias); } }