diff --git a/app/controllers/course/contentmodules.php b/app/controllers/course/contentmodules.php index 923c61b9f488d075b7eccbde6cce722064e8279d..df397cdf42fac99909c43e7168da6bb0d1ae9f14 100644 --- a/app/controllers/course/contentmodules.php +++ b/app/controllers/course/contentmodules.php @@ -261,7 +261,12 @@ class Course_ContentmodulesController extends AuthenticatedController } } - PageLayout::setTitle(sprintf(_('Informationen über %s'), $this->metadata['displayname'])); + $this->metadata['icon'] = $this->getIconFromMetadata($this->metadata, $this->plugin); + + PageLayout::setTitle(sprintf( + _('Informationen über %s'), + $this->metadata['displayname'] ?? $this->plugin->getPluginName() + )); } private function getModules(Range $context) @@ -291,6 +296,7 @@ class Course_ContentmodulesController extends AuthenticatedController $visibility = $tool ? $tool->getVisibilityPermission() : 'nobody'; $metadata = $plugin->getMetadata(); + $icon = $this->getIconFromMetadata($metadata, $plugin); $list[$plugin_id] = [ 'id' => $plugin_id, 'moduleclass' => get_class($plugin), @@ -299,7 +305,7 @@ class Course_ContentmodulesController extends AuthenticatedController 'displayname' => $displayname, 'visibility' => $visibility, 'active' => (bool) $tool, - 'icon' => $this->getIconFromMetadata($metadata, $plugin), + 'icon' => $icon ? $icon->asImagePath() : null, 'summary' => $metadata['summary'] ?? null, 'mandatory' => $this->sem_class->isModuleMandatory(get_class($plugin)), 'highlighted' => (bool) $plugin->isHighlighted(), @@ -315,7 +321,7 @@ class Course_ContentmodulesController extends AuthenticatedController * @param array $metadata * @param CorePlugin|StudIPPlugin $plugin */ - private function getIconFromMetadata(array $metadata, $plugin): ?string + private function getIconFromMetadata(array $metadata, $plugin): ?Icon { $icon = $metadata['icon_clickable'] ?? $metadata['icon'] ?? null; @@ -332,7 +338,7 @@ class Course_ContentmodulesController extends AuthenticatedController $icon = Icon::create($plugin->getPluginURL() . '/' . $icon); } - return $icon->copyWithRole(Icon::ROLE_CLICKABLE)->asImagePath(); + return $icon->copyWithRole(Icon::ROLE_CLICKABLE); } private function getCoreIcon(string $path): ?Icon diff --git a/app/views/course/contentmodules/info.php b/app/views/course/contentmodules/info.php index 11bf9dc581a79e51a45be3e88692ae369e6f8fa7..93d3ad9cb68e874defd2aaa338fdabb8f8fa6e00 100644 --- a/app/views/course/contentmodules/info.php +++ b/app/views/course/contentmodules/info.php @@ -5,27 +5,17 @@ <div class="main_part"> <div class="header"> <div class="image"> - <? - if ($metadata['icon']) { - $icon = $metadata['icon'] instanceof Icon - ? $metadata['icon']->asImagePath() - : Icon::create($plugin->getPluginURL().'/'.$metadata['icon'])->asImagePath(); - } else { - $icon = null; - } - if ($icon && !is_a($icon, 'Icon')) { - $icon = Icon::create($icon); - } - ?> - <? if ($icon) : ?> - <?= $icon->asImg(100) ?> - <? endif ?> + <? if ($metadata['icon']): ?> + <?= $metadata['icon']->copyWithRole(Icon::ROLE_INFO)->asImg(100) ?> + <? endif; ?> </div> <div class="text"> <h1><?= htmlReady($metadata['displayname'] ?? $plugin->getPluginName()) ?></h1> + <? if (!empty($metadata['summary'])): ?> <strong> <?= htmlReady($metadata['summary']) ?> </strong> + <? endif; ?> </div> </div> <div class="content-modules-controls-vue-app" is="ContentModulesControl" module_id="<?= htmlReady($plugin->getPluginId()) ?>"></div> diff --git a/lib/classes/PluginAdministration.php b/lib/classes/PluginAdministration.php index 2732f58e6f8c38421f4b96b5e140b742003ce47d..8ac5fa80fceb8725603dc71cd4e3c0769c13adda 100644 --- a/lib/classes/PluginAdministration.php +++ b/lib/classes/PluginAdministration.php @@ -440,12 +440,14 @@ class PluginAdministration // get plugin meta data $pluginclass = $manifest['pluginclassname']; $origin = $manifest['origin']; - $min_version = $manifest['studipMinVersion']; - $max_version = $manifest['studipMaxVersion']; + $min_version = $manifest['studipMinVersion'] ?? null; + $max_version = $manifest['studipMaxVersion'] ?? null; // check for compatible version - if ((isset($min_version) && StudipVersion::olderThan($min_version)) || - (isset($max_version) && StudipVersion::newerThan($max_version))) { + if ( + (isset($min_version) && StudipVersion::olderThan($min_version)) + || (isset($max_version) && StudipVersion::newerThan($max_version)) + ) { throw new PluginInstallationException(_('Das Plugin ist mit dieser Stud.IP-Version nicht kompatibel.')); } @@ -456,7 +458,7 @@ class PluginAdministration $pluginregistered = $plugin_manager->getPluginInfo($pluginclass); if ($pluginregistered) { - new PluginInstallationException(_('Das Plugin ist bereits registriert.')); + throw new PluginInstallationException(_('Das Plugin ist bereits registriert.')); } // create database schema if needed diff --git a/lib/models/OERHostOERSI.php b/lib/models/OERHostOERSI.php index 52e50d35a2b2a335c5316b870b0fae46ce62c6fd..5e539bf04793e1262f34fb18eeb2ed97c2c0ecf7 100644 --- a/lib/models/OERHostOERSI.php +++ b/lib/models/OERHostOERSI.php @@ -76,7 +76,7 @@ class OERHostOERSI extends OERHost $material['difficulty_end'] = 12; $material['uri'] = $material_data['_source']['id']; $material['source_url'] = $material_data['_source']['id']; - $material['content_type'] = $material_data['_source']['encoding'][0]['encodingFormat'] ?: ''; + $material['content_type'] = $material_data['_source']['encoding'][0]['encodingFormat'] ?? ''; $material['license_identifier'] = $this->getLicenseID($material_data['_source']['license']['id']) ?: ''; if (!$material['category']) { $material['category'] = $material->autoDetectCategory(); @@ -86,18 +86,23 @@ class OERHostOERSI extends OERHost 'front_image_url' => $material_data['_source']['image'] ?? null, 'download' => $material_data['_source']['encoding'][0]['contentUrl'] ?: '', 'id' => $material_data['_id'], - 'organization' => $material_data['_source']['sourceOrganization'][0]['name'] ?: $material_data['_source']['publisher'][0]['name'] + 'organization' => $material_data['_source']['sourceOrganization'][0]['name'] ?? $material_data['_source']['publisher'][0]['name'] ?? '', ]; $material->store(); //set users: $userdata = []; - foreach ((array) $material_data['_source']['creator'] as $creator) { - $userdata[] = [ - 'user_id' => md5($creator['name']), - 'name' => $creator['name'], - 'host_url' => $this['url'] - ]; + if ( + isset($material_data['_source']['creator']) + && is_array($material_data['_source']['creator']) + ) { + foreach ($material_data['_source']['creator'] as $creator) { + $userdata[] = [ + 'user_id' => md5($creator['name']), + 'name' => $creator['name'], + 'host_url' => $this['url'] + ]; + } } $material->setUsers($userdata); diff --git a/lib/plugins/core/StudIPPlugin.class.php b/lib/plugins/core/StudIPPlugin.class.php index be2c776b2aed2c9903496bb56eac9748715cfd37..ea5c8ff0d97f890acea9f9edafc6242f9a5bd981 100644 --- a/lib/plugins/core/StudIPPlugin.class.php +++ b/lib/plugins/core/StudIPPlugin.class.php @@ -95,7 +95,7 @@ abstract class StudIPPlugin if (!empty($metadata['description_' . $language])) { return $metadata['description_' . $language]; } - $description = $metadata['descriptionlong'] ?? $metadata['description']; + $description = $metadata['descriptionlong'] ?? $metadata['description'] ?? ''; if ($this->plugin_info['description_mode'] === 'override_description') { return $this->plugin_info['description'];