141 lines
4.5 KiB
PHP
141 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace App\Menu;
|
|
|
|
use App\Entity\User;
|
|
use Knp\Menu\FactoryInterface;
|
|
use Knp\Menu\ItemInterface;
|
|
use Symfony\Bundle\SecurityBundle\Security;
|
|
use Symfony\Component\HttpFoundation\RequestStack;
|
|
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
|
|
use Symfony\Component\Uid\Uuid;
|
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
|
|
|
abstract class AbstractMenuBuilder
|
|
{
|
|
public function __construct(
|
|
protected FactoryInterface $factory,
|
|
protected Security $security,
|
|
protected RequestStack $requestStack,
|
|
protected TranslatorInterface $translator
|
|
) {
|
|
}
|
|
|
|
protected function createRootElement(): ItemInterface
|
|
{
|
|
return $this->factory->createItem('root');
|
|
}
|
|
|
|
protected function createMenu(array $menuItems): ItemInterface
|
|
{
|
|
$menu = $this->createRootElement();
|
|
|
|
foreach ($menuItems as $menuItem) {
|
|
$addedItem = $this->createMenuItem($menu, $menuItem);
|
|
if (isset($menuItem['hideChildren'])&& true === $menuItem['hideChildren']) {
|
|
$addedItem->setDisplayChildren(false);
|
|
}
|
|
if (isset($menuItem['children'])) {
|
|
foreach ($menuItem['children'] as $subMenuItem) {
|
|
$addedSubItem = $this->createMenuItem($addedItem, $subMenuItem);
|
|
if (isset($subMenuItem['children'])) {
|
|
$addedSubItem->setDisplayChildren(false);
|
|
foreach ($subMenuItem['children'] as $hiddenItem) {
|
|
$this->createMenuItem($addedSubItem, $hiddenItem);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $menu;
|
|
}
|
|
|
|
protected function createMenuItem(ItemInterface $menu, array $options): ItemInterface
|
|
{
|
|
$itemOptions = [];
|
|
if (false !== $options['route']) {
|
|
$itemOptions['route'] = $options['route'];
|
|
$itemOptions['linkAttributes'] = ['title' => $options['title']];
|
|
}
|
|
if (isset($options['routeParameters'])) {
|
|
$itemOptions['routeParameters'] = $options['routeParameters'];
|
|
}
|
|
$addedItem = $menu
|
|
->addChild($options['title'], $itemOptions)
|
|
->setChildrenAttribute('title', $options['title'])
|
|
;
|
|
if (isset($options['icon'])) {
|
|
$addedItem->setExtra('icon', $options['icon']);
|
|
}
|
|
|
|
return $addedItem;
|
|
}
|
|
|
|
protected function getDefaultRouteParameters(string $parameter = 'id', string $default = '0'): array
|
|
{
|
|
return [$parameter => $this->requestStack->getMainRequest()->get($parameter, $default)];
|
|
}
|
|
|
|
protected function addAdminItem(ItemInterface $menu): void
|
|
{
|
|
if ($this->security->isGranted('ROLE_ADMIN')) {
|
|
$menu
|
|
->addChild('zum Adminbereich', ['route' => 'app_admin_index'])
|
|
->setChildrenAttribute('title', 'zum Adminbereich')
|
|
->setExtra('icon', 'user')
|
|
;
|
|
}
|
|
}
|
|
|
|
protected function addTeamerItem(ItemInterface $menu): void
|
|
{
|
|
if ($this->security->isGranted('ROLE_TEAMER')) {
|
|
$menu
|
|
->addChild('zum Teamerbereich', ['route' => 'app_teamer_index'])
|
|
->setChildrenAttribute('title', 'zum Teamerbereich')
|
|
->setExtra('icon', 'user')
|
|
;
|
|
}
|
|
}
|
|
|
|
protected function addLogoutItem(ItemInterface $menu): void
|
|
{
|
|
$token = $this->security->getToken();
|
|
|
|
if ($token instanceof SwitchUserToken) {
|
|
/** @var User $originalUser */
|
|
$originalUser = $token->getOriginalToken()->getUser();
|
|
$menu
|
|
->addChild('Logout', [
|
|
'route' => $originalUser->getDefaultRoute(),
|
|
'routeParameters' => ['_switch_user' => '_exit'],
|
|
'linkAttributes' => [
|
|
'title' => 'zurück',
|
|
],
|
|
])
|
|
->setExtra('icon', 'logout')
|
|
;
|
|
} else {
|
|
$menu
|
|
->addChild('Logout', [
|
|
'route' => 'app_security_logout',
|
|
'linkAttributes' => [
|
|
'title' => 'Logout',
|
|
],
|
|
])
|
|
->setExtra('icon', 'logout')
|
|
;
|
|
}
|
|
}
|
|
|
|
protected function addDivider(ItemInterface $menu): void
|
|
{
|
|
$menu->addChild(Uuid::v4(), [
|
|
'extras' => [
|
|
'divider' => true,
|
|
],
|
|
]);
|
|
}
|
|
}
|