]> _ Git - cubist_cms-back.git/commitdiff
fix #2963 @1
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 29 Aug 2019 16:43:56 +0000 (18:43 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 29 Aug 2019 16:43:56 +0000 (18:43 +0200)
src/app/Http/Controllers/CubistPageController.php
src/app/Magic/Menu/Item.php
src/app/Magic/Menu/PageItem.php
src/app/Magic/Search.php

index af12bed199e73173c900c7da2f94886ac0fbd5b3..a1110cbe69baf4088c86dbcabd5e872da16ca82f 100644 (file)
@@ -5,6 +5,7 @@ namespace Cubist\Backpack\app\Http\Controllers;
 use Cubist\Backpack\app\Magic\Menu\Menu;
 use Cubist\Backpack\app\Magic\Models\CMSPage;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Redirect;
 use Illuminate\Support\Str;
 
 class CubistPageController extends CubistFrontController
@@ -49,6 +50,10 @@ class CubistPageController extends CubistFrontController
             $nav = Menu::getNavigation();
             $item = $nav->findItemWithURL($path);
             if (null === $item) {
+                $redirectItem = $nav->findOneWithAlias($path);
+                if (null !== $redirectItem) {
+                    return Redirect::to('/' . $redirectItem->getHref(), 301);
+                }
                 $this->_404();
             }
             $c = $item->getController();
index 8b8097b3e02e0b5da77e88b16370f4edd8d3e93c..53db67ca657df572d76b60ca1313b1a7d3840a0e 100644 (file)
@@ -60,6 +60,11 @@ class Item
      */
     protected $_breadcrumbs = true;
 
+    /**
+     * @var array
+     */
+    protected $_urlAliases = [];
+
 
     /**
      * @param string $id
@@ -182,6 +187,36 @@ class Item
         return $res;
     }
 
+    public function findAllWithAlias($href)
+    {
+        $res = [];
+        if (in_array($href, $this->getUrlAliases())) {
+            $res[] = $this;
+        }
+        foreach ($this->getChildren() as $child) {
+            $res = array_merge($res, $child->findAllWithAlias($href));
+        }
+
+        return $res;
+    }
+
+    public function findOneWithAlias($href)
+    {
+        if (in_array($href, $this->getUrlAliases())) {
+            return $this;
+        }
+        if (!$this->hasChildren()) {
+            return null;
+        }
+        foreach ($this->getChildren() as $child) {
+            $res = $child->findOneWithAlias($href);
+            if (null !== $res) {
+                return $res;
+            }
+        }
+        return null;
+    }
+
     public function findItemWithURL($href)
     {
         foreach ($this->findAllBy('href', $href) as $item) {
@@ -405,6 +440,22 @@ class Item
         return $this->_breadcrumbs;
     }
 
+    /**
+     * @return array
+     */
+    public function getUrlAliases(): array
+    {
+        return $this->_urlAliases;
+    }
+
+    /**
+     * @param array $urlAliases
+     */
+    public function setUrlAliases(array $urlAliases): void
+    {
+        $this->_urlAliases = $urlAliases;
+    }
+
     /**
      * @param $menu Menu
      */
index d2632a88f2f52716d34b12e0c3a20d47a72ca92b..c909e4f1af740e243f398bb654828d79a3929f4f 100644 (file)
@@ -5,61 +5,97 @@ namespace Cubist\Backpack\app\Magic\Menu;
 
 
 use Cubist\Backpack\app\Magic\Models\CMSPage;
+use Cubist\Backpack\app\Magic\Models\CubistMagicPageModel;
 
 class PageItem extends Item
 {
     /**
-     * @var CMSPage
+     * @var CubistMagicPageModel
      */
     protected $_page;
 
+
     /**
-     * @param $page CMSPage
-     * @param $all CMSPage[]
+     * @param $page CubistMagicPageModel
+     * @param $all CubistMagicPageModel[]
      */
     public function initFromPage($page, $all)
     {
-        $this->setPage($page);
-        $this->setId($page->id);
-        $this->setName($page->name);
-        $this->setSlug($page->slug);
-        $this->setTitle($page->title);
+        $this->initFromEntity($page);
         $this->setChildrenFromData($all, $this->getId());
         $this->setChildrenFromTemplate();
     }
 
+    /**
+     * @param $entity CubistMagicPageModel
+     */
+    public function initFromEntity($entity)
+    {
+        $this->setPage($entity);
+        $this->setId($entity->id);
+        $this->setName($entity->name ?? get_class($entity) . '_' . $entity->id);
+        $this->setSlug($entity->slug);
+        $this->setTitle($entity->title);
+        $dbaliases = $entity->getPageData()->url_alias;
+        if (is_array($dbaliases)) {
+            $aliases = [];
+            foreach ($dbaliases as $dbalias) {
+                $aliases[] = ltrim($dbalias['url'],'/');
+            }
+            $this->setURLAliases(array_unique(array_values($aliases)));
+        }
+    }
+
     public function setChildrenFromTemplate()
     {
-        $template = $this->getPage()->getUsedTemplate();
-        $template->setMenuChildren($this);
+        if ($this->getPage() instanceof CMSPage) {
+            $template = $this->getPage()->getUsedTemplate();
+            $template->setMenuChildren($this);
+        }
+    }
+
+    public function getTemplate()
+    {
+        if ($this->getPage() instanceof CMSPage) {
+            return $this->getPage()->template;
+        }
+        return false;
     }
 
     public function getHref()
     {
-        if ($this->getPage()->template == 'first_redirection' && $this->hasChildren()) {
+        if ($this->getTemplate() == 'first_redirection' && $this->hasChildren()) {
             return $this->getChildren()[0]->getHref();
-        } else if ($this->getPage()->template == 'internal_redirection') {
+        } else if ($this->getTemplate() == 'internal_redirection') {
 
-        } else if ($this->getPage()->template == 'redirection') {
+        } else if ($this->getTemplate() == 'redirection') {
             return $this->navigation;
         }
 
-        if ($this->getPage()->getUsedTemplate()->isVirtual()) {
+        if ($this->isVirtual()) {
             return '#';
         }
 
         return $this->getSlug();
     }
 
+    public function isVirtual()
+    {
+        if ($this->getPage() instanceof CMSPage) {
+            return $this->getPage()->getUsedTemplate()->isVirtual();
+        }
+        return false;
+    }
+
     public function getBreadcrumbHref()
     {
-        if ($this->getPage()->template == 'first_redirection' && $this->hasChildren()) {
+        if ($this->getTemplate() == 'first_redirection' && $this->hasChildren()) {
             return '#';
-        } else if ($this->getPage()->template == 'internal_redirection') {
+        } else if ($this->getTemplate() == 'internal_redirection') {
             return '#';
-        } else if ($this->getPage()->template == 'redirection') {
+        } else if ($this->getTemplate() == 'redirection') {
             return '#';
-        } else if ($this->getPage()->getUsedTemplate()->isVirtual()) {
+        } else if ($this->isVirtual()) {
             return '#';
         }
 
@@ -69,24 +105,24 @@ class PageItem extends Item
     public function getClasses()
     {
         $classes = parent::getClasses();
-        if ($this->getPage()->getUsedTemplate()->isVirtual()) {
+        if ($this->isVirtual()) {
             $classes[] = 'nav-virtual';
         }
         return $classes;
     }
 
     /**
-     * @param CMSPage $page
+     * @param CubistMagicPageModel $page
      */
-    public function setPage(CMSPage $page): void
+    public function setPage(CubistMagicPageModel $page): void
     {
         $this->_page = $page;
     }
 
     /**
-     * @return CMSPage
+     * @return CubistMagicPageModel|null
      */
-    public function getPage(): CMSPage
+    public function getPage()
     {
         return $this->_page;
     }
@@ -96,6 +132,9 @@ class PageItem extends Item
      */
     public function getController(): array
     {
-        return ['controller' => 'PageController', 'action' => 'index', 'params' => ['slug' => $this->getSlug()]];
+        if (!$this->_controller) {
+            return ['controller' => 'PageController', 'action' => 'index', 'params' => ['slug' => $this->getSlug()]];
+        }
+        return parent::getController();
     }
 }
index 896c5a253c51f7956f6b31cdca7b935e633298dd..da79f7725a3f57bbcba9a84c5d0460ac9d1d6ca7 100644 (file)
@@ -3,10 +3,6 @@
 namespace Cubist\Backpack\app\Magic;
 
 use Cubist\Backpack\app\Magic\Menu\Menu;
-use Cubist\Backpack\app\Magic\Menu\PageItem;
-use Cubist\Backpack\app\Magic\Menu\VirtualItem;
-use Cubist\Backpack\app\Template\Navigation;
-use Cubist\Backpack\app\Template\Redirection;
 use Cubist\Util\XML\DOMSelector;
 use Cviebrock\LaravelElasticsearch\Facade as Elasticsearch;