<?php
/**
* Created by PhpStorm.
* User: Igor Ratsun
* Date: 02.07.2021
* Time: 18:38
*/
namespace App\Menu;
use App\Entity\Page;
use App\Entity\PageTemplate;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Menu\FactoryInterface;
use Knp\Menu\ItemInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
final class Builder
{
/**
* @var FactoryInterface
*/
private $factory;
private EntityManagerInterface $entityManager;
private AccessDecisionManagerInterface $decisionManager;
private TokenStorageInterface $tokenStorage;
public function __construct(
FactoryInterface $factory,
EntityManagerInterface $entityManager,
AccessDecisionManagerInterface $decisionManager,
TokenStorageInterface $tokenStorage
) {
$this->factory = $factory;
$this->entityManager = $entityManager;
$this->decisionManager = $decisionManager;
$this->tokenStorage = $tokenStorage;
}
public function appMenu(array $options): ItemInterface
{
$menu = $this->factory->createItem('root');
$menu->addChild('menu.about', ['route' => 'about']);
$menu->addChild('menu.speakers', ['route' => 'speaker.list']);
$menu->addChild('menu.news', ['route' => 'news.index']);
$menu->addChild('menu.partnership', ['route' => 'partnership.request']);
// $menu->addChild('menu.personal_cabinet', ['route' => 'cabinet.index']);
return $menu;
}
public function appMobileMenu(array $options): ItemInterface
{
$menu = $this->appMenu($options);
$menu->addChild('label.search', ['route' => 'search']);
return $menu;
}
public function footerMenu(array $options): ItemInterface
{
if ($this->tokenStorage->getToken() && $this->decisionManager->decide($this->tokenStorage->getToken(), ['ROLE_USER'])) {
$menu = $this->cabinetClientMenu($options);
} else {
$menu = $this->factory->createItem('root');
$menu->addChild('menu.home', ['route' => 'home']);
$menu->addChild('menu.speakers', ['route' => 'speaker.list']);
$menu->addChild('menu.news', ['route' => 'news.index']);
$menu->addChild('menu.docs', ['route' => 'docs']);
$menu->addChild('menu.partnership', ['route' => 'partnership.request']);
$menu->addChild('menu.personal_cabinet', ['route' => 'cabinet.index']);
$menu->addChild('menu.feedback', ['route' => 'feedback.request']);
}
// Load from static pages
$staticPageTemplate = $this->entityManager->getRepository(PageTemplate::class)->findOneBy(['path' => 'page/static_page.html.twig']);
foreach ($this->entityManager->getRepository(Page::class)->findBy(
[
'template' => $staticPageTemplate,
'published' => true,
],
['menuPosition' => 'asc']
) as $item) {
if ($item->getMenuTitle()) {
$menu->addChild($item->getMenuTitle(), ['route' => 'page', 'routeParameters' => ['uri' => $item->getUri()]]);
}
}
return $menu;
}
public function cabinetSpeakerMenu(array $options): ItemInterface
{
$speakerPageMenu = $this->factory->createItem('menu.speaker_page', ['route' => 'cabinet.speaker_page.index']);
$speakerPageMenu->setChildrenAttribute('class', 'sub_nav');
$speakerPageMenu->addChild('menu.speaker_content', ['route' => 'cabinet.speaker_page.index'])
->setExtra('icon_html', '<span class="material-icons-outlined">web_asset</span>');
// $speakerPageMenu->addChild('menu.speaker_courses', ['route' => 'cabinet.speaker_course.index'])
// ->setExtra('icon_html', '<span class="material-icons">subscriptions</span>');
// $speakerPageMenu->addChild('menu.speaker_banners', ['route' => 'cabinet.speaker_banner.index'])
// ->setExtra('icon_html', '<span class="material-icons-outlined">wallpaper</span>');
// $speakerPageMenu->addChild('menu.speaker_reviews', ['route' => 'cabinet.speaker_review.index'])
// ->setExtra('icon_html', '<span class="material-icons">chat</span>');
$scheduleMenu = $this->factory->createItem('menu.schedule', ['route' => 'cabinet.schedule.index']);
$scheduleMenu->addChild('label.month', ['route' => 'cabinet.schedule.month']);
$scheduleMenu->addChild('label.week', ['route' => 'cabinet.schedule.week']);
$menu = $this->factory->createItem('root');
$menu->addChild('menu.speaker_work_cabinet', ['route' => 'cabinet.speaker_office.index'])
->setExtra('translation_domain', 'cabinet')
->setLinkAttribute('class', 'office');
$menu->addChild('menu.about', ['route' => 'about']);
$menu->addChild($scheduleMenu)->setExtra('translation_domain', 'cabinet');
$menu->addChild('menu.transactions', ['route' => 'cabinet.transaction.index'])->setExtra('translation_domain', 'cabinet');
$menu->addChild($speakerPageMenu)->setExtra('translation_domain', 'cabinet');
// $menu->addChild('menu.support', ['route' => 'cabinet.support'])
// ->setExtra('translation_domain', 'cabinet')
// ->setCurrent(isset($_GET['id']) && $_GET['id'] == 'support_' . $this->tokenStorage->getToken()->getUser()->getId());
// $menu->addChild('menu.premium', ['route' => 'cabinet.premium.index'])->setExtra('translation_domain', 'cabinet');
return $menu;
}
public function cabinetProfileMenu(array $options): ItemInterface
{
$isSpeaker = $this->decisionManager->decide($this->tokenStorage->getToken(), ['ROLE_SPEAKER']);
$menu = $this->factory->createItem('root');
$menu->addChild('menu.personal_info', ['route' => 'cabinet.profile.index'])
->setExtra('icon_html', '<span class="material-icons">account_circle</span>')
->setExtra('help', 'menu.personal_info_help');
$menu->addChild('menu.security', ['route' => 'cabinet.profile.security'])
->setExtra('icon_html', '<span class="material-icons">verified_user</span>')
->setExtra('help', 'menu.security_help');
// if ($isSpeaker) {
// $menu->addChild('menu.payment_info', ['route' => 'cabinet.profile.payment_info'])
// ->setExtra('icon_html', '<span class="material-icons-outlined">payment</span>')
// ->setExtra('help', 'menu.payment_info_help');
// }
$menu->addChild('menu.profile_notification', ['route' => 'cabinet.profile.notifications'])
->setExtra('icon_html', '<span class="material-icons">notifications</span>')
->setExtra('help', 'menu.profile_notification_help');
if ($isSpeaker) {
// $menu->addChild('menu.my_subscriptions', ['route' => 'cabinet.profile.speaker_subscriptions'])
// ->setExtra('icon_html', '<span class="material-icons">supervisor_account</span>')
// ->setExtra('help', 'menu.my_subscriptions_help');
} else {
$menu->addChild('menu.subscriptions', ['route' => 'cabinet.profile.subscribed_to_speakers'])
->setExtra('icon_html', '<span class="material-icons">supervisor_account</span>')
->setExtra('help', 'menu.subscriptions_help');
}
$menu->addChild('menu.logout', ['route' => 'app_logout'])
->setExtra('icon_html', '<span class="material-icons">login</span>')
->setExtra('help', 'menu.logout_help')
->setLinkAttributes(['id' => 'logout']);
return $menu;
}
public function cabinetClientMenu(array $options): ItemInterface
{
$menu = $this->factory->createItem('root');
$menu->addChild('menu.about', ['route' => 'about']);
$menu->addChild('menu.my_consultations', ['route' => 'cabinet.planned_consultation.index'])->setExtra('translation_domain', 'cabinet');
$menu->addChild('menu.speakers', ['route' => 'speaker.list'])->setExtra('translation_domain', 'cabinet');
$menu->addChild('menu.docs', ['route' => 'docs']);
$menu->addChild('menu.schedule', ['route' => 'cabinet.client_calendar.index'])->setExtra('translation_domain', 'cabinet');
// $menu->addChild('menu.video_courses', ['route' => 'cabinet.client_course.index'])->setExtra('translation_domain', 'cabinet');
$menu->addChild('menu.my_orders', ['route' => 'cabinet.client_order.index'])->setExtra('translation_domain', 'cabinet');
// $menu->addChild('menu.news', ['route' => 'news.index']);
// $menu->addChild('menu.support', ['route' => 'cabinet.support'])->setExtra('translation_domain', 'cabinet');
return $menu;
}
}