From 7eac12558e0132568d8b6a09dcac6706f3658b70 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Thu, 29 Aug 2019 18:43:56 +0200 Subject: [PATCH] fix #2963 @1 --- .../Http/Controllers/CubistPageController.php | 5 ++ src/app/Magic/Menu/Item.php | 51 +++++++++++ src/app/Magic/Menu/PageItem.php | 87 ++++++++++++++----- src/app/Magic/Search.php | 4 - 4 files changed, 119 insertions(+), 28 deletions(-) diff --git a/src/app/Http/Controllers/CubistPageController.php b/src/app/Http/Controllers/CubistPageController.php index af12bed..a1110cb 100644 --- a/src/app/Http/Controllers/CubistPageController.php +++ b/src/app/Http/Controllers/CubistPageController.php @@ -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(); diff --git a/src/app/Magic/Menu/Item.php b/src/app/Magic/Menu/Item.php index 8b8097b..53db67c 100644 --- a/src/app/Magic/Menu/Item.php +++ b/src/app/Magic/Menu/Item.php @@ -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 */ diff --git a/src/app/Magic/Menu/PageItem.php b/src/app/Magic/Menu/PageItem.php index d2632a8..c909e4f 100644 --- a/src/app/Magic/Menu/PageItem.php +++ b/src/app/Magic/Menu/PageItem.php @@ -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(); } } diff --git a/src/app/Magic/Search.php b/src/app/Magic/Search.php index 896c5a2..da79f77 100644 --- a/src/app/Magic/Search.php +++ b/src/app/Magic/Search.php @@ -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; -- 2.39.5