diff options
| author | Arne Schröder, M. A. <schroeder@data-quest.de> | 2025-12-19 12:33:49 +0000 |
|---|---|---|
| committer | Rasmus Fuhse <fuhse@data-quest.de> | 2025-12-19 12:33:49 +0000 |
| commit | b175d594c3de3471dd65c72bdfe509a44072c8c6 (patch) | |
| tree | db1664a2de49d1fc145968b194798f9cc42cbb71 | |
| parent | 680de640261a0b9005a6b3c084506d6abf51b433 (diff) | |
Resolve "ILIAS-Schnittstelle: Anlegen von ILIAS-Arbeitsbereichen aus Stud.IP"
Closes #5902
Merge request studip/studip!4569
| -rw-r--r-- | app/controllers/admin/ilias_interface.php | 5 | ||||
| -rw-r--r-- | app/controllers/my_ilias_accounts.php | 75 | ||||
| -rw-r--r-- | app/views/admin/ilias_interface/edit_permissions.php | 21 | ||||
| -rw-r--r-- | app/views/my_ilias_accounts/add_workgroup.php | 13 | ||||
| -rw-r--r-- | app/views/my_ilias_accounts/my_courses.php | 15 | ||||
| -rw-r--r-- | lib/ilias_interface/ConnectedIlias.php | 45 |
6 files changed, 164 insertions, 10 deletions
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 @@ </section> <? endif ?> </fieldset> + <? if (!empty($ilias_config['workgroup_category'])) : ?> + <fieldset> + <legend> + <?= _('Arbeitsbereiche') ?> + </legend> + <label> + <span class="required"><?= _('Erforderliche Rechtestufe zum Erstellen von Arbeitsbereichen') ?></span> + <select name="ilias_workgroup_perm"> + <option value="autor" <?= $ilias_config['workgroup_perm'] === 'autor' ? 'selected' : '' ?>><?= _('autor') ?></option> + <option value="tutor" <?= $ilias_config['workgroup_perm'] === 'tutor' ? 'selected' : '' ?>><?= _('tutor') ?></option> + <option value="dozent" <?= empty($ilias_config['workgroup_perm']) || $ilias_config['workgroup_perm'] === 'dozent' ? 'selected' : '' ?>><?= _('dozent') ?></option> + <option value="admin" <?= $ilias_config['workgroup_perm'] == 'admin' ? 'selected' : '' ?>><?= _('admin') ?></option> + <option value="root" <?= $ilias_config['workgroup_perm'] === 'root' ? 'selected' : '' ?>><?= _('root') ?></option> + </select> + </label> + <label> + <span class="required"><?= _('Name oder ID des Rollen-Templates für Mitglieder von Arbeitsbereichen') ?></span> + <input type="text" name="ilias_workgroup_role_name" size="50" maxlength="255" value="<?= htmlReady($ilias_config['workgroup_role_name'] ?? '') ?>" required> + </label> + </fieldset> + <? endif ?> </form> 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 @@ +<form class="default" action="<?= $controller->link_for('my_ilias_accounts/add_workgroup/'.$ilias->index) ?>" method="post"> + <?= CSRFProtection::tokenTag() ?> + <label> + <span class="required"><?= _('Name des Arbeitsbereichs') ?></span> + <input type="text" name="ilias_workgroup_name" size="50" maxlength="255" value="<?=htmlReady($ilias_workgroup_name)?>" required> + </label> + <footer data-dialog-button> + <? if ($ilias->isActive()) : ?> + <?= Studip\Button::createAccept(_('Erstellen'), 'add_workgroup') ?> + <? endif ?> + <?= Studip\Button::createCancel(_('Abbrechen'), 'cancel', ['data-dialog' => 'close']) ?> + </footer> +</form>
\ 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 @@ </table> <? endforeach ?> <? foreach ($ilias_list as $ilias_index => $ilias) : ?> - <? if (!empty($workgroups_list[$ilias_index])) : ?> + <? if (!empty($workgroups_list[$ilias_index]) || !empty($add_workgroups_perm)) : ?> <br> <br> <table class="default"> @@ -100,6 +100,19 @@ </td> </tr> <? endforeach ?> + <? else : ?> + <tr> + <td colspan="3"><?=_('Sie sind noch keinem Arbeitsbereich zugeordnet.')?></td> + </tr> + <? endif ?> + <? if (!empty($add_workgroups_perm[$ilias_index])) : ?> + <tfoot> + <tr> + <td colspan="3"> + <?= Studip\LinkButton::create(_('Neuen Arbeitsbereich anlegen'), $controller->url_for('my_ilias_accounts/add_workgroup/'.$ilias_index), ['data-dialog' => 'size=auto']) ?> + </td> + </tr> + </tfoot> <? endif ?> </table> <? endif ?> 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; |
