vendor/ibexa/site-factory/src/bundle/Menu/Listener/ConfigureMainMenuListener.php line 71

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\Bundle\SiteFactory\Menu\Listener;
  8. use Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent;
  9. use Ibexa\AdminUi\Menu\MenuItemFactory;
  10. use Ibexa\Bundle\PageBuilder\Menu\EventListener\ConfigureMainMenuListener as PageBuilderConfigureMainMenuListenerAlias;
  11. use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException;
  12. use Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException;
  13. use Ibexa\Contracts\Core\Repository\LocationService;
  14. use Ibexa\Contracts\Core\Repository\PermissionResolver;
  15. use Ibexa\Contracts\Core\Repository\Values\Content\Location;
  16. use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface;
  17. use Ibexa\Contracts\PageBuilder\PageBuilder\ConfigurationResolverInterface;
  18. use Ibexa\Contracts\SiteFactory\Service\SiteServiceInterface;
  19. use JMS\TranslationBundle\Annotation\Ignore;
  20. use JMS\TranslationBundle\Model\Message;
  21. use JMS\TranslationBundle\Translation\TranslationContainerInterface;
  22. use Knp\Menu\ItemInterface;
  23. use Symfony\Contracts\Translation\TranslatorInterface;
  24. class ConfigureMainMenuListener implements TranslationContainerInterface
  25. {
  26.     public const LIST = 'header.list';
  27.     public const ITEM_SITE 'ezplatform_site_factory';
  28.     public const ITEM_SITE_SKELETON 'ezplatform_site_factory_skeletons';
  29.     public const ITEM_SETTINGS_GROUPS 'ibexa_site_factory_settings_groups';
  30.     private ConfigurationResolverInterface $pageBuilderConfigurationResolver;
  31.     private SiteServiceInterface $siteService;
  32.     private LocationService $locationService;
  33.     private TranslatorInterface $translator;
  34.     private PermissionResolver $permissionResolver;
  35.     private MenuItemFactory $menuItemFactory;
  36.     private ConfigResolverInterface $configResolver;
  37.     public function __construct(
  38.         ConfigurationResolverInterface $pageBuilderConfigurationResolver,
  39.         SiteServiceInterface $siteService,
  40.         LocationService $locationService,
  41.         TranslatorInterface $translator,
  42.         PermissionResolver $permissionResolver,
  43.         MenuItemFactory $menuItemFactory,
  44.         ConfigResolverInterface $configResolver
  45.     ) {
  46.         $this->pageBuilderConfigurationResolver $pageBuilderConfigurationResolver;
  47.         $this->siteService $siteService;
  48.         $this->locationService $locationService;
  49.         $this->translator $translator;
  50.         $this->permissionResolver $permissionResolver;
  51.         $this->menuItemFactory $menuItemFactory;
  52.         $this->configResolver $configResolver;
  53.     }
  54.     /**
  55.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  56.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  57.      */
  58.     public function onMenuConfigure(ConfigureMenuEvent $event)
  59.     {
  60.         $root $event->getMenu();
  61.         if (!$this->permissionResolver->hasAccess('site''view')) {
  62.             $root->removeChild(PageBuilderConfigureMainMenuListenerAlias::ITEM_PAGE);
  63.             return;
  64.         }
  65.         $options $event->getOptions();
  66.         /** @var \Ibexa\Contracts\Core\Repository\Values\Content\Location $location */
  67.         $location $options['location'] ?? null;
  68.         $page $root->getChild(PageBuilderConfigureMainMenuListenerAlias::ITEM_PAGE);
  69.         if (null === $page) {
  70.             return;
  71.         }
  72.         $page->setLabel($this->translator->trans(
  73.             /** @Ignore */
  74.             self::ITEM_SITE,
  75.             [],
  76.             'ibexa_menu'
  77.         ));
  78.         $pageElements $page->getChildren();
  79.         $this->addListElement($page$location);
  80.         $this->addSiteSkeletonItem($page);
  81.         $this->addSiteFactorySites($page);
  82.         $siteaccesses $this->pageBuilderConfigurationResolver->getSiteaccessList();
  83.         if (empty($siteaccesses)) {
  84.             return;
  85.         }
  86.         foreach ($pageElements as $pageElement) {
  87.             $attributes $pageElement->getAttributes() ?? [];
  88.             $attributes['class'] = isset($attributes['class'])
  89.                 ? $attributes['class'] . ' ibexa-navbar__item--visible'
  90.                 'ibexa-navbar__item--visible';
  91.             $attributes['data-ibexa-site-access'] = $pageElement->getName();
  92.             $pageElement->setAttributes($attributes);
  93.             // dedicated Page preview is no longer used, avoid marking menu item active on regular content view in admin
  94.             $pageElement->setCurrent(false);
  95.         }
  96.     }
  97.     public static function getTranslationMessages(): array
  98.     {
  99.         return [
  100.             (new Message(self::ITEM_SITE'ibexa_menu'))->setDesc('Site management'),
  101.             (new Message(self::ITEM_SITE_SKELETON'ibexa_menu'))->setDesc('Site skeletons'),
  102.             (new Message(self::ITEM_SETTINGS_GROUPS'ibexa_menu'))->setDesc('Settings'),
  103.             (new Message(self::LIST, 'ibexa_menu'))->setDesc('Sites'),
  104.         ];
  105.     }
  106.     private function addListElement(
  107.         ItemInterface $root,
  108.         ?Location $location
  109.     ): void {
  110.         $root->addChild('list', [
  111.             'route' => 'ibexa.site_factory.grid',
  112.             'routeParameters' => [
  113.                 'locationId' => $location->id ?? null,
  114.             ],
  115.             'label' => $this->translator->trans(
  116.                 /** @Ignore */
  117.                 self::LIST,
  118.                 [],
  119.                 'ibexa_menu'
  120.             ),
  121.             'extras' => [
  122.                 'routes' => [
  123.                     'site_grid' => 'ibexa.site_factory.grid',
  124.                     'site_list' => 'ibexa.site_factory.list',
  125.                     'site_create' => 'ibexa.site_factory.create',
  126.                     'site_edit' => 'ibexa.site_factory.edit',
  127.                     'site_access_view' => 'ibexa.site_factory.view',
  128.                 ],
  129.                 'orderNumber' => 20,
  130.             ],
  131.         ]);
  132.     }
  133.     private function addSiteFactorySites(ItemInterface $root): void
  134.     {
  135.         foreach ($this->siteService->loadSites()->sites as $site) {
  136.             try {
  137.                 $location $this->locationService->loadLocation($site->getTreeRootLocationId());
  138.             } catch (NotFoundException|UnauthorizedException $e) {
  139.                 continue;
  140.             }
  141.             // Add also all site accesses to menu in order to highlight correct links in Page Builder
  142.             foreach ($site->publicAccesses as $siteAccess) {
  143.                 $item $root->addChild($siteAccess->identifier, [
  144.                     'route' => 'ibexa.content.view',
  145.                     'label' => $site->name,
  146.                     'routeParameters' => [
  147.                         'locationId' => $location->id,
  148.                         'contentId' => $location->contentId,
  149.                     ],
  150.                     'attributes' => [
  151.                         'data-ibexa-site-location-id' => $location->id,
  152.                         'data-ibexa-site-access' => $siteAccess->identifier,
  153.                         'class' => 'ibexa-navbar__item--visible',
  154.                     ],
  155.                     'extras' => [
  156.                         'orderNumber' => 60,
  157.                     ],
  158.                 ]);
  159.                 $item->setCurrent(false);
  160.             }
  161.         }
  162.     }
  163.     private function addSiteSkeletonItem(ItemInterface $menu): void
  164.     {
  165.         $siteSkeletonsLocationId $this->configResolver->getParameter('site_factory.site_skeletons_location_id');
  166.         $siteSkeletonsLocationMenuItem $this->menuItemFactory->createLocationMenuItem(
  167.             self::ITEM_SITE_SKELETON,
  168.             $siteSkeletonsLocationId,
  169.             [
  170.                 'extras' => [
  171.                     'orderNumber' => 80,
  172.                 ],
  173.             ]
  174.         );
  175.         if ($siteSkeletonsLocationMenuItem !== null) {
  176.             $settingsGroup $menu->addChild(self::ITEM_SETTINGS_GROUPS);
  177.             $settingsGroup->addChild($siteSkeletonsLocationMenuItem);
  178.         }
  179.     }
  180. }
  181. class_alias(ConfigureMainMenuListener::class, 'EzSystems\EzPlatformSiteFactoryBundle\Menu\Listener\ConfigureMainMenuListener');