diff options
| author | Arne Schröder, M. A. <schroeder@data-quest.de> | 2025-07-04 11:32:39 +0000 |
|---|---|---|
| committer | Rasmus Fuhse <fuhse@data-quest.de> | 2025-07-04 11:32:39 +0000 |
| commit | 382cfd5bbe19abd89805ab48287e0c8d425ac080 (patch) | |
| tree | cd84751573663e71469f5cd1870badd8634afd6c | |
| parent | d98e8f811ee969fc94f922a70ad270ff02d057fc (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.php | 2 | ||||
| -rw-r--r-- | app/controllers/course/ilias_interface.php | 6 | ||||
| -rw-r--r-- | app/views/admin/ilias_interface/edit_content.php | 4 | ||||
| -rw-r--r-- | db/migrations/6.1.7_step_4270.php | 43 | ||||
| -rw-r--r-- | lib/ilias_interface/ConnectedIlias.php | 110 | ||||
| -rw-r--r-- | lib/ilias_interface/IliasModule.php | 2 | ||||
| -rw-r--r-- | lib/ilias_interface/IliasObjectConnections.php | 53 |
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; |
