From a51e4b5b9a8f54b520bb2397ee4470cd72c5c18e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Philipp=20Sch=C3=BCttl=C3=B6ffel?=
 <schuettloeffel@zqs.uni-hannover.de>
Date: Tue, 26 Mar 2024 13:47:37 +0000
Subject: [PATCH] Resolve "Wiki: Hierarchie kaputt bei Seiten ohne parent"

Closes #3904

Merge request studip/studip!2760
---
 app/controllers/course/wiki.php |  6 +++---
 lib/modules/CoreWiki.class.php  | 19 +++++++++----------
 2 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/app/controllers/course/wiki.php b/app/controllers/course/wiki.php
index 2420f1d7ecd..6393d1ca5cf 100644
--- a/app/controllers/course/wiki.php
+++ b/app/controllers/course/wiki.php
@@ -116,7 +116,7 @@ class Course_WikiController extends AuthenticatedController
 
         $startPage = WikiPage::find($this->range->getConfiguration()->WIKI_STARTPAGE_ID);
         $this->contentbar = ContentBar::get()
-            ->setTOC(CoreWiki::getTOC($this->page->parent && $startPage ? $startPage : $this->page, $this->page['name']))
+            ->setTOC(CoreWiki::getTOC($this->page))
             ->setIcon(Icon::create('wiki'))
             ->setInfo(sprintf(
                 _('Version %1$s, geändert von %2$s <br> am %3$s'),
@@ -418,7 +418,7 @@ class Course_WikiController extends AuthenticatedController
         );
         $startPage = WikiPage::find($this->range->getConfiguration()->WIKI_STARTPAGE_ID);
         $this->contentbar = ContentBar::get()
-            ->setTOC(CoreWiki::getTOC($startPage, $page['name']))
+            ->setTOC(CoreWiki::getTOC($page))
             ->setIcon(Icon::create('wiki'))
             ->setInfo(_('Zuletzt gespeichert') .': '. '<studip-date-time :timestamp="Math.floor(lastSaveDate / 1000)" :relative="true"></studip-date-time>');
     }
@@ -609,7 +609,7 @@ class Course_WikiController extends AuthenticatedController
         Sidebar::Get()->addWidget($this->getViewsWidget($version->page, 'history'));
         $startPage = WikiPage::find($this->range->getConfiguration()->WIKI_STARTPAGE_ID);
         $this->contentbar = ContentBar::get()
-            ->setTOC(CoreWiki::getTOC($startPage, $version->page['name']))
+            ->setTOC(CoreWiki::getTOC($version->page))
             ->setIcon(Icon::create('wiki'))
             ->setInfo(sprintf(
                 _('Version %1$s vom %2$s'),
diff --git a/lib/modules/CoreWiki.class.php b/lib/modules/CoreWiki.class.php
index e82fd6582eb..a447451b8e3 100644
--- a/lib/modules/CoreWiki.class.php
+++ b/lib/modules/CoreWiki.class.php
@@ -181,23 +181,22 @@ class CoreWiki extends CorePlugin implements StudipModule
      * Generates a page hierarchy for table of contents/breadcrumbs.
      * @return TOCItem
      */
-    public static function getTOC($startPage, $active_title = null): TOCItem
+    public static function getTOC($page, $first = true): TOCItem
     {
         $root = new TOCItem(
-            ($startPage && ($startPage->isNew() || $startPage->name === 'WikiWikiWeb'))
+            ($page && ($page->isNew() || $page->name === 'WikiWikiWeb'))
             ? _('Wiki-Startseite')
-            : $startPage->name
+            : $page->name
         );
-        $root->setURL(URLHelper::getURL('dispatch.php/course/wiki/page/'.$startPage->id));
-        if ($startPage->name == 'WikiWikiWeb' || $startPage->id == CourseConfig::get($startPage->range_id)->WIKI_STARTPAGE_ID) {
+        $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($root->getTitle() === $active_title);
+        $root->setActive($first);
 
-        foreach ($startPage->children as $child) {
-            $item = self::getTOC($child, $active_title);
-            $item->setActive($item->getTitle() === $active_title);
-            $root->addChild($item);
+        if ($page->parent) {
+            $parent = self::getTOC($page->parent, false);
+            $root->setParent($parent);
         }
 
         return $root;
-- 
GitLab