<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Repository\ElementRepository;
use App\Repository\NomenclatureRepository;
use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
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
{
protected $security;
protected $translator;
protected $nomenclatureRepository;
/**
* MenuBuilderSubscriber constructor.
* @param Security $security
* @param TranslatorInterface $translator
* @param NomenclatureRepository $nomenclatureRepository
*/
public function __construct(Security $security, TranslatorInterface $translator,
NomenclatureRepository $nomenclatureRepository)
{
$this->security = $security;
$this->translator = $translator;
$this->nomenclatureRepository = $nomenclatureRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
SidebarMenuEvent::class => ['onSetupMenu', 100],
];
}
/**
* @param SidebarMenuEvent $event
*/
public function onSetupMenu(SidebarMenuEvent $event)
{
/* @var $realUser User */
$realUser = $this->security->getUser();
if ($realUser->isAdmin()) {
$event->addItem(new MenuItemModel('dashboard', 'secure.admin.dashboard', 'admin.home',
[], 'fas fa-tachometer-alt'));
$event->addItem(new MenuItemModel('config-zipcode', 'Données codes postaux',
'admin.config.import.zipcode', [], 'fas fa-tools'));
$event->addItem(new MenuItemModel('label.managedata', 'label.managedata', null));
$event->addItem(new MenuItemModel('elementsList', 'secure.admin.elements.list',
'admin.elements.list', [], 'fas fa-database'));
$event->addItem(new MenuItemModel('googleSearchesList', 'secure.admin.googlesearches.list',
'admin.googlesearches.list', [], 'fab fa-google'));
$event->addItem(new MenuItemModel('label.nomenclatures', 'label.nomenclatures', null));
/**
* Retrieving all nomenclatures
*/
$nomenclatures = $this->nomenclatureRepository->findAll();
if ($nomenclatures) {
$nomenclatureBlock = new MenuItemModel('nomenclatures', 'secure.admin.nomenclatures.list', false,
[], 'fas fa-book');
foreach ($nomenclatures as $nomenclature) {
$nomenclatureBlock->addChild(new MenuItemModel('nomenclature_' . $nomenclature->getId(),
$nomenclature->getName(), 'nomenclature.list', ['id' => $nomenclature->getId()]));
}
$event->addItem($nomenclatureBlock);
}
$event->addItem(new MenuItemModel('nomenclaturesImport', 'Importer',
'nomenclature.import', [], 'fas fa-upload'));
/**
* TOURAINE HOTEL MENU
**/
$event->addItem(new MenuItemModel('label.tourainehotel', 'label.tourainehotel', null));
$event->addItem(new MenuItemModel('elementsListTh', 'Liste établissement TH',
'th.list', [], 'fas fa-hotel'));
$event->addItem(new MenuItemModel('elementsThExport', 'Exporter',
'th.export', [], 'fas fa-download'));
$event->addItem(new MenuItemModel('elementsThImport', 'Importer',
'th.import', [], 'fas fa-upload'));
$event->addItem(new MenuItemModel('checkErrorsTh', 'Contrôle des données',
'th.check', [], 'fas fa-clipboard-check'));
/**
* SMO MENU
**/
$event->addItem(new MenuItemModel('label.smo', 'label.smo', null));
$event->addItem(new MenuItemModel('smoDashboard', 'Dashboard',
'admin.smo.dashboard', [], 'fas fa-tachometer-alt'));
$event->addItem(new MenuItemModel('terminalList', 'Liste des bornes',
'admin.smo.terminals.list', [], 'fas fa-wifi'));
$event->addItem(new MenuItemModel('smoCoordinates', 'Liste des coordonnées',
'admin.smo.coordinates.list', [], 'fas fa-wrench'));
$event->addItem(new MenuItemModel('terminalImport', 'Importer',
'admin.smo.import', [], 'fas fa-upload'));
/**
* CONCIERGERIE MENU
**/
$event->addItem(new MenuItemModel('label.conciergerie', 'label.conciergerie', null));
$event->addItem(new MenuItemModel('conciergerieDashboard', 'Dashboard',
'concierge.home', [], 'fas fa-tachometer-alt'));
$event->addItem(new MenuItemModel('conciergerieList', 'Liste des établissements',
'concierge.list', [], 'fas fa-house-user'));
} else if ($realUser->isThAdmin()) {
$event->addItem(new MenuItemModel('dashboard', 'secure.admin.dashboard', 'th.home',
[], 'fas fa-tachometer-alt'));
$event->addItem(new MenuItemModel('label.tourainehotel', 'label.tourainehotel', null));
$event->addItem(new MenuItemModel('elementsListTh', 'Liste établissement TH',
'th.list', [], 'fas fa-hotel'));
} else if ($realUser->isThMember()) {
$event->addItem(new MenuItemModel('dashboard', 'Mes établissements', 'th.home',
[], 'fas fa-hotel'));
if (0 < count($realUser->getElement())) {
$event->addItem(new MenuItemModel('label.manageelement', 'label.manageelement', null));
foreach ($realUser->getElement() as $element) {
$event->addItem(new MenuItemModel($element->getReference(),
mb_strtoupper(mb_strimwidth($element->getNameFr(), 0, 25, ' ...')),
'th.element.edit', ['reference' => $element->getReference()]));
}
}
} else if ($realUser->isConciergeAdmin()) {
$event->addItem(new MenuItemModel('dashboard', 'secure.admin.dashboard', 'concierge.home',
[], 'fas fa-tachometer-alt'));
$event->addItem(new MenuItemModel('label.conciergerie', 'label.conciergerie', null));
$event->addItem(new MenuItemModel('elementsListConcierge', 'Liste des établissements',
'concierge.list', [], 'fas fa-hotel'));
} else if ($realUser->isConciergeMember()) {
$event->addItem(new MenuItemModel('dashboard', 'Mes établissements', 'concierge.home',
[], 'fas fa-hotel'));
if (0 < count($realUser->getElement())) {
$event->addItem(new MenuItemModel('label.manageelement', 'label.manageelement', null));
foreach ($realUser->getElement() as $element) {
$event->addItem(new MenuItemModel($element->getReference(),
mb_strtoupper(mb_strimwidth($element->getNameFr(), 0, 25, ' ...')),
'concierge.element.edit', ['reference' => $element->getReference()]));
}
}
} else {
$event->addItem(new MenuItemModel('dashboard', 'secure.manager.dashboard', 'manager.home',
[], 'fas fa-tachometer-alt'));
if (0 < count($realUser->getElement())) {
$event->addItem(new MenuItemModel('label.manageelement', 'label.manageelement', null));
foreach ($realUser->getElement() as $element) {
$event->addItem(new MenuItemModel($element->getReference(),
mb_strtoupper(mb_strimwidth($element->getNameFr(), 0, 25, ' ...')),
'manager.element', ['reference' => $element->getReference()]));
}
}
}
$this->activateByRoute($event->getRequest()->get('_route'), $event->getItems());
}
/**
* @param string $route
* @param MenuItemModel[] $items
*/
protected function activateByRoute($route, $items)
{
foreach ($items as $item) {
if ($item->hasChildren()) {
$this->activateByRoute($route, $item->getChildren());
} elseif ($item->getRoute() == $route) {
$item->setIsActive(true);
}
}
}
}