Files
myep-team/src/Menu/AbstractMenuBuilder.php
T
2023-10-18 17:06:46 +02:00

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,
],
]);
}
}