--- /dev/null
+<?php
+
+namespace Cubist\Backpack\app\Magic;
+
+use Cubist\Backpack\app\Magic\Models\CMSPage;
+use Lavary\Menu\Menu;
+
+class CubistMenu extends Menu
+{
+ public function get($key)
+ {
+ if (!self::exists($key)) {
+ self::makeAllMenus();
+ }
+ return parent::get($key);
+ }
+
+ public static function makeAllMenus()
+ {
+ $tree = CMSPage::getTree();
+ foreach ($tree as $mainKey => $main) {
+ $nav_items = [];
+ foreach ($main['children'] as $name => $item) {
+ $submenus = null;
+
+ $links = [];
+
+ foreach ($item['children'] as $key => $child) {
+ $links[$child['element']->title] = $child['element']->slug;
+ }
+
+ if (count($links) > 0) {
+ $submenus = [['links' => $links]];
+ }
+
+ $s = ['url' => $item['element']->slug];
+ if (null !== $submenus) {
+ $s['submenus'] = $submenus;
+ }
+
+ $nav_items[$item['element']->title] = $s;
+ }
+
+ \Menu::make($mainKey, function ($menu) use ($nav_items) {
+
+ foreach ($nav_items as $nav_label => $nav_item) {
+
+ $parent = $menu->add($nav_label, $nav_item['url']);
+
+ // Handle items with submenus
+ if (isset($nav_item['submenus'])) {
+
+ foreach ($nav_item['submenus'] as $submenu_data) {
+
+ // Create an empty sub-element that will serve as a wrapper for the submenu(s)
+ $wrapper = $parent->raw('')->attr(['class' => 'nav-submenu-wrapper']);
+
+ // Some submenus have a title element
+ if (isset($submenu_data['title'])) {
+ $wrapper->raw($submenu_data['title'])->attr(['class' => 'nav-submenu-title']);
+ }
+
+ foreach ($submenu_data['links'] as $label => $url) {
+ $wrapper->add($label, $url);
+ }
+ }
+ }
+
+ }
+
+ });
+ }
+
+
+ if ($mainKey == '#main') {
+ // Also make a menu for the breadcrumbs - this one is simpler and doesn't have the submenu headings
+ \Menu::make('breadcrumbs', function ($menu) use ($nav_items) {
+
+ // Start with home link
+ $menu = $menu->add('Home', '');
+
+ foreach ($nav_items as $nav_label => $nav_item) {
+
+ $parent = $menu->add($nav_label, $nav_item['url']);
+
+ // Handle items with submenus
+ if (isset($nav_item['submenus'])) {
+
+ foreach ($nav_item['submenus'] as $submenu_data) {
+ foreach ($submenu_data['links'] as $label => $url) {
+ $parent->add($label, $url);
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+}