diff options
| author | Arne Schröder, M. A. <schroeder@data-quest.de> | 2025-06-26 19:37:58 +0000 |
|---|---|---|
| committer | David Siegfried <david.siegfried@uni-vechta.de> | 2025-06-26 19:37:58 +0000 |
| commit | 9b31a2b9f5ac6ec3e96286a0667acb27bb234e9e (patch) | |
| tree | cb6ca6a26fa252b339f6fd1e38ad478e5f1e4ef7 | |
| parent | 3e03d375912f3abeadc0283b7799e33734560212 (diff) | |
Resolve "ILIAS-Arbeitsbereiche über Stud.IP verwalten und anzeigen"
Closes #4269
Merge request studip/studip!4214
| -rw-r--r-- | app/controllers/admin/ilias_interface.php | 4 | ||||
| -rw-r--r-- | app/controllers/my_ilias_accounts.php | 135 | ||||
| -rw-r--r-- | app/views/admin/ilias_interface/edit_content.php | 25 | ||||
| -rw-r--r-- | app/views/my_ilias_accounts/_ilias_module.php | 18 | ||||
| -rw-r--r-- | app/views/my_ilias_accounts/my_courses.php | 45 | ||||
| -rw-r--r-- | app/views/my_ilias_accounts/view_workgroup.php | 11 | ||||
| -rw-r--r-- | db/migrations/6.1.3_step_4269.php | 33 | ||||
| -rw-r--r-- | lib/ilias_interface/ConnectedIlias.php | 196 | ||||
| -rw-r--r-- | lib/ilias_interface/IliasModule.php | 4 | ||||
| -rw-r--r-- | lib/ilias_interface/IliasSoap.php | 29 | ||||
| -rw-r--r-- | lib/ilias_interface/IliasUser.php | 16 | ||||
| -rw-r--r-- | lib/ilias_interface/studip_referrer_7x.php | 2 | ||||
| -rw-r--r-- | lib/ilias_interface/studip_referrer_8x.php | 4 | ||||
| -rw-r--r-- | lib/ilias_interface/studip_referrer_9x.php | 5 |
14 files changed, 510 insertions, 17 deletions
diff --git a/app/controllers/admin/ilias_interface.php b/app/controllers/admin/ilias_interface.php index 9022505..5abd6b9 100644 --- a/app/controllers/admin/ilias_interface.php +++ b/app/controllers/admin/ilias_interface.php @@ -154,6 +154,8 @@ class Admin_IliasInterfaceController extends AuthenticatedController 'cat_semester' => '', 'course_semester' => '', 'course_veranstaltungsnummer' => false, + 'workgroup_category_name' => '', + 'workgroup_category' => '', 'modules' => [], 'author_role_name' => 'Author', @@ -374,6 +376,8 @@ class Admin_IliasInterfaceController extends AuthenticatedController $this->ilias_configs[$index]['delete_ilias_courses'] = Request::get('ilias_delete_ilias_courses'); $this->ilias_configs[$index]['category_create_on_add_module'] = Request::get('ilias_category_create_on_add_module'); $this->ilias_configs[$index]['category_to_desktop'] = Request::get('ilias_category_to_desktop'); + $this->ilias_configs[$index]['workgroup_category_name'] = Request::get('ilias_workgroup_category_name'); + foreach ($this->modules_available as $module_index => $module_name) { if (Request::get('ilias_modules_'.$module_index)) { $this->ilias_configs[$index]['modules'][$module_index] = $module_name; diff --git a/app/controllers/my_ilias_accounts.php b/app/controllers/my_ilias_accounts.php index 2a3bd22..e85e567 100644 --- a/app/controllers/my_ilias_accounts.php +++ b/app/controllers/my_ilias_accounts.php @@ -72,6 +72,99 @@ class MyIliasAccountsController extends AuthenticatedController } /** + * 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. + $mp = MultiPersonSearch::load('add_ilias_workgroup_member' . $workgroup_id); + + $requests_sent = 0; + $workgroup = $this->ilias->getWorkgroup($workgroup_id); + + if (!empty($workgroup)) { + $messaging = new messaging(); + foreach ($mp->getAddedUsers() as $user_id) { + $user = new IliasUser($this->ilias_index, $this->ilias_int_version, $user_id); + if (!$user->isConnected()) { + PageLayout::postInfo(sprintf( + _('%s wurde übersprungen, da kein ILIAS-Account verknüpft ist.'), + htmlReady($user->getName()) + )); + } elseif (!empty($workgroup['members'][$user_id])) { + PageLayout::postInfo(sprintf( + _('%s wurde übersprungen, da bereits Mitglied des Arbeitsbereichs.'), + htmlReady($user->getName()) + )); + } else { + $message_title = sprintf(_('Mitgliedschaftsanfrage für ILIAS-Arbeitsbereich "%s"'), $workgroup['title']); + $message_body = sprintf(_('Sie haben eine Mitgliedschafts-Anfrage für den ILIAS-Arbeitsbereich "%s" erhalten.'), $workgroup['title'])."\n\n"; + $message_body .= _('Um dem Arbeitsbereich beizutreten, klicken Sie bitte auf den folgenden Link:')."\n\n"; + $message_body .= '['. _('ILIAS-Arbeitsbereich hinzufügen') . ']' . $this->url_for('my_ilias_accounts/accept_workgroup_request', $this->ilias_index, $workgroup_id)."\n\n"; + $message_body .= _('Diese Anfrage ist für eine Woche ab Erhalt der Nachricht gültig.'); + + $recipients = [$user->studip_login]; + $messaging->insert_message( + $message_body, + $recipients, + '____%system%____', + '', + '', + '', + null, + $message_title + ); + $requests_sent++; + $this->ilias->addWorkgroupRequest($user_id, $workgroup_id); + } + } + if ($requests_sent === 1) { + PageLayout::postInfo(sprintf(_('Es wurde eine Anfrage für den Arbeitsbereich "%s" verschickt.'), $workgroup['title'])); + } elseif ($requests_sent >= 0) { + PageLayout::postInfo(sprintf(_('Es wurden %s Anfragen für den Arbeitsbereich "%s" verschickt.'), $requests_sent, $workgroup['title'])); + } + } else { + PageLayout::postError(sprintf(_('Arbeitsbereich %s wurde nicht gefunden oder hat keine lokale Rolle.'), htmlReady($workgroup_id))); + } + } else { + PageLayout::postError(_('Diese ILIAS-Installation ist nicht aktiv.')); + } + $this->redirect($this->url_for('my_ilias_accounts/my_courses')); + } + + /** + * Accepts workgroup request for current user + */ + 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; + + if ($this->ilias->user->isConnected() && $this->ilias->user->hasWorkgroupRequest($workgroup_id)) { + $this->ilias->resolveWorkgroupRequest($this->ilias->user->studip_id, $workgroup_id, true); + $workgroup = $this->ilias->getWorkgroup($workgroup_id); + + if (!empty($this->ilias->getError())) { + foreach ($this->ilias->getError() as $error) { + PageLayout::postError(htmlReady($error)); + } + } else { + PageLayout::postSuccess(sprintf(_('Sie wurden in den Arbeitsbereich "%s" eingetragen.'), htmlReady($workgroup['title']))); + } + } else { + PageLayout::postError(_('Der Arbeitsbereich wurde nicht gefunden oder die Anfrage ist nicht mehr gültig.')); + } + } else { + PageLayout::postError(_('Diese ILIAS-Installation ist nicht aktiv.')); + } + $this->redirect($this->url_for('my_ilias_accounts/my_courses')); + } + + /** * Shows ilias courses for active user */ public function my_courses_action() @@ -85,7 +178,10 @@ class MyIliasAccountsController extends AuthenticatedController } else { $this->selected_semester = ''; } - + $this->add_member_search = null; + $this->courses_list = []; + $this->workgroups_list = []; + // set up connected ilias classes $this->ilias_list = []; foreach (Config::get()->ILIAS_INTERFACE_SETTINGS as $ilias_index => $ilias_config) { @@ -171,6 +267,23 @@ class MyIliasAccountsController extends AuthenticatedController } } } + + if ($ilias->ilias_config['workgroup_category']) { + // Prepare search object for MultiPersonSearch. + if (empty($this->add_member_search)) { + $this->add_member_search = new PermissionSearch( + 'user', + _('Personen suchen'), + 'user_id', + [ + 'permission' => ['tutor', 'dozent'], + 'exclude_user' => [] + ] + ); + } + + $this->workgroups_list[$ilias_index] = $ilias->getUserWorkgroups($GLOBALS['perm']->have_perm('root')); + } } } $this->sidebar->addWidget($widget); @@ -213,6 +326,26 @@ class MyIliasAccountsController extends AuthenticatedController } /** + * View ILIAS course details + * @param $index Index of ILIAS installation + * @param $crs_id course ID + */ + public function view_workgroup_action($index, $workgroup_id) + { + $this->ilias = new ConnectedIlias($index); + if ($this->ilias->isActive()) { + $this->workgroup_data = $this->ilias->getWorkgroup($workgroup_id); + $this->module = new IliasModule($workgroup_id, $this->workgroup_data, $index, $this->ilias->ilias_int_version); + $this->module->module_type_name = _('ILIAS-Arbeitsbereich'); + $this->module->icon_file = 'community'; + 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_content.php b/app/views/admin/ilias_interface/edit_content.php index a67fa21..48eaad4 100644 --- a/app/views/admin/ilias_interface/edit_content.php +++ b/app/views/admin/ilias_interface/edit_content.php @@ -118,19 +118,20 @@ <input type="checkbox" name="ilias_delete_ilias_courses" value="1" <?= !empty($ilias_config['delete_ilias_courses']) ? 'checked' : '' ?>> <span><?= _('Beim Löschen von Stud.IP-Veranstaltungen ILIAS-Kurse ebenfalls löschen (alle untergeordneten Objekte werden gelöscht!)') ?></span> </label> - + <label> + <span><?= _('Kategorie mit Arbeitsbereichen') ?> <?=!empty($ilias_config['workgroup_category']) ? htmlReady(sprintf(_('(ID %s)'), $ilias_config['workgroup_category'])) : ''?></span> + <input type="text" name="ilias_workgroup_category_name" size="50" maxlength="255" value="<?= empty($ilias_config['workgroup_category_name']) ? '' : htmlReady($ilias_config['workgroup_category_name']) ?>"> + </label> <? if ($ilias_interface_config['create_objects']) : ?> - <label> - <span> <?= _('Module') ?></span> - </label> - <label> - <? foreach ($modules_available as $module_index => $module_name) : ?> - <label> - <input type="checkbox" name="ilias_modules_<?= $module_index ?>" value="1" <?= !empty($ilias_config['modules'][$module_index]) ? ' checked' : '' ?>> - <?=htmlReady($module_name)?> - </label> - <? endforeach ?> - </label> + <label> + <span> <?= _('Module') ?></span> + </label> + <? foreach ($modules_available as $module_index => $module_name) : ?> + <label> + <input type="checkbox" name="ilias_modules_<?= $module_index ?>" value="1" <?= !empty($ilias_config['modules'][$module_index]) ? ' checked' : '' ?>> + <?=htmlReady($module_name)?> + </label> + <? endforeach ?> <? endif ?> <footer data-dialog-button> <?= Studip\Button::createAccept(_('Speichern'), 'submit') ?> diff --git a/app/views/my_ilias_accounts/_ilias_module.php b/app/views/my_ilias_accounts/_ilias_module.php index 75ab1d9..d9c1ef0 100644 --- a/app/views/my_ilias_accounts/_ilias_module.php +++ b/app/views/my_ilias_accounts/_ilias_module.php @@ -55,6 +55,24 @@ </article> <? endif ?> + <? if (!empty($module->members)) : ?> + <h3><?=_('Mitglieder in ILIAS')?></h3> + <article> + <? foreach ($module->members as $member_name) : ?> + <div><?=htmlReady($member_name)?></div> + <? endforeach ?> + </article> + <? endif ?> + + <? if (!empty($module->member_requests)) : ?> + <h3><?=_('Angefragte Mitglieder in ILIAS')?></h3> + <article> + <? foreach ($module->member_requests as $member_name) : ?> + <div><?=htmlReady($member_name)?></div> + <? endforeach ?> + </article> + <? endif ?> + <? if ((($module->getModuleType() == 'htlm') || ($module->getModuleType() == 'sahs') || ($module->getModuleType() == 'lm')) && ($ilias->getStructure($module->getId()))) : ?> <h3><?=_('Struktur')?></h3> <article> diff --git a/app/views/my_ilias_accounts/my_courses.php b/app/views/my_ilias_accounts/my_courses.php index 81aa739..bd381cf 100644 --- a/app/views/my_ilias_accounts/my_courses.php +++ b/app/views/my_ilias_accounts/my_courses.php @@ -59,4 +59,49 @@ <? endif ?> </table> <? endforeach ?> +<? foreach ($ilias_list as $ilias_index => $ilias) : ?> + <? if (!empty($workgroups_list[$ilias_index])) : ?> + <br> + <br> + <table class="default"> + <caption> + <?= sprintf(_('Meine Arbeitsbereiche in %s'), htmlReady($ilias->getName())) ?> + </caption> + <colgroup> + <col style="width: 2%"> + <col> + <col style="width: 2%"> + </colgroup> + <thead> + <tr> + <th></th> + <th><?= _('Name') ?></th> + <th><?= _('Aktionen') ?></th> + </tr> + </thead> + <? if (!empty($workgroups_list[$ilias_index])) : ?> + <? foreach ($workgroups_list[$ilias_index] as $cat_id => $workgroup) : ?> + <tr> + <td><?= Icon::create('community', Icon::ROLE_INFO)->asImg(['title' => _('ILIAS-Arbeitsbereich')]) ?></td> + <td> + <a href="<?= URLHelper::getLink("dispatch.php/my_ilias_accounts/view_workgroup/{$ilias_index}/{$cat_id}")?>" data-dialog=""><?= htmlReady($workgroup['title']) ?></a> + </td> + <td class="actions"> + <?= ActionMenu::get()->setContext($workgroup['title']) + ->addMultiPersonSearch( + MultiPersonSearch::get('add_ilias_workgroup_member' . $cat_id) + ->setTitle(sprintf(_('Personen zu Arbeitsbereich "%s" hinzufügen'), $workgroup['title'])) + ->setLinkText(_('Personen hinzufügen')) + ->setSearchObject($add_member_search) + ->setDataDialogStatus(Request::isXhr()) + ->setJSFunctionOnSubmit(Request::isXhr() ? 'STUDIP.Dialog.close();' : false) + ->setExecuteURL($controller->url_for('my_ilias_accounts/request_workgroup_member/' . $ilias_index . '/' . $cat_id)) + ) ?> + </td> + </tr> + <? endforeach ?> + <? endif ?> + </table> + <? endif ?> +<? endforeach ?> </form> diff --git a/app/views/my_ilias_accounts/view_workgroup.php b/app/views/my_ilias_accounts/view_workgroup.php new file mode 100644 index 0000000..4652c45 --- /dev/null +++ b/app/views/my_ilias_accounts/view_workgroup.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 Arbeitsbereich in ILIAS'), $controller->url_for($module->getRoute('start')), ['target' => '_blank', 'rel' => 'noopener noreferrer']) :'' ?> + <?= $module->isAllowed('edit') ? Studip\LinkButton::create(_('Arbeitsbereich 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/db/migrations/6.1.3_step_4269.php b/db/migrations/6.1.3_step_4269.php new file mode 100644 index 0000000..0b2f65d --- /dev/null +++ b/db/migrations/6.1.3_step_4269.php @@ -0,0 +1,33 @@ +<?php +class Step4269 extends Migration +{ + public function description() + { + return "Adds ilias workgroup member request table."; + } + + public function up() + { + $db = \DBManager::get(); + + $db->exec( + "CREATE TABLE `ilias_workgroup_request`( + `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `workgroup_id` INT(11) NOT NULL, + `ilias_index` VARCHAR(32) NOT NULL, + `user_id` CHAR(32) COLLATE latin1_bin NOT NULL, + `valid_until` INT(11) UNSIGNED NOT NULL, + `mkdate` INT(11) UNSIGNED NOT NULL, + `chdate` INT(11) UNSIGNED NOT NULL, + PRIMARY KEY(`id`), + UNIQUE KEY `workgroup_user` (`ilias_index`,`user_id`,`workgroup_id`) + )" + ); + } + + public function down() + { + $db = \DBManager::get(); + $db->exec('DROP TABLE IF EXISTS `ilias_workgroup_request`'); + } +}
\ No newline at end of file diff --git a/lib/ilias_interface/ConnectedIlias.php b/lib/ilias_interface/ConnectedIlias.php index 3c4332e..7d8c726 100644 --- a/lib/ilias_interface/ConnectedIlias.php +++ b/lib/ilias_interface/ConnectedIlias.php @@ -46,6 +46,8 @@ class ConnectedIlias public $course_modules; public $user; public $user_modules; + public $user_workgroups; + public $user_roles; public $operations; public $user_operations; @@ -182,6 +184,8 @@ class ConnectedIlias 'cat_semester' => '', 'course_semester' => '', 'course_veranstaltungsnummer' => false, + 'workgroup_category_name' => '', + 'workgroup_category' => '', 'modules' => [], 'author_role_name' => '', @@ -343,6 +347,7 @@ class ConnectedIlias */ public function getContentSettingsStatus() { + $changed_settings = false; if (!$this->ilias_config['root_category']) { // check category if (!$this->ilias_config['root_category_name']) { @@ -361,14 +366,15 @@ class ConnectedIlias if (!$category) { $this->error[] = sprintf(_('Die Kategorie „%s“ wurde nicht gefunden.'), $this->ilias_config['root_category_name']); return false; - } - if ($category) { + } else { // no ID entered manually if ($this->ilias_config['root_category'] == null) { $this->ilias_config['root_category'] = $category; } else { $this->ilias_config['root_category_name'] = $category['title']; } + + $this->ilias_config['root_category'] = $category; // check user data category if (! $this->ilias_config['user_data_category']) { $object_data["title"] = sprintf(_("User-Daten")); @@ -383,8 +389,25 @@ class ConnectedIlias return false; } } - $this->storeSettings(); } + $changed_settings = true; + } + if (mb_strlen($this->ilias_config['workgroup_category_name']) > 2) { + $workgroup_category = $this->soap_client->getReferenceByTitle($this->ilias_config['workgroup_category_name'], 'cat'); + if (!$workgroup_category) { + $this->error[] = sprintf(_('Die Kategorie "%s" wurde nicht gefunden.'), $this->ilias_config['workgroup_category_name']); + return false; + } else { + $this->ilias_config['workgroup_category'] = $workgroup_category; + $changed_settings = true; + } + } elseif ($this->ilias_config['workgroup_category']) { + $this->ilias_config['workgroup_category'] = ''; + $this->ilias_config['workgroup_category_name'] = ''; + $changed_settings = true; + } + if ($changed_settings) { + $this->storeSettings(); } return true; @@ -826,6 +849,158 @@ class ConnectedIlias } /** + * get workgroup data + * + * returns workgroup data for given id + */ + public function getWorkgroup(int $workgroup_id): array + { + if (empty($this->ilias_config['workgroup_category']) || !$this->user->isConnected()) { + return []; + } + + $local_roles = $this->soap_client->getLocalRoles($workgroup_id); + if (!empty($local_roles)) { + $workgroup_data = $this->soap_client->getObjectByReference($workgroup_id, $this->user->id); + $workgroup_data['members'] = $this->soap_client->getUsersForRole(reset($local_roles)['obj_id']); + $workgroup_data['member_requests'] = $this->getWorkgroupRequests($workgroup_id); + + return $workgroup_data; + } + + return []; + } + + /** + * get user workgroups + * + * returns list of active workgroup categories for current user + */ + public function getUserWorkgroups(bool $ignore_local_roles = false): array + { + if (empty($this->ilias_config['workgroup_category'])) { + return []; + } + + if (!empty($this->user_workgroups)) { + return $this->user_workgroups; + } + + $user_roles = []; + if (!$ignore_local_roles) { + $user_roles = $this->getUserRoles(); + } + + $result = $this->soap_client->getTreeChilds($this->ilias_config['workgroup_category'], ['cat'], $this->user->getId()); + if (is_array($result)) { + foreach ($result as $key => $object_data) { + if (empty($object_data['references'])) { + continue; + } + + foreach ($object_data['references'] as $ref_id => $ref_data) { + if ($ref_data['parent_id'] !== $this->ilias_config['workgroup_category']) { + continue; + } + + if ($ignore_local_roles) { + $this->user_workgroups[$ref_id] = $object_data; + } else { + $local_roles = $this->soap_client->getLocalRoles($ref_id); + if ( + !empty($local_roles) + && !empty($user_roles) + && in_array(reset($local_roles)['obj_id'], $user_roles) + ) { + $this->user_workgroups[$ref_id] = $object_data; + } + } + } + } + } + return $this->user_workgroups; + } + + /** + * get users for active member requests for workgroup + * + * gets all member requests from table ilias_workgroup_request for given workgroup id + */ + public function getWorkgroupRequests(int $workgroup_id): array + { + $query = "SELECT user_id, Vorname, Nachname, title_front, title_rear + FROM ilias_workgroup_request + JOIN auth_user_md5 USING (user_id) + JOIN user_info USING (user_id) + WHERE ilias_index = ? AND workgroup_id = ? AND valid_until > ?"; + $statement = DBManager::get()->prepare($query); + $statement->execute([$this->index, $workgroup_id, time()]); + $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']); + } + + return $user_list; + } + + /** + * add member request for workgroup + * + * adds member request to table ilias_workgroup_request + */ + public function addWorkgroupRequest(string $user_id, int $workgroup_id): void + { + $query = "SELECT id + FROM ilias_workgroup_request + WHERE user_id = ? AND ilias_index = ? AND workgroup_id = ?"; + $statement = DBManager::get()->prepare($query); + $statement->execute([$user_id, $this->index, $workgroup_id]); + $data = $statement->fetch(PDO::FETCH_ASSOC); + if (empty($data)) { + $query = "INSERT INTO ilias_workgroup_request (`workgroup_id`, `ilias_index`, `user_id`, `valid_until`, `mkdate`, `chdate`) VALUES (?, ?, ?, ?, ?, ?);"; + DBManager::get()->execute($query, [$workgroup_id, $this->index, $user_id, strtotime('+7 days'), time(), time()]); + } else { + $query = "UPDATE ilias_workgroup_request + SET `valid_until` = ?, `chdate` = ? + WHERE user_id = ? AND ilias_index = ? AND workgroup_id = ?;"; + DBManager::get()->execute($query, [strtotime('+7 days'), time(), $user_id, $this->index, $workgroup_id]); + } + } + + /** + * revoke member request for workgroup + * + * returns array of user account data + */ + public function resolveWorkgroupRequest(string $user_id, int $workgroup_id, bool $accept_request): bool + { + //if request accepted add user to local workgroup role, otherwise just remove entry + if ($accept_request) { + $local_roles = $this->soap_client->getLocalRoles($workgroup_id); + if (empty($local_roles)) { + $this->error[] = sprintf(_('Zuordnung nicht möglich, im gewählten ILIAS-Arbeitsbereich wurde keine lokale Rolle gefunden.'), $workgroup_id); + return false; + } else { + $user = new IliasUser($this->index, $this->ilias_int_version, $user_id); + if ($user->isConnected()) { + $this->soap_client->addUserRoleEntry($user->getId(), reset($local_roles)['obj_id']); + } else { + $this->error[] = sprintf(_('Zuordnung nicht möglich, ILIAS-Account wurde nicht gefunden.'), $workgroup_id); + return false; + } + } + } + + // remove entry from database + $query = "DELETE FROM ilias_workgroup_request + WHERE `workgroup_id` = ? AND `ilias_index` = ? AND `user_id` = ?;"; + DBManager::get()->execute($query, [$workgroup_id, $this->index, $user_id]); + return true; + } + + /** * get user modules * * returns content modules from current users private category @@ -1263,6 +1438,19 @@ class ConnectedIlias } /** + * get user roles + * + * returns all user roles + */ + public function getUserRoles(): array + { + if (empty($this->user_roles)) { + $this->user_roles = $this->soap_client->getUserRoles($this->user->getId()); + } + return $this->user_roles; + } + + /** * check user permissions * * checks user permissions for connected course and changes setting if necessary @@ -1284,7 +1472,7 @@ class ConnectedIlias $this->checkUser(); // get course role folder and local roles - $user_roles = $this->soap_client->getUserRoles($this->user->getId()); + $user_roles = $this->getUserRoles(); $local_roles = $this->soap_client->getLocalRoles($ilias_course_id); $active_role = ""; $proper_role = ""; diff --git a/lib/ilias_interface/IliasModule.php b/lib/ilias_interface/IliasModule.php index d3ec88c..8d372c3 100644 --- a/lib/ilias_interface/IliasModule.php +++ b/lib/ilias_interface/IliasModule.php @@ -31,6 +31,8 @@ class IliasModule public $is_offline; public $is_connected; public $owner; + public $members; + public $member_requests; public $author_studip; public $siblings_count; public $icon_file; @@ -60,6 +62,8 @@ class IliasModule $this->module_type_name = $this->module_type; } $this->owner = $module_data['owner']; + $this->members = !empty($module_data['members']) ? $module_data['members'] : []; + $this->member_requests = !empty($module_data['member_requests']) ? $module_data['member_requests'] : []; $this->author_studip = false; if (!empty($module_data['references'][$module_id]['operations']) && is_array($module_data['references'][$module_id]['operations'])) { $this->allowed_operations = $module_data['references'][$module_id]['operations']; diff --git a/lib/ilias_interface/IliasSoap.php b/lib/ilias_interface/IliasSoap.php index 022e18f..b0c20d5 100644 --- a/lib/ilias_interface/IliasSoap.php +++ b/lib/ilias_interface/IliasSoap.php @@ -873,6 +873,35 @@ class IliasSoap extends StudipSoapClient } /** + * get users for role entry + * + * returns all users associated with given role id + * @access public + * @param string role_id role-id + * @return array result + */ + function getUsersForRole($role_id) + { + $param = [ + 'sid' => $this->getSID(), + 'role_id' => $role_id, + 'attach_roles' => 0, + 'active' => 1, + ]; + $result = $this->call('getUsersForRole', $param); + $user_array = []; + + if ($result) { + $s = simplexml_load_string($result); + foreach ($s->User as $user) { + $id_parts = explode('usr_', $user->attributes()->Id); + $user_array[$id_parts[1]] = trim((string)$user->Title . ' ' . (string)$user->Firstname . ' ' .(string)$user->Lastname); + } + } + return $user_array; + } + + /** * grant permissions * * grants permissions for given operations at role-id and ref-id diff --git a/lib/ilias_interface/IliasUser.php b/lib/ilias_interface/IliasUser.php index fbd15ce..84e8f26 100644 --- a/lib/ilias_interface/IliasUser.php +++ b/lib/ilias_interface/IliasUser.php @@ -177,6 +177,22 @@ class IliasUser } /** + * check member request for workgroup + * + * checks if member request for current user exists + */ + public function hasWorkgroupRequest(int $workgroup_id): bool + { + $query = "SELECT id, valid_until + FROM ilias_workgroup_request + WHERE user_id = ? AND ilias_index = ? AND workgroup_id = ?"; + $statement = DBManager::get()->prepare($query); + $statement->execute([$this->studip_id, $this->index, $workgroup_id]); + $data = $statement->fetch(PDO::FETCH_ASSOC); + return (!empty($data) && (int)$data['valid_until'] > time()); + } + + /** * get array of user account data * * returns array of user account data diff --git a/lib/ilias_interface/studip_referrer_7x.php b/lib/ilias_interface/studip_referrer_7x.php index fd62820..fe6acdb 100644 --- a/lib/ilias_interface/studip_referrer_7x.php +++ b/lib/ilias_interface/studip_referrer_7x.php @@ -72,6 +72,8 @@ if(file_exists("./ilias.ini.php")){ $base_url = "ilias.php?baseClass=ilGlossaryPresentationGUI"; break; case 'cat': + $base_url = "ilias.php?cmd=view&baseClass=ilRepositoryGUI&cmdClass=ilObjCategoryGUI"; + break; case 'crs': $base_url= "ilias.php?cmd=render&cmdClass=ilrepositorygui&baseClass=ilRepositoryGUI"; break; diff --git a/lib/ilias_interface/studip_referrer_8x.php b/lib/ilias_interface/studip_referrer_8x.php index 62b17a6..abff949 100644 --- a/lib/ilias_interface/studip_referrer_8x.php +++ b/lib/ilias_interface/studip_referrer_8x.php @@ -72,6 +72,8 @@ if(file_exists("./ilias.ini.php")){ $base_url = "ilias.php?baseClass=ilGlossaryPresentationGUI"; break; case 'cat': + $base_url = "ilias.php?cmd=view&baseClass=ilRepositoryGUI&cmdClass=ilObjCategoryGUI"; + break; case 'crs': $base_url= "ilias.php?cmd=render&cmdClass=ilrepositorygui&baseClass=ilRepositoryGUI"; break; @@ -108,6 +110,8 @@ if(file_exists("./ilias.ini.php")){ $base_url = "ilias.php?baseClass=ilExerciseHandlerGUI"; break; case 'cat': + $base_url = "ilias.php?baseClass=ilrepositorygui&cmd=edit"; + break; case 'crs': $base_url= "ilias.php?baseClass=ilrepositorygui&cmd=edit"; break; diff --git a/lib/ilias_interface/studip_referrer_9x.php b/lib/ilias_interface/studip_referrer_9x.php index 8cfad26..26c8646 100644 --- a/lib/ilias_interface/studip_referrer_9x.php +++ b/lib/ilias_interface/studip_referrer_9x.php @@ -67,6 +67,8 @@ if (file_exists("./ilias.ini.php")) { $base_url = "ilias.php?baseClass=ilGlossaryPresentationGUI"; break; case 'cat': + $base_url = "ilias.php?cmd=view&baseClass=ilRepositoryGUI&cmdClass=ilObjCategoryGUI"; + break; case 'crs': $base_url = "ilias.php?cmd=view&cmdClass=ilobjcoursegui&baseClass=ilRepositoryGUI"; break; @@ -102,6 +104,9 @@ if (file_exists("./ilias.ini.php")) { case 'exc': $base_url = "ilias.php?baseClass=ilExerciseHandlerGUI"; break; + case 'cat': + $base_url = "ilias.php?baseClass=ilrepositorygui&cmd=edit"; + break; case 'crs': $base_url = "ilias.php?baseClass=ilrepositorygui&cmd=edit"; break; |
