public static buildMenuTree ( Cms\Classes\Theme $theme ) : array | ||
$theme | Cms\Classes\Theme | Specifies the current theme. |
return | array | Returns an array containing the page information |
public static function buildMenuTree($theme)
{
if (self::$menuTreeCache !== null) {
return self::$menuTreeCache;
}
$key = self::getMenuCacheKey($theme);
$cached = Cache::get($key, false);
$unserialized = $cached ? @unserialize($cached) : false;
if ($unserialized !== false) {
return self::$menuTreeCache = $unserialized;
}
$menuTree = ['--root-pages--' => []];
$iterator = function ($items, $parent, $level) use(&$menuTree, &$iterator) {
$result = [];
foreach ($items as $item) {
$viewBag = $item->page->viewBag;
$pageCode = $item->page->getBaseFileName();
$pageUrl = Str::lower(RouterHelper::normalizeUrl(array_get($viewBag, 'url')));
$itemData = ['url' => $pageUrl, 'title' => array_get($viewBag, 'title'), 'mtime' => $item->page->mtime, 'items' => $iterator($item->subpages, $pageCode, $level + 1), 'parent' => $parent, 'navigation_hidden' => array_get($viewBag, 'navigation_hidden')];
if ($level == 0) {
$menuTree['--root-pages--'][] = $pageCode;
}
$result[] = $pageCode;
$menuTree[$pageCode] = $itemData;
}
return $result;
};
$pageList = new PageList($theme);
$iterator($pageList->getPageTree(), null, 0);
self::$menuTreeCache = $menuTree;
Cache::put($key, serialize($menuTree), Config::get('cms.parsedPageCacheTTL', 10));
return self::$menuTreeCache;
}
public function onRun() { $url = $this->getRouter()->getUrl(); if (!strlen($url)) { $url = '/'; } $theme = Theme::getActiveTheme(); $router = new Router($theme); $page = $router->findByUrl($url); if ($page) { $tree = StaticPageClass::buildMenuTree($theme); $code = $startCode = $page->getBaseFileName(); $breadcrumbs = []; while ($code) { if (!isset($tree[$code])) { continue; } $pageInfo = $tree[$code]; if ($pageInfo['navigation_hidden']) { $code = $pageInfo['parent']; continue; } $reference = new MenuItemReference(); $reference->title = $pageInfo['title']; $reference->url = URL::to($pageInfo['url']); $reference->isActive = $code == $startCode; $breadcrumbs[] = $reference; $code = $pageInfo['parent']; } $breadcrumbs = array_reverse($breadcrumbs); $this->breadcrumbs = $this->page['breadcrumbs'] = $breadcrumbs; } }