aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schröder, M. A. <schroeder@data-quest.de>2025-07-04 11:32:39 +0000
committerRasmus Fuhse <fuhse@data-quest.de>2025-07-04 11:32:39 +0000
commit382cfd5bbe19abd89805ab48287e0c8d425ac080 (patch)
treecd84751573663e71469f5cd1870badd8634afd6c
parentd98e8f811ee969fc94f922a70ad270ff02d057fc (diff)
Resolve "Erweiterung und Optimierung der von der ILIAS-Schnittstelle angelegten Strukturkategorien"
Closes #4270 Merge request studip/studip!4215
-rw-r--r--app/controllers/admin/ilias_interface.php2
-rw-r--r--app/controllers/course/ilias_interface.php6
-rw-r--r--app/views/admin/ilias_interface/edit_content.php4
-rw-r--r--db/migrations/6.1.7_step_4270.php43
-rw-r--r--lib/ilias_interface/ConnectedIlias.php110
-rw-r--r--lib/ilias_interface/IliasModule.php2
-rw-r--r--lib/ilias_interface/IliasObjectConnections.php53
7 files changed, 187 insertions, 33 deletions
diff --git a/app/controllers/admin/ilias_interface.php b/app/controllers/admin/ilias_interface.php
index 5abd6b9..860fd99 100644
--- a/app/controllers/admin/ilias_interface.php
+++ b/app/controllers/admin/ilias_interface.php
@@ -152,6 +152,7 @@ class Admin_IliasInterfaceController extends AuthenticatedController
'category_create_on_add_module' => false,
'category_to_desktop' => false,
'cat_semester' => '',
+ 'cat_faculty' => '',
'course_semester' => '',
'course_veranstaltungsnummer' => false,
'workgroup_category_name' => '',
@@ -365,6 +366,7 @@ class Admin_IliasInterfaceController extends AuthenticatedController
if (Request::getInstance()->offsetExists('ilias_cat_semester')) {
$this->ilias_configs[$index]['cat_semester'] = Request::get('ilias_cat_semester');
}
+ $this->ilias_configs[$index]['cat_faculty'] = Request::get('ilias_cat_faculty');
if (Request::getInstance()->offsetExists('ilias_course_semester')) {
$this->ilias_configs[$index]['course_semester'] = Request::get('ilias_course_semester');
}
diff --git a/app/controllers/course/ilias_interface.php b/app/controllers/course/ilias_interface.php
index 13307bf..64d6f6c 100644
--- a/app/controllers/course/ilias_interface.php
+++ b/app/controllers/course/ilias_interface.php
@@ -364,7 +364,7 @@ class Course_IliasInterfaceController extends AuthenticatedController
if (Request::get('cmd') === 'assign_course') {
$crs_id = IliasObjectConnections::getConnectionModuleId($this->seminar_id, 'crs', $this->ilias_index);
if (Request::get('ilias_course_id') && !$crs_id) {
- IliasObjectConnections::setConnection($this->seminar_id, Request::get('ilias_course_id'), 'crs', $this->ilias_index);
+ IliasObjectConnections::setConnection($this->seminar_id, Request::get('ilias_course_id'), 'crs', $this->ilias_index, 'course_twin', '', 'course');
PageLayout::postInfo(_('Kurs wurde zugeordnet.'));
}
$this->redirect('course/ilias_interface');
@@ -383,7 +383,7 @@ class Course_IliasInterfaceController extends AuthenticatedController
if (Request::get('cmd') === 'assign_course') {
$crs_id = IliasObjectConnections::getConnectionModuleId($this->seminar_id, 'crs', $this->ilias_index);
if (Request::get('ilias_course_id') && !$crs_id) {
- IliasObjectConnections::setConnection($this->seminar_id, Request::get('ilias_course_id'), 'crs', $this->ilias_index);
+ IliasObjectConnections::setConnection($this->seminar_id, Request::get('ilias_course_id'), 'crs', $this->ilias_index, 'course_twin', '', 'course');
PageLayout::postInfo(_('Kurs wurde zugeordnet.'));
}
$this->redirect('course/ilias_interface');
@@ -483,7 +483,7 @@ class Course_IliasInterfaceController extends AuthenticatedController
));
} elseif ($group_id = $this->ilias->soap_client->addGroup($group_data, $course_id)) {
// create new group
- IliasObjectConnections::setConnection($group->getId(), $group_id, 'group', $this->ilias_index);
+ IliasObjectConnections::setConnection($group->getId(), $group_id, 'group', $this->ilias_index, 'statusgroup', $this->seminar_id, 'course');
// add members
$member_count = 0;
foreach ($group->members as $member) {
diff --git a/app/views/admin/ilias_interface/edit_content.php b/app/views/admin/ilias_interface/edit_content.php
index 48eaad4..5cd2b89 100644
--- a/app/views/admin/ilias_interface/edit_content.php
+++ b/app/views/admin/ilias_interface/edit_content.php
@@ -92,6 +92,10 @@
<span><?= _('Semester als Kategorie innerhalb der Einrichtung') ?></span>
</label>
<label>
+ <input type="checkbox" name="ilias_cat_faculty" value="1" <?= $ilias_config['cat_faculty'] ? 'checked' : '' ?>>
+ <span><?= _('Kategorien für Fakultäten anlegen') ?></span>
+ </label>
+ <label>
<span class="required"><?= _('Kurstitel') ?></span>
</label>
<label>
diff --git a/db/migrations/6.1.7_step_4270.php b/db/migrations/6.1.7_step_4270.php
new file mode 100644
index 0000000..7178d5b
--- /dev/null
+++ b/db/migrations/6.1.7_step_4270.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Adds namespace values to UserFilter database entries that already existed pre-6.0.
+ */
+final class Step4270 extends Migration
+{
+
+ public function description()
+ {
+ return 'Add additional field to table object_contentmodules';
+ }
+
+ public function up()
+ {
+ DBManager::get()->execute(
+ "ALTER TABLE `object_contentmodules`
+ ADD `object_type` VARCHAR(32) NOT NULL DEFAULT '' AFTER `module_type`,
+ ADD `object_parent_id` VARCHAR(32) NOT NULL DEFAULT '' AFTER `object_type`,
+ ADD `object_parent_type` VARCHAR(32) NOT NULL DEFAULT '' AFTER `object_parent_id`"
+ );
+ DBManager::get()->execute(
+ "ALTER TABLE `object_contentmodules`
+ DROP PRIMARY KEY,
+ ADD PRIMARY KEY (`object_id`, `module_id`, `system_type`, `object_parent_id`)"
+ );
+ }
+
+ public function down()
+ {
+ DBManager::get()->execute(
+ "ALTER TABLE `object_contentmodules`
+ DROP PRIMARY KEY,
+ ADD PRIMARY KEY (`object_id`, `module_id`, `system_type`)"
+ );
+ DBManager::get()->execute(
+ "ALTER TABLE `object_contentmodules`
+ DROP `object_type`,
+ DROP `object_parent_id`,
+ DROP `object_parent_type`;"
+ );
+ }
+}
diff --git a/lib/ilias_interface/ConnectedIlias.php b/lib/ilias_interface/ConnectedIlias.php
index 7d8c726..526ea5b 100644
--- a/lib/ilias_interface/ConnectedIlias.php
+++ b/lib/ilias_interface/ConnectedIlias.php
@@ -182,6 +182,7 @@ class ConnectedIlias
'category_create_on_add_module' => false,
'category_to_desktop' => false,
'cat_semester' => '',
+ 'cat_faculty' => '',
'course_semester' => '',
'course_veranstaltungsnummer' => false,
'workgroup_category_name' => '',
@@ -1102,7 +1103,7 @@ class ConnectedIlias
}
$check->execute([Context::getId(), $ref_id, $this->index, $data["type"]]);
if (!$check->fetch()) {
- IliasObjectConnections::setConnection(Context::getId(), $ref_id, $data["type"], $this->index);
+ IliasObjectConnections::setConnection(Context::getId(), $ref_id, $data["type"], $this->index, 'ilias_object', Context::getId(), 'course');
$added++;
}
$found[] = $ref_id . '_' . $data["type"];
@@ -1212,7 +1213,7 @@ class ConnectedIlias
}
// store object connection
if ($ref_id) {
- IliasObjectConnections::setConnection($studip_course_id, $ref_id, $module_type, $this->index);
+ IliasObjectConnections::setConnection($studip_course_id, $ref_id, $module_type, $this->index, 'ilias_object', $studip_course_id, 'course');
return true;
}
return false;
@@ -1272,14 +1273,21 @@ class ConnectedIlias
$crs_id = IliasObjectConnections::getConnectionModuleId($studip_course_id, "crs", $this->index);
$this->soap_client->setCachingStatus(false);
$this->soap_client->clearCache();
+ $institute_ref_id = null;
+ $faculty_ref_id = null;
+ $parent_id = null;
+ $parent_type = '';
if (!$crs_id) {
$course = Course::find($studip_course_id);
// on error use root category
$ref_id = $this->ilias_config['root_category'];
+ $parent_type = 'root_category';
+ $parent_id = 'root_category';
if ($this->ilias_config['cat_semester'] == 'outer') {
// category for semester above institute
- $semester_ref_id = IliasObjectConnections::getConnectionModuleId($course->start_semester->id, 'cat', $this->index);
+ $semester_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->start_semester->id, 'root_category', 'cat', $this->index)
+ ?: IliasObjectConnections::getExactConnectionModuleId($course->start_semester->id, '', 'cat', $this->index);
if (!$semester_ref_id) {
$object_data['title'] = $course->start_semester->name;
$object_data['description'] = sprintf(_('Hier befinden sich die Veranstaltungsdaten zum Semester "%s".'), $course->start_semester->name);
@@ -1288,16 +1296,50 @@ class ConnectedIlias
$semester_ref_id = $this->soap_client->addObject($object_data, $ref_id);
if ($semester_ref_id) {
// store institute category
- IliasObjectConnections::setConnection($course->start_semester->id, $semester_ref_id, 'cat', $this->index);
+ IliasObjectConnections::setConnection($course->start_semester->id, $semester_ref_id, 'cat', $this->index, 'semester', $parent_id, $parent_type);
} else {
$this->error[] = sprintf(_('ILIAS-Kategorie %s konnte nicht angelegt werden.'), $object_data['title']);
}
}
if ($semester_ref_id) {
+ $parent_type = 'semester';
+ $parent_id = $course->start_semester->id;
$ref_id = $semester_ref_id;
- // category for home institute below semester
- if ($course->home_institut) {
- $institute_ref_id = IliasObjectConnections::getConnectionModuleId(md5($course->start_semester->getId() . $course->home_institut->id), 'cat', $this->index);
+ // category for faculty below semester
+ if (!empty($this->ilias_config['cat_faculty'])) {
+ $faculty_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->home_institut->fakultaets_id, $parent_id, 'cat', $this->index)
+ ?: IliasObjectConnections::getExactConnectionModuleId($course->home_institut->fakultaets_id, '', 'cat', $this->index);
+ if ($faculty_ref_id) {
+ $parent_type = 'faculty';
+ $parent_id = $course->home_institut->fakultaets_id;
+ $ref_id = $faculty_ref_id;
+ }
+ }
+ if (
+ !empty($this->ilias_config['cat_faculty'])
+ && empty($faculty_ref_id)
+ && $course->home_institut->id !== $course->home_institut->fakultaets_id
+ ) {
+ $object_data['title'] = $course->home_institut->faculty->name;
+ $object_data['description'] = sprintf(_('Hier befinden sich die Einrichtungen der Stud.IP-Fakultät "%s".'), $course->home_institut->faculty->name);
+ $object_data['type'] = 'cat';
+ $object_data['owner'] = $this->soap_client->LookupUser($this->ilias_config['admin']);
+ $faculty_ref_id = $this->soap_client->addObject($object_data, $ref_id);
+ if ($faculty_ref_id) {
+ // store faculty category
+ IliasObjectConnections::setConnection($course->home_institut->fakultaets_id, $faculty_ref_id, 'cat', $this->index, 'faculty', $parent_id, $parent_type);
+ $parent_type = 'faculty';
+ $parent_id = $course->home_institut->fakultaets_id;
+ $ref_id = $faculty_ref_id;
+ $institute_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->home_institut->id, $parent_id, 'cat', $this->index)
+ ?: IliasObjectConnections::getExactConnectionModuleId($course->home_institut->id, '', 'cat', $this->index);
+ } else {
+ $this->error[] = sprintf(_('ILIAS-Kategorie %s konnte nicht angelegt werden.'), $object_data["title"]);
+ }
+ }
+ $institute_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->home_institut->id, $parent_id, 'cat', $this->index);
+ if (!$institute_ref_id) {
+ $institute_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->home_institut->id, '', 'cat', $this->index);
}
if (!$institute_ref_id) {
$object_data['title'] = $course->home_institut->name;
@@ -1307,19 +1349,48 @@ class ConnectedIlias
$institute_ref_id = $this->soap_client->addObject($object_data, $ref_id);
if ($institute_ref_id) {
// store institute category
- IliasObjectConnections::setConnection(md5($course->start_semester->getId() . $course->home_institut->id), $institute_ref_id, 'cat', $this->index);
+ IliasObjectConnections::setConnection($course->home_institut->id, $institute_ref_id, 'cat', $this->index, 'institute', $parent_id, $parent_type);
}
}
if ($institute_ref_id) {
+ $parent_type = 'institute';
+ $parent_id = $course->home_institut->id;
$ref_id = $institute_ref_id;
} else {
$this->error[] = sprintf(_('ILIAS-Kategorie %s konnte nicht angelegt werden.'), $object_data['title']);
}
}
} elseif ($this->ilias_config['cat_semester'] === 'inner' || $this->ilias_config['cat_semester'] === 'none') {
- // category for home institute
- if ($course->home_institut) {
- $institute_ref_id = IliasObjectConnections::getConnectionModuleId($course->home_institut->id, 'cat', $this->index);
+ // category for faculty and home institute
+ if (!empty($this->ilias_config['cat_faculty'])) {
+ $faculty_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->home_institut->fakultaets_id, 'root_category', 'cat', $this->index)
+ ?: IliasObjectConnections::getExactConnectionModuleId($course->home_institut->fakultaets_id, '', 'cat', $this->index);
+ if ($faculty_ref_id) {
+ $parent_type = 'faculty';
+ $parent_id = $course->home_institut->fakultaets_id;
+ $ref_id = $faculty_ref_id;
+ }
+ } else {
+ $institute_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->home_institut->id, 'root_category', 'cat', $this->index)
+ ?: IliasObjectConnections::getExactConnectionModuleId($course->home_institut->id, '', 'cat', $this->index);
+ }
+ if (!empty($this->ilias_config['cat_faculty']) && empty($faculty_ref_id) && ($course->home_institut->id != $course->home_institut->fakultaets_id)) {
+ $object_data['title'] = $course->home_institut->faculty->name;
+ $object_data['description'] = sprintf(_('Hier befinden sich die Einrichtungen der Stud.IP-Fakultät "%s".'), $course->home_institut->faculty->name);
+ $object_data['type'] = 'cat';
+ $object_data['owner'] = $this->soap_client->LookupUser($this->ilias_config['admin']);
+ $faculty_ref_id = $this->soap_client->addObject($object_data, $ref_id);
+ if ($faculty_ref_id) {
+ // store faculty category
+ IliasObjectConnections::setConnection($course->home_institut->fakultaets_id, $faculty_ref_id, 'cat', $this->index, 'faculty', $parent_id, $parent_type);
+ $parent_type = 'faculty';
+ $parent_id = $course->home_institut->fakultaets_id;
+ $ref_id = $faculty_ref_id;
+ $institute_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->home_institut->id, $parent_id, 'cat', $this->index)
+ ?: IliasObjectConnections::getExactConnectionModuleId($course->home_institut->id, '', 'cat', $this->index);
+ } else {
+ $this->error[] = sprintf(_('ILIAS-Kategorie %s konnte nicht angelegt werden.'), $object_data["title"]);
+ }
}
if (!$institute_ref_id) {
$object_data['title'] = $course->home_institut->name;
@@ -1329,28 +1400,33 @@ class ConnectedIlias
$institute_ref_id = $this->soap_client->addObject($object_data, $ref_id);
if ($institute_ref_id) {
// store institute category
- IliasObjectConnections::setConnection($course->home_institut->id, $institute_ref_id, 'cat', $this->index);
+ IliasObjectConnections::setConnection($course->home_institut->id, $institute_ref_id, 'cat', $this->index, 'institute', $parent_id, $parent_type);
} else {
$this->error[] = sprintf(_('ILIAS-Kategorie %s konnte nicht angelegt werden.'), $object_data["title"]);
}
}
if ($institute_ref_id) {
+ $parent_type = 'institute';
+ $parent_id = $course->home_institut->id;
$ref_id = $institute_ref_id;
if ($this->ilias_config['cat_semester'] === 'inner') {
// category for semester below institute
- $institute_semester_ref_id = IliasObjectConnections::getConnectionModuleId(md5($course->home_institut->id . $course->start_semester->id), 'cat', $this->index);
+ $institute_semester_ref_id = IliasObjectConnections::getExactConnectionModuleId($course->start_semester->id, $course->home_institut->id, 'cat', $this->index)
+ ?: IliasObjectConnections::getExactConnectionModuleId(md5($course->home_institut->id . $course->start_semester->id), '', 'cat', $this->index);
if (!$institute_semester_ref_id) {
$object_data['title'] = $course->start_semester->name;
- $object_data['description'] = sprintf(_('Hier befinden sich die Veranstaltungsdaten zum Semester "%s".'), $course->start_semester->name);
+ $object_data['description'] = sprintf(_('Hier befinden sich die Veranstaltungsdaten zum Semester "%s" in der Einrichtung "%s".'), $course->start_semester->name, $course->home_institut->name);
$object_data['type'] = 'cat';
$object_data['owner'] = $this->soap_client->LookupUser($this->ilias_config['admin']);
- $institute_semester_ref_id= $this->soap_client->addObject($object_data, $ref_id);
+ $institute_semester_ref_id = $this->soap_client->addObject($object_data, $ref_id);
if ($institute_semester_ref_id) {
// store institute category
- IliasObjectConnections::setConnection(md5($course->home_institut->id . $course->start_semester->id), $institute_semester_ref_id, 'cat', $this->index);
+ IliasObjectConnections::setConnection($course->start_semester->id, $institute_semester_ref_id, 'cat', $this->index, 'semester', $parent_id, $parent_type);
}
}
if ($institute_semester_ref_id) {
+ $parent_type = 'semester';
+ $parent_id = $course->start_semester->id;
$ref_id = $institute_semester_ref_id;
} else {
$this->error[] = sprintf(_('ILIAS-Kategorie %s konnte nicht angelegt werden.'), $object_data["title"]);
@@ -1379,7 +1455,7 @@ class ConnectedIlias
$this->error[] = _('ILIAS-Kurs konnte nicht angelegt werden.');
return false;
}
- IliasObjectConnections::setConnection($studip_course_id, $crs_id, 'crs', $this->index);
+ IliasObjectConnections::setConnection($studip_course_id, $crs_id, 'crs', $this->index, 'course', $parent_id, $parent_type);
// Rollen zuordnen
$this->CheckUserCoursePermissions($crs_id);
diff --git a/lib/ilias_interface/IliasModule.php b/lib/ilias_interface/IliasModule.php
index 8d372c3..84336ab 100644
--- a/lib/ilias_interface/IliasModule.php
+++ b/lib/ilias_interface/IliasModule.php
@@ -309,7 +309,7 @@ class IliasModule
function setConnection($seminar_id)
{
$this->is_connected = true;
- return IliasObjectConnections::setConnection($seminar_id, $this->id, $this->module_type, $this->ilias_index);
+ return IliasObjectConnections::setConnection($seminar_id, $this->id, $this->module_type, $this->ilias_index, 'course', '', 'unknown');
}
/**
diff --git a/lib/ilias_interface/IliasObjectConnections.php b/lib/ilias_interface/IliasObjectConnections.php
index 0c6a8a9..56b0d4b 100644
--- a/lib/ilias_interface/IliasObjectConnections.php
+++ b/lib/ilias_interface/IliasObjectConnections.php
@@ -161,18 +161,41 @@ class IliasObjectConnections
}
/**
+ * get module-id
+ *
+ * returns module-id of given connection
+ */
+ public static function getExactConnectionModuleId(
+ string $connection_object_id,
+ string $connection_object_parent_id,
+ string $connection_module_type,
+ string $connection_cms
+ ): string|false {
+ $query = "SELECT module_id
+ FROM object_contentmodules
+ WHERE object_id = ? AND object_parent_id = ? AND system_type = ? AND module_type = ?";
+ return DBManager::get()->fetchColumn($query, [
+ $connection_object_id,
+ $connection_object_parent_id,
+ $connection_cms,
+ $connection_module_type
+ ]);
+ }
+
+ /**
* set connection
*
* sets connection with object
- * @access public
- * @param string $connection_object_id object-id
- * @param string $connection_module_id module-id
- * @param string $connection_module_type module-type
- * @param string $connection_cms system-type
- * @return boolean successful
*/
- public static function setConnection($connection_object_id, $connection_module_id, $connection_module_type, $connection_cms)
- {
+ public static function setConnection(
+ string $connection_object_id,
+ string $connection_module_id,
+ string $connection_module_type,
+ string $connection_cms,
+ string $connection_object_type,
+ string $connection_object_parent_id,
+ string $connection_object_parent_type
+ ): bool {
$query = "SELECT 1
FROM object_contentmodules
WHERE object_id = ? AND module_id = ? AND system_type = ?
@@ -188,25 +211,31 @@ class IliasObjectConnections
if ($check) {
$query = "UPDATE object_contentmodules
- SET module_type = ?, chdate = UNIX_TIMESTAMP()
+ SET module_type = ?, object_type = ?, object_parent_id = ?, object_parent_type = ?, chdate = UNIX_TIMESTAMP()
WHERE object_id = ? AND module_id = ? AND system_type = ?";
$statement = DBManager::get()->prepare($query);
$statement->execute([
$connection_module_type,
+ $connection_object_type,
+ $connection_object_parent_id,
+ $connection_object_parent_type,
$connection_object_id,
$connection_module_id,
$connection_cms
]);
} else {
$query = "INSERT INTO object_contentmodules
- (object_id, module_id, system_type, module_type, mkdate, chdate)
- VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP())";
+ (object_id, module_id, system_type, module_type, object_type, object_parent_id, object_parent_type, mkdate, chdate)
+ VALUES (?, ?, ?, ?, ?, ?, ?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP())";
$statement = DBManager::get()->prepare($query);
$statement->execute([
$connection_object_id,
$connection_module_id,
$connection_cms,
- $connection_module_type
+ $connection_module_type,
+ $connection_object_type,
+ $connection_object_parent_id,
+ $connection_object_parent_type
]);
}
return true;