File: D:/HostingSpaces/SBogers10/azenio.komma.pro/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();
//Create regular menu items.
KmsMenu::addItem((new Item())
->setSlug('posts')
->setSortOrder(20)
->setUrl(route('posts.index'))
->setName(__('kms/sidebarMenu.posts')));
// KmsMenu::addItem((new Item())
// ->setSlug('vacancies')
// ->setUrl(route('vacancies.index'))
// ->setSortOrder(30)
// ->setName(__('kms/sidebarMenu.vacancies')));
// KmsMenu::addItem((new Item())
// ->setSlug('projects')
// ->setUrl(route('projects.index'))
// ->setSortOrder(40)
// ->setName(__('kms/sidebarMenu.projects')));
KmsMenu::addItem((new Item())
->setSlug('services')
->setUrl(route('services.index'))
->setSortOrder(50)
->setName(__('kms/sidebarMenu.services')));
KmsMenu::addItem((new Item())
->setSlug('references')
->setUrl(route('references.index'))
->setSortOrder(60)
->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;
}
}