<?php
namespace App\EventSubscriber;
use App\Entity\Pages;
use App\Entity\User;
use App\Repository\PagesRepository;
use App\Repository\UserRepository;
use App\Service\UserHelper;
use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
use KevinPapst\AdminLTEBundle\Model\MenuItemInterface;
use KevinPapst\AdminLTEBundle\Model\MenuItemModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
class MenuBuilderSubscriber implements EventSubscriberInterface
{
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @var UserRepository
*/
private $userRepository;
/**
* @var array
*/
private $routeMapping;
/**
* @var PagesRepository
*/
private $pagesRepository;
/**
* @var Security
*/
private $security;
/**
* @var UserHelper
*/
private $userHelper;
public function __construct(TranslatorInterface $translator, UserRepository $userRepository, PagesRepository $pagesRepository, Security $security, UserHelper $userHelper)
{
$this->translator = $translator;
$this->userRepository = $userRepository;
//$this->initRoutesMapping();
$this->pagesRepository = $pagesRepository;
$this->security = $security;
$this->userHelper = $userHelper;
}
public static function getSubscribedEvents(): array
{
return [
SidebarMenuEvent::class => ['onSetupMenu', 100],
];
}
public function onSetupMenu(SidebarMenuEvent $event)
{
/**
* @var $user User
*/
$user = $this->security->getUser();
$role = $this->userHelper->getRoleId($user);
$menu = $this->pagesRepository->findForRole(null, $role);
foreach ($menu as $m) {
/** @var Pages $m */
$itemParent = new MenuItemModel($m->getId().'-'.$m->getPath(), $m->getLabel(), $m->getPath(), $m->getArguments() ? unserialize($m->getArguments()) : [], $m->getIcone());
// Les enfants
$enfants = $this->pagesRepository->findForRole($m->getId(), $role);
foreach ($enfants as $enfant) {
$itemEnfant = new MenuItemModel($enfant->getPath(), $enfant->getLabel(), $enfant->getPath(), $enfant->getArguments() ? unserialize($enfant->getArguments()) : [], $enfant->getIcone());
$itemParent
->addChild($itemEnfant);
$sousEnfants = $this->pagesRepository->findForRole($enfant->getId(), $role);
foreach ($sousEnfants as $sousEnfant) {
$itemEnfant
->addChild(
new MenuItemModel($sousEnfant->getPath(), $sousEnfant->getLabel(), $sousEnfant->getPath(), $sousEnfant->getArguments() ? unserialize($sousEnfant->getArguments()) : [], $sousEnfant->getIcone())
);
}
}
$event->addItem($itemParent);
}
$this->activateByRoute(
$event->getRequest()->get('_route'),
$event->getItems()
);
}
/**
* @param string $route
* @param MenuItemInterface[] $items
*/
protected function activateByRoute($route, $items)
{
foreach ($items as $item) {
$itemRoute = $item->getRoute();
// Recherche dans les enfants
if ($item->hasChildren()) {
$this->activateByRoute($route, $item->getChildren());
}
// Route exacte
elseif ($itemRoute == $route) {
$item->setIsActive(true);
}
// Recherche dans le mapping (arbre basique des routes)
elseif (isset($this->routeMapping[$itemRoute]) && in_array($route, $this->routeMapping[$itemRoute])) {
$item->setIsActive(true);
}
}
}
}