diff options
| author | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
|---|---|---|
| committer | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
| commit | 4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch) | |
| tree | 5c07151ae61276d334e88f6309c30d439a85c12e /lib/modules/CoreWiki.php | |
| parent | da0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff) | |
| parent | 97a188592c679890a25c37ab78463add76a52ff7 (diff) | |
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/modules/CoreWiki.php')
| -rw-r--r-- | lib/modules/CoreWiki.php | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/lib/modules/CoreWiki.php b/lib/modules/CoreWiki.php new file mode 100644 index 0000000..a447451 --- /dev/null +++ b/lib/modules/CoreWiki.php @@ -0,0 +1,205 @@ +<?php + +/* + * Copyright (c) 2012 Rasmus Fuhse <fuhse@data-quest.de> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + */ + +class CoreWiki extends CorePlugin implements StudipModule +{ + /** + * {@inheritdoc} + */ + public function getIconNavigation($range_id, $last_visit, $user_id) + { + if (!Config::get()->WIKI_ENABLE) { + return null; + } + $perm = $GLOBALS['perm']->get_perm($user_id); + if (in_array($perm, ['admin', 'root'])) { + $perm = 'dozent'; + } + + $statement = DBManager::get()->prepare(" + SELECT `wiki_pages`.`page_id` + FROM `wiki_pages` + LEFT JOIN `statusgruppe_user` ON (`statusgruppe_user`.`statusgruppe_id` = `wiki_pages`.`read_permission`) + WHERE `wiki_pages`.`range_id` = :range_id + AND ( + `wiki_pages`.`read_permission` = 'all' + OR `statusgruppe_user`.`user_id` = :user_id + OR `wiki_pages`.`read_permission` = :perm + OR (`wiki_pages`.`read_permission` = 'tutor' AND :perm = 'dozent') + ) + "); + + $statement->execute([ + 'range_id' => $range_id, + 'user_id' => $user_id, + 'perm' => $perm + ]); + $wiki_page_ids = $statement->fetchAll(PDO::FETCH_COLUMN); + if (count($wiki_page_ids) === 0) { + return null; + } + + $visit_date = object_get_visit($range_id, $this->getPluginId(), 'visitdate') ?? $last_visit; + + $statement = DBManager::get()->prepare(" + SELECT COUNT(*) AS `neue` + FROM `wiki_pages` + WHERE `wiki_pages`.`page_id` IN (:page_ids) + AND `wiki_pages`.`chdate` > :threshold + AND `wiki_pages`.`user_id` != :user_id + "); + $statement->execute([ + 'page_ids' => $wiki_page_ids, + 'threshold' => $visit_date, + 'user_id' => $user_id, + ]); + $new_pages = $statement->fetch(PDO::FETCH_COLUMN, 0); + + $nav = new Navigation(_('Wiki')); + if ($new_pages > 0) { + $nav->setURL('dispatch.php/course/wiki/newpages'); + $nav->setImage(Icon::create('wiki', Icon::ROLE_ATTENTION, [ + 'title' => sprintf( + ngettext( + '%d Wiki-Seite', + '%d Wiki-Seiten', + count($wiki_page_ids) + ), + count($wiki_page_ids) + ) + . ', ' + . sprintf( + ngettext( + '%d Änderung', + '%d Änderungen', + $new_pages + ), + $new_pages + ) + ])); + $nav->setBadgeNumber($new_pages); + } else { + $nav->setURL('dispatch.php/course/wiki/page'); + $nav->setImage(Icon::create('wiki', Icon::ROLE_CLICKABLE, [ + 'title' => sprintf( + ngettext( + '%d Wiki-Seite', + '%d Wiki-Seiten', + count($wiki_page_ids) + ), + count($wiki_page_ids) + ) + ])); + } + return $nav; + } + + /** + * {@inheritdoc} + */ + public function getTabNavigation($range_id) + { + if (!Config::get()->WIKI_ENABLE) { + return null; + } + + $navigation = new Navigation(_('Wiki')); + $navigation->setImage(Icon::create('wiki', Icon::ROLE_INFO_ALT)); + $navigation->setActiveImage(Icon::create('wiki', Icon::ROLE_INFO)); + + $navigation->addSubNavigation('start', new Navigation(_('Wiki-Startseite'), 'dispatch.php/course/wiki/page')); + if (WikiPage::countBySQL('`range_id` = ?', [$range_id]) > 0) { + $navigation->addSubNavigation('listnew', new Navigation(_('Neue Seiten'), 'dispatch.php/course/wiki/newpages')); + $navigation->addSubNavigation('allpages', new Navigation(_('Alle Seiten'), 'dispatch.php/course/wiki/allpages')); + } + return ['wiki' => $navigation]; + } + + /** + * {@inheritdoc} + */ + public function getMetadata() + { + return [ + 'summary' => _('Gemeinsames Erstellen und Bearbeiten von Texten'), + 'description' => _('Im Wiki können '. + 'verschiedene Autor/-innen gemeinsam Texte, Konzepte und andere '. + 'schriftliche Arbeiten erstellen und gestalten, dies '. + 'allerdings nicht gleichzeitig. Texte können individuell '. + 'bearbeitet und die Änderungen gespeichert werden. Das '. + 'Besondere im Wiki ist, dass Studierende und Lehrende '. + 'annähernd die gleichen Rechte (schreiben, lesen, ändern, '. + 'löschen) haben, was sich nicht einschränken lässt. Das '. + 'System erstellt eine Versionshistorie, mit der Änderungen '. + 'nachvollziehbar werden. Einzelne Versionen können zudem '. + 'auch gelöscht werden (nur Lehrende). Ein Export als '. + 'pdf-Datei ist integriert.'), + + 'displayname' => _('Wiki-Web'), + 'keywords' => _('Individuelle Bearbeitung von Texten; + Versionshistorie; + Druckansicht und PDF-Export; + Löschfunktion für die aktuellste Seiten-Version; + Keine gleichzeitige Bearbeitung desselben Textes möglich, nur nacheinander'), + 'descriptionshort' => _('Gemeinsames asynchrones Erstellen und Bearbeiten von Texten'), + 'descriptionlong' => _('Im Wiki können verschiedene Autor/-innen gemeinsam Texte, '. + 'Konzepte und andere schriftliche Arbeiten erstellen und gestalten. Dies '. + 'allerdings nicht gleichzeitig. Texte können individuell bearbeitet und '. + 'gespeichert werden. Das Besondere im Wiki ist, dass Studierende und Lehrende '. + 'annähernd die gleichen Rechte (schreiben, lesen, ändern, löschen) haben, was '. + 'gegenseitiges Vertrauen voraussetzt. Das System erstellt eine Versionshistorie, '. + 'mit der Änderungen nachvollziehbar werden. Einzelne Versionen können zudem auch '. + 'gelöscht werden (nur Lehrende). Eine Druckansicht und eine Exportmöglichkeit als '. + 'PDF-Datei ist integriert.'), + 'category' => _('Kommunikation und Zusammenarbeit'), + 'icon' => Icon::create('wiki', Icon::ROLE_INFO), + 'icon_clickable' => Icon::create('wiki', Icon::ROLE_CLICKABLE), + 'screenshots' => [ + 'path' => 'assets/images/plus/screenshots/Wiki-Web', + 'pictures' => [ + 0 => [ 'source' => 'Gemeinsam_erstellte_Texte.jpg', 'title' => 'Gemeinsam erstellte Texte'] + ] + ] + ]; + } + + public function getInfoTemplate($course_id) + { + return null; + } + + + /** + * Generates a page hierarchy for table of contents/breadcrumbs. + * @return TOCItem + */ + public static function getTOC($page, $first = true): TOCItem + { + $root = new TOCItem( + ($page && ($page->isNew() || $page->name === 'WikiWikiWeb')) + ? _('Wiki-Startseite') + : $page->name + ); + $root->setURL(URLHelper::getURL('dispatch.php/course/wiki/page/'.$page->id)); + if ($page->name == 'WikiWikiWeb' || $page->id == CourseConfig::get($page->range_id)->WIKI_STARTPAGE_ID) { + $root->setIcon(Icon::create('wiki')); + } + $root->setActive($first); + + if ($page->parent) { + $parent = self::getTOC($page->parent, false); + $root->setParent($parent); + } + + return $root; + } + +} |
