From b175d594c3de3471dd65c72bdfe509a44072c8c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20Schr=C3=B6der=2C=20M=2E=20A=2E?= Date: Fri, 19 Dec 2025 12:33:49 +0000 Subject: Resolve "ILIAS-Schnittstelle: Anlegen von ILIAS-Arbeitsbereichen aus Stud.IP" Closes #5902 Merge request studip/studip!4569 --- app/controllers/admin/ilias_interface.php | 5 ++ app/controllers/my_ilias_accounts.php | 75 ++++++++++++++++++++++ .../admin/ilias_interface/edit_permissions.php | 21 ++++++ app/views/my_ilias_accounts/add_workgroup.php | 13 ++++ app/views/my_ilias_accounts/my_courses.php | 15 ++++- lib/ilias_interface/ConnectedIlias.php | 45 ++++++++++--- 6 files changed, 164 insertions(+), 10 deletions(-) create mode 100644 app/views/my_ilias_accounts/add_workgroup.php diff --git a/app/controllers/admin/ilias_interface.php b/app/controllers/admin/ilias_interface.php index f4711a3..89a8880 100644 --- a/app/controllers/admin/ilias_interface.php +++ b/app/controllers/admin/ilias_interface.php @@ -157,6 +157,9 @@ class Admin_IliasInterfaceController extends AuthenticatedController 'course_veranstaltungsnummer' => false, 'workgroup_category_name' => '', 'workgroup_category' => '', + 'workgroup_perm' => '', + 'workgroup_role_name' => '', + 'workgroup_role' => '', 'modules' => [], 'author_role_name' => 'Author', @@ -401,6 +404,8 @@ class Admin_IliasInterfaceController extends AuthenticatedController $this->ilias_configs[$index]['author_role_name'] = Request::get('ilias_author_role_name'); $this->ilias_configs[$index]['author_perm'] = Request::get('ilias_author_perm'); $this->ilias_configs[$index]['allow_change_account'] = Request::get('ilias_allow_change_account'); + $this->ilias_configs[$index]['workgroup_role_name'] = Request::get('ilias_workgroup_role_name'); + $this->ilias_configs[$index]['workgroup_perm'] = Request::get('ilias_workgroup_perm'); // remove ilias role assignment if ( diff --git a/app/controllers/my_ilias_accounts.php b/app/controllers/my_ilias_accounts.php index 644ff6f..3b8716b 100644 --- a/app/controllers/my_ilias_accounts.php +++ b/app/controllers/my_ilias_accounts.php @@ -72,11 +72,79 @@ class MyIliasAccountsController extends AuthenticatedController } /** + * Adds workgroup + */ + public function add_workgroup_action($ilias_index) + { + $this->ilias = new ConnectedIlias($ilias_index); + $this->ilias_workgroup_name = sprintf(_('Arbeitsbereich von %s'), User::findCurrent()->getFullName()); + + if ( + empty($this->ilias->ilias_config['workgroup_perm']) + || !$GLOBALS['perm']->have_perm($this->ilias->ilias_config['workgroup_perm']) + ) { + throw new AccessDeniedException(); + } + + if (Request::submitted('add_workgroup')) { + $this->ilias_workgroup_name = trim(Request::get('ilias_workgroup_name')); + if ( + empty($this->ilias_workgroup_name) + || mb_strlen($this->ilias_workgroup_name) < 3 + ) { + PageLayout::postError(_('Der Name des Arbeitsbereichs ist zu kurz.')); + } elseif ( + $this->ilias->isActive() + && !empty($this->ilias->ilias_config['workgroup_category']) + && !empty($this->ilias->ilias_config['workgroup_role']) + ) { + //create workgroup category in ILIAS + $object_data = [ + 'title' => $this->ilias_workgroup_name, + 'description' => '', + 'type' => 'cat', + 'owner' => $this->ilias->soap_client->lookupUser($this->ilias_config['admin']), + ]; + $workgroup_cat = $this->ilias->soap_client->addObject($object_data, $this->ilias->ilias_config['workgroup_category']); + + if (!empty($workgroup_cat)) { + // create local role from template + $role_data = [ + 'title' => "studip_workgroup_ref_" . $workgroup_cat, + 'description' => sprintf(_('Arbeitsbereichsrolle für ref_id %s, angelegt von %s'), $workgroup_cat, User::findCurrent()->getFullName()), + ]; + $role_id = $this->ilias->soap_client->addRoleFromTemplate($role_data, $workgroup_cat, $this->ilias->ilias_config['workgroup_role']); + + if (!empty($role_id)) { + //add current user to new role entry + $this->ilias->soap_client->addUserRoleEntry($this->ilias->user->getId(), $role_id); + + // delete permissions for all global roles (User, Guest, Anonymous) for this category + foreach ($this->ilias->global_roles as $role) { + $this->ilias->soap_client->revokePermissions($role, $workgroup_cat); + } + + PageLayout::postSuccess(sprintf(_('Der Arbeitsbereich mit dem Namen "%s" wurde angelegt.'), $this->ilias_workgroup_name)); + } else { + PageLayout::postError(sprintf(_('Die Mitglieder-Rolle für den Arbeitsbereich "%s" konnte nicht angelegt werden.'), $this->ilias_workgroup_name)); + } + } else { + PageLayout::postError(sprintf(_('Der Arbeitsbereich "%s" konnte nicht angelegt werden.'), $this->ilias_workgroup_name)); + } + } else { + PageLayout::postError(sprintf(_('Die ILIAS-Installation %s ist nicht aktiv.'), $this->ilias->ilias_config['name'])); + } + $this->redirect($this->url_for('my_ilias_accounts/my_courses')); + } + } + + /** * Sends workgroup requests to given user(s) */ public function request_workgroup_member_action($ilias_index, $workgroup_id) { $this->ilias = new ConnectedIlias($ilias_index); + if ($this->ilias->isActive()) { $this->ilias_index = $ilias_index; // Get selected persons. @@ -141,6 +209,7 @@ class MyIliasAccountsController extends AuthenticatedController public function accept_workgroup_request_action($ilias_index, $workgroup_id) { $this->ilias = new ConnectedIlias($ilias_index); + if ($this->ilias->isActive()) { $this->ilias_index = $ilias_index; @@ -283,6 +352,12 @@ class MyIliasAccountsController extends AuthenticatedController } $this->workgroups_list[$ilias_list_index] = $ilias->getUserWorkgroups($GLOBALS['perm']->have_perm('root')); + + $this->add_workgroups_perm[$ilias_list_index] = + !empty($ilias->ilias_config['workgroup_category']) + && !empty($ilias->ilias_config['workgroup_role']) + && !empty($ilias->ilias_config['workgroup_perm']) + && $GLOBALS['perm']->have_perm($ilias->ilias_config['workgroup_perm']); } } } diff --git a/app/views/admin/ilias_interface/edit_permissions.php b/app/views/admin/ilias_interface/edit_permissions.php index b6b6f21..701ebb9 100644 --- a/app/views/admin/ilias_interface/edit_permissions.php +++ b/app/views/admin/ilias_interface/edit_permissions.php @@ -89,4 +89,25 @@ + +
+ + + + + +
+ diff --git a/app/views/my_ilias_accounts/add_workgroup.php b/app/views/my_ilias_accounts/add_workgroup.php new file mode 100644 index 0000000..1c3e4ca --- /dev/null +++ b/app/views/my_ilias_accounts/add_workgroup.php @@ -0,0 +1,13 @@ +
+ + +
+ isActive()) : ?> + + + 'close']) ?> +
+
\ No newline at end of file diff --git a/app/views/my_ilias_accounts/my_courses.php b/app/views/my_ilias_accounts/my_courses.php index c748bdf..33e99af 100644 --- a/app/views/my_ilias_accounts/my_courses.php +++ b/app/views/my_ilias_accounts/my_courses.php @@ -60,7 +60,7 @@ $ilias) : ?> - +

