src/Menu/Builder.php line 79

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: Igor Ratsun
  5.  * Date: 02.07.2021
  6.  * Time: 18:38
  7.  */
  8. namespace App\Menu;
  9. use App\Entity\Page;
  10. use App\Entity\PageTemplate;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Knp\Menu\FactoryInterface;
  13. use Knp\Menu\ItemInterface;
  14. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  15. use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
  16. final class Builder
  17. {
  18.     /**
  19.      * @var FactoryInterface
  20.      */
  21.     private $factory;
  22.     private EntityManagerInterface $entityManager;
  23.     private AccessDecisionManagerInterface $decisionManager;
  24.     private TokenStorageInterface $tokenStorage;
  25.     public function __construct(
  26.         FactoryInterface               $factory,
  27.         EntityManagerInterface         $entityManager,
  28.         AccessDecisionManagerInterface $decisionManager,
  29.         TokenStorageInterface          $tokenStorage
  30.     ) {
  31.         $this->factory $factory;
  32.         $this->entityManager $entityManager;
  33.         $this->decisionManager $decisionManager;
  34.         $this->tokenStorage $tokenStorage;
  35.     }
  36.     public function appMenu(array $options): ItemInterface
  37.     {
  38.         $menu $this->factory->createItem('root');
  39.         $menu->addChild('menu.about',  ['route' => 'about']);
  40.         $menu->addChild('menu.speakers', ['route' => 'speaker.list']);
  41.         $menu->addChild('menu.news', ['route' => 'news.index']);
  42.         $menu->addChild('menu.partnership', ['route' => 'partnership.request']);
  43.         //        $menu->addChild('menu.personal_cabinet', ['route' => 'cabinet.index']);
  44.         return $menu;
  45.     }
  46.     public function appMobileMenu(array $options): ItemInterface
  47.     {
  48.         $menu $this->appMenu($options);
  49.         $menu->addChild('label.search', ['route' => 'search']);
  50.         return $menu;
  51.     }
  52.     public function footerMenu(array $options): ItemInterface
  53.     {
  54.         if ($this->tokenStorage->getToken() && $this->decisionManager->decide($this->tokenStorage->getToken(), ['ROLE_USER'])) {
  55.             $menu $this->cabinetClientMenu($options);
  56.         } else {
  57.             $menu $this->factory->createItem('root');
  58.             $menu->addChild('menu.home', ['route' => 'home']);
  59.             $menu->addChild('menu.speakers', ['route' => 'speaker.list']);
  60.             $menu->addChild('menu.news', ['route' => 'news.index']);
  61.             $menu->addChild('menu.docs', ['route' => 'docs']);
  62.             $menu->addChild('menu.partnership', ['route' => 'partnership.request']);
  63.             $menu->addChild('menu.personal_cabinet', ['route' => 'cabinet.index']);
  64.             $menu->addChild('menu.feedback', ['route' => 'feedback.request']);
  65.         }
  66.         // Load from static pages
  67.         $staticPageTemplate $this->entityManager->getRepository(PageTemplate::class)->findOneBy(['path' => 'page/static_page.html.twig']);
  68.         foreach ($this->entityManager->getRepository(Page::class)->findBy(
  69.             [
  70.                 'template'  => $staticPageTemplate,
  71.                 'published' => true,
  72.             ],
  73.             ['menuPosition' => 'asc']
  74.         ) as $item) {
  75.             if ($item->getMenuTitle()) {
  76.                 $menu->addChild($item->getMenuTitle(), ['route' => 'page''routeParameters' => ['uri' => $item->getUri()]]);
  77.             }
  78.         }
  79.         return $menu;
  80.     }
  81.     public function cabinetSpeakerMenu(array $options): ItemInterface
  82.     {
  83.         $speakerPageMenu $this->factory->createItem('menu.speaker_page', ['route' => 'cabinet.speaker_page.index']);
  84.         $speakerPageMenu->setChildrenAttribute('class''sub_nav');
  85.         $speakerPageMenu->addChild('menu.speaker_content', ['route' => 'cabinet.speaker_page.index'])
  86.             ->setExtra('icon_html''<span class="material-icons-outlined">web_asset</span>');
  87.         //        $speakerPageMenu->addChild('menu.speaker_courses', ['route' => 'cabinet.speaker_course.index'])
  88.         //            ->setExtra('icon_html', '<span class="material-icons">subscriptions</span>');
  89.         //        $speakerPageMenu->addChild('menu.speaker_banners', ['route' => 'cabinet.speaker_banner.index'])
  90.         //            ->setExtra('icon_html', '<span class="material-icons-outlined">wallpaper</span>');
  91.         //        $speakerPageMenu->addChild('menu.speaker_reviews', ['route' => 'cabinet.speaker_review.index'])
  92.         //            ->setExtra('icon_html', '<span class="material-icons">chat</span>');
  93.         $scheduleMenu $this->factory->createItem('menu.schedule', ['route' => 'cabinet.schedule.index']);
  94.         $scheduleMenu->addChild('label.month', ['route' => 'cabinet.schedule.month']);
  95.         $scheduleMenu->addChild('label.week', ['route' => 'cabinet.schedule.week']);
  96.         $menu $this->factory->createItem('root');
  97.         $menu->addChild('menu.speaker_work_cabinet', ['route' => 'cabinet.speaker_office.index'])
  98.             ->setExtra('translation_domain''cabinet')
  99.             ->setLinkAttribute('class''office');
  100.         $menu->addChild('menu.about',  ['route' => 'about']);
  101.         $menu->addChild($scheduleMenu)->setExtra('translation_domain''cabinet');
  102.         $menu->addChild('menu.transactions', ['route' => 'cabinet.transaction.index'])->setExtra('translation_domain''cabinet');
  103.         $menu->addChild($speakerPageMenu)->setExtra('translation_domain''cabinet');
  104.         // $menu->addChild('menu.support', ['route' => 'cabinet.support'])
  105.         //     ->setExtra('translation_domain', 'cabinet')
  106.         //     ->setCurrent(isset($_GET['id']) && $_GET['id'] == 'support_' . $this->tokenStorage->getToken()->getUser()->getId());
  107.         //        $menu->addChild('menu.premium', ['route' => 'cabinet.premium.index'])->setExtra('translation_domain', 'cabinet');
  108.         return $menu;
  109.     }
  110.     public function cabinetProfileMenu(array $options): ItemInterface
  111.     {
  112.         $isSpeaker $this->decisionManager->decide($this->tokenStorage->getToken(), ['ROLE_SPEAKER']);
  113.         $menu $this->factory->createItem('root');
  114.         $menu->addChild('menu.personal_info', ['route' => 'cabinet.profile.index'])
  115.             ->setExtra('icon_html''<span class="material-icons">account_circle</span>')
  116.             ->setExtra('help''menu.personal_info_help');
  117.         $menu->addChild('menu.security', ['route' => 'cabinet.profile.security'])
  118.             ->setExtra('icon_html''<span class="material-icons">verified_user</span>')
  119.             ->setExtra('help''menu.security_help');
  120.         // if ($isSpeaker) {
  121.         //     $menu->addChild('menu.payment_info', ['route' => 'cabinet.profile.payment_info'])
  122.         //         ->setExtra('icon_html', '<span class="material-icons-outlined">payment</span>')
  123.         //         ->setExtra('help', 'menu.payment_info_help');
  124.         // }
  125.         $menu->addChild('menu.profile_notification', ['route' => 'cabinet.profile.notifications'])
  126.             ->setExtra('icon_html''<span class="material-icons">notifications</span>')
  127.             ->setExtra('help''menu.profile_notification_help');
  128.         if ($isSpeaker) {
  129.             // $menu->addChild('menu.my_subscriptions', ['route' => 'cabinet.profile.speaker_subscriptions'])
  130.             //     ->setExtra('icon_html', '<span class="material-icons">supervisor_account</span>')
  131.             //     ->setExtra('help', 'menu.my_subscriptions_help');
  132.         } else {
  133.             $menu->addChild('menu.subscriptions', ['route' => 'cabinet.profile.subscribed_to_speakers'])
  134.                 ->setExtra('icon_html''<span class="material-icons">supervisor_account</span>')
  135.                 ->setExtra('help''menu.subscriptions_help');
  136.         }
  137.         $menu->addChild('menu.logout', ['route' => 'app_logout'])
  138.             ->setExtra('icon_html''<span class="material-icons">login</span>')
  139.             ->setExtra('help''menu.logout_help')
  140.             ->setLinkAttributes(['id' => 'logout']);
  141.         return $menu;
  142.     }
  143.     public function cabinetClientMenu(array $options): ItemInterface
  144.     {
  145.         $menu $this->factory->createItem('root');
  146.         $menu->addChild('menu.about',  ['route' => 'about']);
  147.         $menu->addChild('menu.my_consultations', ['route' => 'cabinet.planned_consultation.index'])->setExtra('translation_domain''cabinet');
  148.         $menu->addChild('menu.speakers', ['route' => 'speaker.list'])->setExtra('translation_domain''cabinet');
  149.         $menu->addChild('menu.docs', ['route' => 'docs']);
  150.         $menu->addChild('menu.schedule', ['route' => 'cabinet.client_calendar.index'])->setExtra('translation_domain''cabinet');
  151.         // $menu->addChild('menu.video_courses', ['route' => 'cabinet.client_course.index'])->setExtra('translation_domain', 'cabinet');
  152.         $menu->addChild('menu.my_orders', ['route' => 'cabinet.client_order.index'])->setExtra('translation_domain''cabinet');
  153.         // $menu->addChild('menu.news', ['route' => 'news.index']);
  154.         // $menu->addChild('menu.support', ['route' => 'cabinet.support'])->setExtra('translation_domain', 'cabinet');
  155.         return $menu;
  156.     }
  157. }