HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/groendesignkoencox/groendesign-koencox.be/app/Composers/SidebarMenuComposer.php
<?php namespace App\Composers;

use App\Buttons\Models\Button;
use App\WebsiteConfig\Model\WebsiteConfig;
use Cassandra\Index;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use Komma\KMS\Menu\Item;
use Komma\KMS\Menu\KmsMenu;
use Komma\KMS\Sites\Models\Site;
use Komma\KMS\Sites\SiteServiceInterface;
use Komma\KMS\Users\Models\KmsUserRole;

class SidebarMenuComposer
{
    public function compose($view)
    {
        if(!Auth::user()) return;

        //Get the view data that contains the slug
        $viewData = $view->getData();
        $currentSectionSlug = isset($viewData['slug']) ? $viewData['slug'] : $this->getCurrentSectionSlug();

        //Get the current site.
        /** @var SiteServiceInterface $siteService */
        $siteService = app(SiteServiceInterface::class);
        $sites = $siteService->getSites();
        $currentSite = $siteService->getCurrentSite();

        KmsMenu::addItem((new Item())
            ->setSlug('team_members')
            ->setUrl(route('team_members.index'))
            ->setSortOrder(29)
            ->setName(__('kms/sidebarMenu.team_members')));

        KmsMenu::addItem((new Item())
            ->setSlug('services')
            ->setUrl(route('services.index'))
            ->setSortOrder(30)
            ->setName(__('kms/sidebarMenu.services')));

        KmsMenu::addItem((new Item())
            ->setSlug('projects')
            ->setUrl(route('projects.index'))
            ->setSortOrder(40)
            ->setName(__('kms/sidebarMenu.projects')));

        KmsMenu::addItem((new Item())
            ->setSlug('businesses')
            ->setUrl(route('businesses.index'))
            ->setSortOrder(50)
            ->setName(__('kms/sidebarMenu.businesses')));

        //Create regular menu items.
        KmsMenu::addItem((new Item())
            ->setSlug('posts')
            ->setSortOrder(60)
            ->setUrl(route('posts.index'))
            ->setName(__('kms/sidebarMenu.posts')));


//        KmsMenu::addItem((new Item())
//            ->setSlug('vacancies')
//            ->setUrl(route('vacancies.index'))
//            ->setSortOrder(70)
//            ->setName(__('kms/sidebarMenu.vacancies')));

//        KmsMenu::addItem((new Item())
//            ->setSlug('references')
//            ->setUrl(route('references.index'))
//            ->setSortOrder(80)
//            ->setName(__('kms/sidebarMenu.references')));

        KmsMenu::addItem(
            (new Item())->setIsSeparator(true)
                ->setSortOrder(70)
        );

        if(Auth::user()->can('index', WebsiteConfig::class)) {
            KmsMenu::addItem((new Item())
                ->setSlug('websiteconfig')
                ->setSortOrder(80)
                ->setUrl(route('websiteconfig.index'))
                ->setName(__('kms/sidebarMenu.websiteconfig')));
        }

        if (Auth::user()->can('index', Button::class)) {
            KmsMenu::addItem((new Item())
                ->setSlug('buttons')
                ->setSortOrder(90)
                ->setUrl(route('buttons.index'))
                ->setName(__('KMS::kms/sidebarMenu.buttons')));

            KmsMenu::addItem((new Item())
                ->setSlug('servicepoints')
                ->setUrl(route('servicepoints.index'))
                ->setSortOrder(100)
                ->setName(__('kms/sidebarMenu.servicepoints')));
        }



        //Create site menu items
        //If there is only one, merge the siteSub items, so it is not a sub menu
        if ( !config('app.multipleSites') || $sites->count() == 1) {
           KmsMenu::addItems($this->getSiteSubItems($sites->first()));
        } //If there are multiple sites, loop and ad these as an sub menu
        else {
            $siteMenus = [];
            foreach ($sites as $site) {
                /** @var Site $site */
                //We put all site items in a submenu for a site except for the default site.
                if ($site->exists) {
                    $siteMenus[] = (new Item())
                        ->setName($site->name)
                        ->setSlugs(['pages', $site->slug])
                        ->setSubItems($this->getSiteSubItems($site));
                }
            }

            KmsMenu::addItems($siteMenus);
        }


        //Custom sort the KMS items. In this boilerplate, they will have a different order as in kms initially
        KmsMenu::forEach(function(Item $item) {
            switch ($item->getSlug()) {
                case 'page':
                    $item->setSortOrder(10);
                    break;
                case 'kms_users':
                    $item->setSortOrder(110);
                    break;
            }
        });

        //Modify the users entry so that it does not have a sub item, but directly links to the kms users
        $topLevelUserMenuItem = KmsMenu::findItemByName(__('KMS::kms/sidebarMenu.users'));
        $kmsUserMenuItem = $topLevelUserMenuItem->getSubItems()[0];
        $topLevelUserMenuItem->setSubItems([]);
        $topLevelUserMenuItem->setName($kmsUserMenuItem->getName())
            ->setUrl($kmsUserMenuItem->getUrl())
            ->setSlugs($kmsUserMenuItem->getSlugs());

        //Define logic that determines when a menu items is active or not.
        KmsMenu::itemActiveWhen(function(Item $item) use($currentSectionSlug, $currentSite) {
            if(!$item->hasSlugs()) return false;

            //The first slug is the section slug. The second slug IF PRESENT, is the site slug. Use them to determine when to activate a menu item.
            $active = false;
            if(!$item->hasActiveSubItems()) {
                if (count($item->getSlugs()) >= 2) {
                    //We have a site slug and a section slug in some cases
                    $active = ($item->getSlugs()[0] == $currentSectionSlug) && ($item->getSlugs()[1] == $currentSite->slug);
                    //In other cases we have twice a section slug.
                    if (!$active) {
                        foreach ($item->getSlugs() as $slug) {
                            $active = $currentSectionSlug == $slug;
                        }
                    }
                } else {
                    //We only have the section slug
                    $active = ($item->getSlugs()[0] == $currentSectionSlug);
                }
            } else {
                $active = true;
            }

            return $active;
        });

        //Return the menu structure items and pass them into the view.
        $menuStructure = KmsMenu::getItems();
        $view->with('menuStructure', $menuStructure);
    }

    /**
     * This will return the site specific items
     *
     * @param Site $site
     * @return array
     */
    protected function getSiteSubItems(Site $site)
    {
        $items = [
            (new Item())
                ->setName(__('KMS::kms/sidebarMenu.pages'))
                ->setUrl(route('pages.index', ['siteSlug' => $site->slug]))
                ->setSortOrder(10)
                ->setSlugs(['pages', $site->slug])
        ];

        return $items;
    }

    /**
     * @return |null
     */
    protected function getCurrentSectionSlug()
    {
        $route = explode('/', Route::current()->uri());
        if (Route::current()->parameter('site')) {
            return $route[2];
        }

        return isset($route[1]) ? $route[1] : null;
    }

    /**
     * @return |null
     */
    protected function getCurrentSectionSubSlug()
    {
        $route = explode('/', Route::current()->uri());
        if (Route::current()->parameter('site')) {
            if (isset($route[3])) {
                return $route[3];
            }
        }

        return isset($route[2]) ? $route[2] : null;
    }
}