aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schröder, M. A. <schroeder@data-quest.de>2024-12-20 10:55:36 +0000
committerThomas Hackl <hackl@data-quest.de>2024-12-20 10:55:36 +0000
commit02990f73bd61f7dbccd9ca9971d1aee72130d8e1 (patch)
treee25db36936efb4a4b0126b7b15132f9f326540f6
parent0cdee342af4632ba305236591dede586c7b20282 (diff)
Resolve "Anzeige von ILIAS-Kursen auf "Mein Arbeitsplatz""
Closes #4264 Merge request studip/studip!3367
-rw-r--r--app/controllers/admin/ilias_interface.php13
-rw-r--r--app/controllers/my_ilias_accounts.php127
-rw-r--r--app/views/admin/ilias_interface/edit_interface_settings.php6
-rw-r--r--app/views/my_ilias_accounts/my_courses.php62
-rw-r--r--app/views/my_ilias_accounts/view_course.php11
-rw-r--r--lib/ilias_interface/ConnectedIlias.php21
-rw-r--r--lib/ilias_interface/IliasSoap.php74
-rw-r--r--lib/ilias_interface/studip_referrer_7x.php4
-rw-r--r--lib/ilias_interface/studip_referrer_8x.php4
-rw-r--r--lib/modules/IliasInterfaceModule.php14
10 files changed, 320 insertions, 16 deletions
diff --git a/app/controllers/admin/ilias_interface.php b/app/controllers/admin/ilias_interface.php
index 9399a63..543324e 100644
--- a/app/controllers/admin/ilias_interface.php
+++ b/app/controllers/admin/ilias_interface.php
@@ -95,12 +95,13 @@ class Admin_IliasInterfaceController extends AuthenticatedController
public function save_interface_settings_action()
{
if (Request::submitted('submit')) {
- $this->ilias_interface_config['edit_moduletitle'] = (boolean)Request::get('ilias_interface_edit_moduletitle');
- $this->ilias_interface_config['show_offline'] = (boolean)Request::get('ilias_interface_show_offline');
- $this->ilias_interface_config['search_active'] = (boolean)Request::get('ilias_interface_search_active');
- $this->ilias_interface_config['show_tools_page'] = (boolean)Request::get('ilias_interface_show_tools_page');
- $this->ilias_interface_config['add_statusgroups'] = (boolean)Request::get('ilias_interface_add_statusgroups');
- $this->ilias_interface_config['cache'] = (boolean)Request::get('ilias_interface_cache');
+ $this->ilias_interface_config['edit_moduletitle'] = Request::bool('ilias_interface_edit_moduletitle', false);
+ $this->ilias_interface_config['show_offline'] = Request::bool('ilias_interface_show_offline', false);
+ $this->ilias_interface_config['search_active'] = Request::bool('ilias_interface_search_active', false);
+ $this->ilias_interface_config['show_course_paths'] = Request::bool('ilias_interface_show_course_paths', false);
+ $this->ilias_interface_config['show_tools_page'] = Request::bool('ilias_interface_show_tools_page', false);
+ $this->ilias_interface_config['add_statusgroups'] = Request::bool('ilias_interface_add_statusgroups', false);
+ $this->ilias_interface_config['cache'] = Request::bool('ilias_interface_cache', false);
$this->ilias_interface_config['allow_change_course'] = Request::get('ilias_interface_allow_change_course');
$this->ilias_interface_config['allow_add_own_course'] = Request::get('ilias_interface_allow_add_own_course');
diff --git a/app/controllers/my_ilias_accounts.php b/app/controllers/my_ilias_accounts.php
index 84060ac..2501382 100644
--- a/app/controllers/my_ilias_accounts.php
+++ b/app/controllers/my_ilias_accounts.php
@@ -44,9 +44,9 @@ class MyIliasAccountsController extends AuthenticatedController
*/
public function index_action()
{
- Navigation::activateItem('/contents/my_ilias_accounts');
+ Navigation::activateItem('/contents/my_ilias_accounts/my_accounts');
- PageLayout::setTitle(_('ILIAS-Schnittstelle'));
+ PageLayout::setTitle(_('Meine Lernobjekte und Accounts'));
$this->ilias_list = [];
foreach (Config::get()->ILIAS_INTERFACE_SETTINGS as $ilias_index => $ilias_config) {
@@ -72,6 +72,111 @@ class MyIliasAccountsController extends AuthenticatedController
}
/**
+ * Shows ilias courses for active user
+ */
+ public function my_courses_action()
+ {
+ Navigation::activateItem('/contents/my_ilias_accounts/my_courses');
+
+ PageLayout::setTitle(_('Meine ILIAS-Kurse'));
+
+ if (Semester::exists(Request::option('sem_select'))) {
+ $this->selected_semester = Request::option('sem_select');
+ } else {
+ $this->selected_semester = '';
+ }
+
+ // set up connected ilias classes
+ $this->ilias_list = [];
+ foreach (Config::get()->ILIAS_INTERFACE_SETTINGS as $ilias_index => $ilias_config) {
+ if ($ilias_config['is_active']) {
+ $this->ilias_list[$ilias_index] = new ConnectedIlias($ilias_index);
+ $this->ilias_list[$ilias_index]->checkUser();
+ $this->ilias_list[$ilias_index]->soap_client->clearCache();
+ }
+ }
+
+ if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) {
+ // get semesters and set up filter widget
+ $semesters = new SimpleCollection(Semester::getAll());
+ $semesters = $semesters->orderBy('beginn desc');
+ $current_semester = Semester::findCurrent()->id;
+
+ $widget = new SelectWidget(_('Semesterfilter'), $this->url_for('my_ilias_accounts/my_courses'), 'sem_select');
+ $widget->setMaxLength(50);
+
+ $sem_entries = [
+ $current_semester => _('Aktuelles Semester'),
+ '' => _('Alle Semester')
+ ];
+ foreach ($sem_entries as $key => $label) {
+ $widget->addElement(new SelectElement($key, $label, $this->selected_semester === $key));
+ }
+
+ foreach ($semesters as $key => $semester_entry) {
+ $widget->addElement(new SelectElement($key, $semester_entry->name, $this->selected_semester === $key));
+ }
+ $this->sidebar->addWidget($widget);
+ }
+
+ $widget = new ActionsWidget();
+ foreach ($this->ilias_list as $ilias_list_index => $ilias) {
+ if ($GLOBALS['perm']->have_perm('autor')) {
+ $widget->addLink(
+ sprintf(_('Zur %s-Startseite'), $ilias->getName()),
+ $this->url_for('my_ilias_accounts/redirect/' . $ilias_list_index . '/login'),
+ Icon::create('link-extern'),
+ ['target' => '_blank', 'rel' => 'noopener noreferrer']
+ );
+
+ // fetch connected course ids for user
+ $this->connected_courses_list[$ilias_list_index] = $ilias->getConnectedCoursesForUser($ilias->user->studip_id);
+
+ // fetch ilias courses for user
+ $member_courses = $ilias->soap_client->getCoursesForUserStatus($ilias->user->id, 1);
+ $tutor_courses = $ilias->soap_client->getCoursesForUserStatus($ilias->user->id, 2);
+ $admin_courses = $ilias->soap_client->getCoursesForUserStatus($ilias->user->id, 4);
+ $this->courses_list[$ilias_list_index] = $member_courses + $tutor_courses + $admin_courses;
+
+ // add paths and studip objects
+ foreach ($this->courses_list[$ilias_list_index] as $crs_id => $course_data) {
+ $this->courses_list[$ilias_index][$crs_id]['studip_object'] = '';
+ if (
+ array_key_exists($ilias_list_index, $this->connected_courses_list)
+ && array_key_exists($crs_id, $this->connected_courses_list[$ilias_list_index])
+ ) {
+ $this->courses_list[$ilias_index][$crs_id]['studip_object'] = $this->connected_courses_list[$ilias_list_index][$crs_id];
+ }
+
+ // filter offline courses for mere members
+ if (
+ !Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_offline']
+ && !$course_data['online']
+ && !in_array($course_data['status'], [2, 4])
+ ) {
+ unset($this->courses_list[$ilias_list_index][$crs_id]);
+ }
+
+ // filter by semester
+ if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) {
+ $this->courses_list[$ilias_list_index][$crs_id]['path'] = $ilias->soap_client->getPath($crs_id);
+ if (
+ $this->selected_semester
+ && !str_contains(
+ $this->courses_list[$ilias_list_index][$crs_id]['path'],
+ Semester::find($this->selected_semester)->name
+ )
+ ) {
+ unset($this->courses_list[$ilias_list_index][$crs_id]);
+ }
+ }
+ }
+ }
+ }
+ $this->sidebar->addWidget($widget);
+ }
+
+ /**
* View ILIAS module Details
* @param $index Index of ILIAS installation
* @param $module_id module ID
@@ -90,6 +195,24 @@ class MyIliasAccountsController extends AuthenticatedController
}
/**
+ * View ILIAS course details
+ * @param $index Index of ILIAS installation
+ * @param $crs_id course ID
+ */
+ public function view_course_action($index, $crs_id)
+ {
+ $this->ilias = new ConnectedIlias($index);
+ if ($this->ilias->isActive()) {
+ $this->module = $this->ilias->getModule($crs_id);
+ $this->module->module_type_name = _('ILIAS-Kurs');
+ 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_interface_settings.php b/app/views/admin/ilias_interface/edit_interface_settings.php
index 0e273bc..5936d5e 100644
--- a/app/views/admin/ilias_interface/edit_interface_settings.php
+++ b/app/views/admin/ilias_interface/edit_interface_settings.php
@@ -32,8 +32,12 @@
<span><?= _('Lehrende können einen eigenen ILIAS-Kurs verknüpfen, der noch nicht mit Stud.IP verbunden ist') ?></span>
</label>
<label>
+ <input type="checkbox" name="ilias_interface_show_course_paths" value="1" <?= !empty($ilias_interface_config['show_course_paths']) ? 'checked' : '' ?>>
+ <span><?= _('Die Kursübersicht auf dem Arbeitsplatz zeigt die Magazinpfade der Kurse in ILIAS und erlaubt das Filtern nach Semesternamen') ?></span>
+ </label>
+ <label>
<input type="checkbox" name="ilias_interface_show_tools_page" value="1" <?= !empty($ilias_interface_config['show_tools_page']) ? 'checked' : '' ?>>
- <span><?= _('Account-Seite im Tools-Bereich ist für alle Nutzenden (auch für Studierende ohne Berechtigung zum Anlegen von Lernobjekten) sichtbar') ?></span>
+ <span><?= _('Die Accountübersicht auf dem Arbeitsplatz ist für alle Nutzenden (auch für Studierende ohne Berechtigung zum Anlegen von Lernobjekten) sichtbar') ?></span>
</label>
<label>
<input type="checkbox" name="ilias_interface_search_active" value="1" <?= !empty($ilias_interface_config['search_active']) ? 'checked' : '' ?>>
diff --git a/app/views/my_ilias_accounts/my_courses.php b/app/views/my_ilias_accounts/my_courses.php
new file mode 100644
index 0000000..8b4eb80
--- /dev/null
+++ b/app/views/my_ilias_accounts/my_courses.php
@@ -0,0 +1,62 @@
+<form method="post">
+<? foreach ($ilias_list as $ilias_index => $ilias) : ?>
+ <table class="default">
+ <caption>
+ <?= sprintf(_('Meine Kurse in %s'), htmlReady($ilias->getName())) ?>
+ </caption>
+ <colgroup>
+ <col style="width: 2%">
+ <col>
+ <col style="width: 15%">
+ <col style="width: 15%">
+ <? if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) : ?>
+ <col style="width: 30%">
+ <? endif ?>
+ </colgroup>
+ <thead>
+ <th></th>
+ <th><?= _('Name') ?></th>
+ <th><?= _('Stud.IP-Veranstaltung') ?></th>
+ <th><?= _('Status') ?></th>
+ <? if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) : ?>
+ <th><?= _('Pfad') ?></th>
+ <? endif ?>
+ </thead>
+ <? if (array_key_exists($ilias_index, $courses_list) && count($courses_list[$ilias_index]) > 0) : ?>
+ <? foreach ($courses_list[$ilias_index] as $crs_id => $course) : ?>
+ <tr>
+ <td><?= Icon::create('learnmodule', Icon::ROLE_INFO)->asImg(['title' => _('ILIAS-Kurs')]) ?></td>
+ <td>
+ <? if ($course['online'] || in_array($course['status'], [2, 4])) : ?>
+ <a href="<?= URLHelper::getLink("dispatch.php/my_ilias_accounts/view_course/{$ilias_index}/{$crs_id}")?>" data-dialog=""><?= htmlReady($course['title']) ?></a>
+ <? else : ?>
+ <?= htmlReady($course['title']) ?>
+ <? endif ?>
+ <?= !$course['online'] ? '(' . _('offline') . ')' : '' ?>
+ </td>
+ <td>
+ <? if ($course['studip_object']) : ?>
+ <a href="<?= URLHelper::getLink('dispatch.php/course/basicdata/view', ['cid' => $course['studip_object']]) ?>">
+ <?= Icon::create('seminar')->asImg(['title' => Course::find($course['studip_object'])->Name]) ?>
+ </a>
+ <? endif ?>
+ </td>
+ <td><?= htmlReady($course['status_text'] ?: _('unbekannt')) ?></td>
+ <? if (Config::get()->ILIAS_INTERFACE_BASIC_SETTINGS['show_course_paths']) : ?>
+ <td><?= htmlReady($course['path']) ?></td>
+ <? endif ?>
+ </tr>
+ <? endforeach ?>
+ <? else : ?>
+ <tr>
+ <td colspan="5">
+ <?= sprintf(
+ $selected_semester ? _('Keine Kurse im System %s zum gewählten Filter gefunden.') : _('Sie nehmen im System %s an keinen Kurs teil.'),
+ htmlReady($ilias->getName())
+ )?>
+ </td>
+ </tr>
+ <? endif ?>
+ </table>
+<? endforeach ?>
+</form> \ No newline at end of file
diff --git a/app/views/my_ilias_accounts/view_course.php b/app/views/my_ilias_accounts/view_course.php
new file mode 100644
index 0000000..1685897
--- /dev/null
+++ b/app/views/my_ilias_accounts/view_course.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 Kurs in ILIAS'), $controller->url_for($module->getRoute('start')), ['target' => '_blank', 'rel' => 'noopener noreferrer']) :'' ?>
+ <?= $module->isAllowed('edit') ? Studip\LinkButton::create(_('Kurs 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/lib/ilias_interface/ConnectedIlias.php b/lib/ilias_interface/ConnectedIlias.php
index 0dc1723..a917e1a 100644
--- a/lib/ilias_interface/ConnectedIlias.php
+++ b/lib/ilias_interface/ConnectedIlias.php
@@ -607,6 +607,27 @@ class ConnectedIlias
}
/**
+ * get connected studip courses list for given user
+ *
+ * @param string $user_id Stud.IP user id
+ * @return array course id array
+ */
+ public function getConnectedCoursesForUser(string $user_id): array
+ {
+ $query = 'SELECT module_id, object_id
+ FROM object_contentmodules
+ JOIN seminar_user ON object_contentmodules.object_id = seminar_user.Seminar_id
+ WHERE seminar_user.user_id = ?
+ AND system_type = ?
+ AND module_type = ?';
+ return DBManager::get()->fetchPairs($query, [
+ $user_id,
+ $this->index,
+ 'crs'
+ ]);
+ }
+
+ /**
* get ILIAS path
*
* returns full path for given ILIAS ref ID
diff --git a/lib/ilias_interface/IliasSoap.php b/lib/ilias_interface/IliasSoap.php
index 585595b..9168195 100644
--- a/lib/ilias_interface/IliasSoap.php
+++ b/lib/ilias_interface/IliasSoap.php
@@ -28,7 +28,7 @@ class IliasSoap extends StudipSoapClient
private $user_sid;
private $user_type;
private $soap_cache;
- private $separator_string;
+ public $separator_string;
private $caching_active = false;
@@ -1170,8 +1170,7 @@ class IliasSoap extends StudipSoapClient
*
* returns repository-path to ilias-object
* @access public
- * @param string source_id reference-id
- * @param string target_id reference-id
+ * @param string ref_id reference id
* @return string result
*/
function getPath($ref_id)
@@ -1202,8 +1201,7 @@ class IliasSoap extends StudipSoapClient
* returns repository-path to ilias-object
*
* @access public
- * @param string source_id reference-id
- * @param string target_id reference-id
+ * @param string ref_id reference id
* @return string result
*/
function getRawPath($ref_id)
@@ -1680,6 +1678,72 @@ class IliasSoap extends StudipSoapClient
}
/**
+ * get courses for given user by status
+ *
+ * gets course array for given course data
+ * @access public
+ * @param string $user_id ilias user id
+ * @param string $status MEMBER = 1, TUTOR = 2, ADMIN = 4, OWNER = 8
+ * @return array course array
+ */
+ public function getCoursesForUserStatus(string $user_id, string $status): array
+ {
+ $courses = [];
+ $xmlrs = '<?xml version="1.0" encoding="utf-8"?>
+ <result>
+ <colspecs>
+ <colspec idx="0" name="user_id"/>
+ <colspec idx="1" name="status"/>
+ </colspecs>
+ <rows>
+ <row>
+ <column>'.$user_id.'</column>
+ <column>'.$status.'</column>
+ </row>
+ </rows>
+ </result>';
+ $param = [
+ 'sid' => $this->getSID(),
+ 'parameters' => $xmlrs
+ ];
+ $result = $this->call('getCoursesForUser', $param);
+
+ if ($result) {
+ $s = simplexml_load_string($result);
+ foreach ($s->rows->row as $row) {
+ $ref_id = (string)$row->column[0];
+ $courses[$ref_id] = [];
+ $courses[$ref_id]['title'] = (string)$row->column[2];
+ $s2 = simplexml_load_string((string)$row->column[1]);
+ $courses[$ref_id]['title'] = trim((string)$s2->MetaData->General->Title);
+ $courses[$ref_id]['description'] = trim((string)$s2->MetaData->General->Description);
+ $courses[$ref_id]['status_text'] = '';
+ $courses[$ref_id]['status'] = $status;
+ switch ($status) {
+ case 1:
+ $courses[$ref_id]['status_text'] = _('Kursmitglied');
+ break;
+ case 2:
+ $courses[$ref_id]['status_text'] = _('Kurstutor/-in');
+ break;
+ case 4:
+ $courses[$ref_id]['status_text'] = _('Kursadministrator/-in');
+ break;
+ }
+ if (isset($s2->Settings->Availability->Unlimited)) {
+ $courses[$ref_id]['online'] = 1;
+ } elseif (isset($s2->Settings->Availability->NotAvailable)) {
+ $courses[$ref_id]['online'] = 0;
+ } else {
+ $courses[$ref_id]['online'] = 1;
+ }
+ $courses[$ref_id]['availability'] = $s2->Settings->Availability;
+ }
+ }
+ return $courses;
+ }
+
+ /**
* check reference by title
*
* gets reference id by object id
diff --git a/lib/ilias_interface/studip_referrer_7x.php b/lib/ilias_interface/studip_referrer_7x.php
index e367569..fd62820 100644
--- a/lib/ilias_interface/studip_referrer_7x.php
+++ b/lib/ilias_interface/studip_referrer_7x.php
@@ -107,6 +107,10 @@ if(file_exists("./ilias.ini.php")){
case 'exc':
$base_url = "ilias.php?baseClass=ilExerciseHandlerGUI";
break;
+ case 'cat':
+ case 'crs':
+ $base_url= "ilias.php?baseClass=ilrepositorygui&cmd=edit";
+ break;
case 'webr':
$base_url = "ilias.php?baseClass=ilLinkResourceHandlerGUI";
break;
diff --git a/lib/ilias_interface/studip_referrer_8x.php b/lib/ilias_interface/studip_referrer_8x.php
index f7552af..fc9f66d 100644
--- a/lib/ilias_interface/studip_referrer_8x.php
+++ b/lib/ilias_interface/studip_referrer_8x.php
@@ -107,6 +107,10 @@ if(file_exists("./ilias.ini.php")){
case 'exc':
$base_url = "ilias.php?baseClass=ilExerciseHandlerGUI";
break;
+ case 'cat':
+ case 'crs':
+ $base_url= "ilias.php?baseClass=ilrepositorygui&cmd=edit";
+ break;
case 'webr':
$base_url = "ilias.php?baseClass=ilLinkResourceHandlerGUI";
break;
diff --git a/lib/modules/IliasInterfaceModule.php b/lib/modules/IliasInterfaceModule.php
index 2ab82ad..54a4916 100644
--- a/lib/modules/IliasInterfaceModule.php
+++ b/lib/modules/IliasInterfaceModule.php
@@ -19,10 +19,20 @@ class IliasInterfaceModule extends CorePlugin implements StudipModule, SystemPlu
Navigation::addItem('/admin/config/ilias_interface',
new Navigation(_('ILIAS-Schnittstelle'), 'dispatch.php/admin/ilias_interface'));
}
- if (Seminar_Perm::get()->have_perm('tutor') || (Seminar_Perm::get()->have_perm('autor') && array_key_exists('show_tools_page', $ilias_interface_config) && $ilias_interface_config['show_tools_page'])) {
- $ilias = new Navigation(_('ILIAS'), 'dispatch.php/my_ilias_accounts');
+ if (Seminar_Perm::get()->have_perm('tutor') || Seminar_Perm::get()->have_perm('autor')) {
+ $ilias = new Navigation(_('ILIAS'), 'dispatch.php/my_ilias_accounts/my_courses');
$ilias->setImage(Icon::create('ilias'));
$ilias->setDescription(_('Schnittstelle zu ILIAS'));
+ $ilias->addSubNavigation(
+ 'my_courses',
+ new Navigation(_('Meine Kurse'), 'dispatch.php/my_ilias_accounts/my_courses')
+ );
+ if (!empty($ilias_interface_config['show_tools_page'])) {
+ $ilias->addSubNavigation(
+ 'my_accounts',
+ new Navigation(_('Meine Lernobjekte und Accounts'), 'dispatch.php/my_ilias_accounts')
+ );
+ }
Navigation::addItem('/contents/my_ilias_accounts', $ilias);
}
}