aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schröder, M. A. <schroeder@data-quest.de>2025-06-26 19:37:58 +0000
committerDavid Siegfried <david.siegfried@uni-vechta.de>2025-06-26 19:37:58 +0000
commit9b31a2b9f5ac6ec3e96286a0667acb27bb234e9e (patch)
treecb6ca6a26fa252b339f6fd1e38ad478e5f1e4ef7
parent3e03d375912f3abeadc0283b7799e33734560212 (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.php4
-rw-r--r--app/controllers/my_ilias_accounts.php135
-rw-r--r--app/views/admin/ilias_interface/edit_content.php25
-rw-r--r--app/views/my_ilias_accounts/_ilias_module.php18
-rw-r--r--app/views/my_ilias_accounts/my_courses.php45
-rw-r--r--app/views/my_ilias_accounts/view_workgroup.php11
-rw-r--r--db/migrations/6.1.3_step_4269.php33
-rw-r--r--lib/ilias_interface/ConnectedIlias.php196
-rw-r--r--lib/ilias_interface/IliasModule.php4
-rw-r--r--lib/ilias_interface/IliasSoap.php29
-rw-r--r--lib/ilias_interface/IliasUser.php16
-rw-r--r--lib/ilias_interface/studip_referrer_7x.php2
-rw-r--r--lib/ilias_interface/studip_referrer_8x.php4
-rw-r--r--lib/ilias_interface/studip_referrer_9x.php5
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;