Fixed page locations to include all parents
authorAlexander Ebert <ebert@woltlab.com>
Fri, 22 Jul 2016 10:03:05 +0000 (12:03 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Fri, 22 Jul 2016 10:03:05 +0000 (12:03 +0200)
wcfsetup/install/files/lib/system/breadcrumb/Breadcrumbs.class.php
wcfsetup/install/files/lib/system/page/PageLocationManager.class.php

index 6b53b27b23fbeeb2de3d5ea8210101ecaea3bcc3..5cd27c98f44aed50aed87a3e69ff1006cca18a18 100644 (file)
@@ -87,28 +87,6 @@ class Breadcrumbs extends SingletonFactory implements \Countable, \Iterator {
                // by all relevant ancestors, but breadcrumbs appear in the reverse order
                $locations = array_reverse($locations);
                
-               // use the top-most location to find the path up to the very top of
-               // the page order
-               if (!empty($locations)) {
-                       $location = $locations[0];
-                       
-                       if ($location['pageID']) {
-                               $page = PageCache::getInstance()->getPage($location['pageID']);
-                               while ($page !== null && $page->parentPageID) {
-                                       $page = PageCache::getInstance()->getPage($page->parentPageID);
-                                       
-                                       array_unshift($locations, [
-                                               'identifier' => $page->identifier,
-                                               'link' => $page->getLink(),
-                                               'pageID' => $page->pageID,
-                                               'pageObjectID' => 0,
-                                               'title' => $page->getTitle(),
-                                               'useAsParentLocation' => false
-                                       ]);
-                               }
-                       }
-               }
-               
                // add the landing page as first location, unless it is already included
                $landingPage = PageCache::getInstance()->getLandingPage();
                $addLandingPage = true;
index 0790f15309c489fd00494c3839593d68c0b9450e..ee0ed7e69ee197b55f9531c5cc432b562b58a271 100644 (file)
@@ -16,6 +16,12 @@ use wcf\system\SingletonFactory;
  * @since      3.0
  */
 class PageLocationManager extends SingletonFactory {
+       /**
+        * true if all parents of the highest page have been added
+        * @var boolean
+        */
+       protected $addedParentLocations = false;
+       
        /**
         * list of locations with descending priority
         * @var array
@@ -108,6 +114,37 @@ class PageLocationManager extends SingletonFactory {
         * @return      array
         */
        public function getLocations() {
+               if (!$this->addedParentLocations) {
+                       $this->addParents();
+                       
+                       $this->addedParentLocations = true;
+               }
+               
                return $this->stack;
        }
+       
+       /**
+        * Adds all parents as defined through the page configuration.
+        */
+       protected function addParents() {
+               if (!empty($this->stack)) {
+                       $location = end($this->stack);
+                       
+                       if ($location['pageID']) {
+                               $page = PageCache::getInstance()->getPage($location['pageID']);
+                               while ($page !== null && $page->parentPageID) {
+                                       $page = PageCache::getInstance()->getPage($page->parentPageID);
+                                       
+                                       $this->stack[] = [
+                                               'identifier' => $page->identifier,
+                                               'link' => $page->getLink(),
+                                               'pageID' => $page->pageID,
+                                               'pageObjectID' => 0,
+                                               'title' => $page->getTitle(),
+                                               'useAsParentLocation' => false
+                                       ];
+                               }
+                       }
+               }
+       }
 }