@@ -100,6 +100,19 @@ + + + + + + + + + + +
+ url_for('my_ilias_accounts/add_workgroup/'.$ilias_index), ['data-dialog' => 'size=auto']) ?> +
diff --git a/lib/ilias_interface/ConnectedIlias.php b/lib/ilias_interface/ConnectedIlias.php index 057a70b..b72c8d3 100644 --- a/lib/ilias_interface/ConnectedIlias.php +++ b/lib/ilias_interface/ConnectedIlias.php @@ -147,6 +147,7 @@ class ConnectedIlias $interface_config_options = [ 'show_course_paths' => true, + 'create_objects' => true, ]; foreach ($interface_config_options as $option_key => $option_value) { @@ -188,6 +189,9 @@ class ConnectedIlias 'course_veranstaltungsnummer' => false, 'workgroup_category_name' => '', 'workgroup_category' => '', + 'workgroup_perm' => '', + 'workgroup_role_name' => '', + 'workgroup_role' => '', 'modules' => [], 'author_role_name' => '', @@ -422,27 +426,48 @@ class ConnectedIlias */ public function getPermissionsSettingsStatus() { + $permission_error = false; // check role template if (empty($this->ilias_config['author_role_name'])) { $this->error[] = _("Das Rollen-Template für die persönliche Kategorie wurde noch nicht festgelegt."); + return false; } elseif (is_numeric($this->ilias_config['author_role_name'])) { // if an ID was entered, simply use it; else check for title $this->ilias_config['author_role'] = $this->ilias_config['author_role_name']; $this->storeSettings(); - return true; } else { $role_template = $this->soap_client->getObjectByTitle($this->ilias_config['author_role_name'], 'rolt'); - if ($role_template == false) { - $this->error[] = sprintf(_('Das Rollen-Template mit dem Namen „%1$s“ wurde im System %2$s nicht gefunden.'), htmlReady($this->ilias_config['author_role_name']), htmlReady($this->getName())); - } else if (is_array($role_template)) { + if (!empty($role_template) && is_array($role_template)) { $this->ilias_config['author_role'] = $role_template["obj_id"]; - $this->ilias_config['author_role_name'] = $role_template['title']; + $this->ilias_config['author_role_name'] = $role_template["title"]; $this->storeSettings(); - return true; + } else { + $this->error[] = sprintf(_('Das Rollen-Template mit dem Namen „%1$s“ wurde im System %2$s nicht gefunden.'), htmlReady($this->ilias_config['author_role_name']), htmlReady($this->getName())); + return false; } } - return false; + // check workgroup role template + if (!empty($this->ilias_config['workgroup_category']) && empty($this->ilias_config['workgroup_role_name'])) { + $this->error[] = _("Das Rollen-Template für die Arbeitsgruppen wurde noch nicht festgelegt."); + return false; + } elseif (is_numeric($this->ilias_config['workgroup_role_name'])) { + // if an ID was entered, simply use it; else check for title + $this->ilias_config['workgroup_role'] = $this->ilias_config['workgroup_role_name']; + $this->storeSettings(); + } else { + $role_template = $this->soap_client->getObjectByTitle($this->ilias_config['workgroup_role_name'], 'rolt'); + + if (is_array($role_template)) { + $this->ilias_config['workgroup_role'] = $role_template["obj_id"]; + $this->ilias_config['workgroup_role_name'] = $role_template["title"]; + $this->storeSettings(); + } else { + $this->error[] = sprintf(_('Das Rollen-Template mit dem Namen „%1$s“ wurde im System %2$s nicht gefunden.'), htmlReady($this->ilias_config['workgroup_role_name']), htmlReady($this->getName())); + return false; + } + } + return true; } /** @@ -933,8 +958,10 @@ class ConnectedIlias $data = $statement->fetch(PDO::FETCH_ASSOC); $user_list = []; - foreach ($data as $user_data) { - $user_list[$data['user_id']] = trim($data['title_front'] . ' ' . $data['Vorname'] . ' ' . $data['Nachname'] . ' ' . $data['title_rear']); + if (is_array($data)) { + foreach ($data as $user_data) { + $user_list[$data['user_id']] = trim($data['title_front'] . ' ' . $data['Vorname'] . ' ' . $data['Nachname'] . ' ' . $data['title_rear']); + } } return $user_list; -- cgit v1.0