From a3db0b714259bff6ef756fe7673da55fc32d477b Mon Sep 17 00:00:00 2001 From: Jan Pecha Date: Tue, 14 May 2024 13:53:49 +0200 Subject: [PATCH] MenuControl: added key 'link' to items --- src/MenuControl.php | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/MenuControl.php b/src/MenuControl.php index 6d3e913..1bac207 100644 --- a/src/MenuControl.php +++ b/src/MenuControl.php @@ -129,7 +129,6 @@ public function setIgnoredPages(array $ignoredPages = NULL) */ public function render() { - $items = []; $subTree = $this->findSubTree(); if ($subTree === NULL) { // no subtree => no items @@ -137,7 +136,7 @@ public function render() } $menuPages = $this->navigation->getMenuPages(); - $this->prepareItems($items, $menuPages, $subTree); + $items = $this->prepareItems($menuPages, $subTree); $template = $this->createTemplate(); assert($template instanceof \Nette\Bridges\ApplicationLatte\Template); @@ -153,29 +152,32 @@ public function render() /** - * @param array $items * @param array $menuPages * @param string $subTree * @param int $level - * @return void + * @return array */ private function prepareItems( - array &$items, array $menuPages, $subTree, $level = 0 ) { + $items = []; + foreach ($menuPages as $pageId => $page) { if (isset($this->ignoredPages[$pageId])) { continue; } - if ($page->isChildOf($subTree)) { + if (!$page->isChildOf($subTree)) { + continue; + } $active = FALSE; if ($page->isHomepage()) { @@ -185,17 +187,31 @@ private function prepareItems( $active = $this->navigation->isPageActive($pageId); } - $items[] = [ + $item = [ 'page' => $page, 'active' => $active, 'level' => $level, + 'link' => $page->getLink(), ]; + $subItems = $pageId !== '' ? $this->prepareItems($menuPages, $pageId, $level + 1) : []; + + if ($item['link'] === NULL) { + foreach ($subItems as $subItem) { + if ($subItem['link'] !== NULL) { + $item['link'] = $subItem['link']; + break; + } + } + } + + $items[] = $item; if ($active && ($this->levelLimit === NULL || ($level + 1) < $this->levelLimit)) { - $this->prepareItems($items, $menuPages, $pageId, $level + 1); + $items = array_merge($items, $subItems); } - } } + + return $items; }