vendor/ibexa/personalization/src/lib/Event/Listener/ConfigurePersonalizationMenuListener.php line 55

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\Personalization\Event\Listener;
  8. use Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent;
  9. use Ibexa\AdminUi\Menu\MenuItemFactory;
  10. use Ibexa\Personalization\Exception\CustomerIdNotFoundException;
  11. use Ibexa\Personalization\Permission\PermissionCheckerInterface;
  12. use Ibexa\Personalization\Security\Service\SecurityServiceInterface;
  13. use Ibexa\Personalization\Service\Setting\SettingServiceInterface;
  14. use JMS\TranslationBundle\Model\Message;
  15. use JMS\TranslationBundle\Translation\TranslationContainerInterface;
  16. use Knp\Menu\ItemInterface;
  17. use Knp\Menu\Util\MenuManipulator;
  18. final class ConfigurePersonalizationMenuListener implements TranslationContainerInterface
  19. {
  20.     private const TRANSLATION_DOMAIN 'ibexa_menu';
  21.     private const ITEM_PERSONALIZATION 'main__personalization';
  22.     private const ITEM_PERSONALIZATION__GROUP_SETTINGS 'main__personalization__group_settings';
  23.     private const ITEM_PERSONALIZATION__DASHBOARD 'main__personalization__dashboard';
  24.     private const ITEM_PERSONALIZATION__MODELS 'main__personalization__models';
  25.     private const ITEM_PERSONALIZATION__SCENARIOS 'main__personalization__scenarios';
  26.     private const ITEM_PERSONALIZATION__IMPORT 'main__personalization__import';
  27.     private MenuItemFactory $menuItemFactory;
  28.     private SecurityServiceInterface $securityService;
  29.     private PermissionCheckerInterface $permissionChecker;
  30.     private SettingServiceInterface $settingService;
  31.     public function __construct(
  32.         MenuItemFactory $menuItemFactory,
  33.         SecurityServiceInterface $securityService,
  34.         PermissionCheckerInterface $permissionChecker,
  35.         SettingServiceInterface $settingService
  36.     ) {
  37.         $this->menuItemFactory $menuItemFactory;
  38.         $this->securityService $securityService;
  39.         $this->permissionChecker $permissionChecker;
  40.         $this->settingService $settingService;
  41.     }
  42.     /**
  43.      * @param \Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent $event
  44.      */
  45.     public function renderMenu(ConfigureMenuEvent $event): void
  46.     {
  47.         $menu $event->getMenu();
  48.         $manipulator = new MenuManipulator();
  49.         $this->configurePersonalizationMenu($menu$manipulator);
  50.     }
  51.     private function configurePersonalizationMenu(ItemInterface $menuMenuManipulator $menuManipulator): void
  52.     {
  53.         if ($this->permissionChecker->canView($this->getCustomerId())) {
  54.             $personalizationMenu $this->menuItemFactory
  55.                 ->createItem(self::ITEM_PERSONALIZATION, [
  56.                     'attributes' => [
  57.                         'data-tooltip-placement' => 'right',
  58.                         'data-tooltip-extra-class' => 'ibexa-tooltip--navigation',
  59.                     ],
  60.                     'extras' => [
  61.                         'icon' => 'personalize',
  62.                         'orderNumber' => 120,
  63.                     ],
  64.                 ])
  65.                 ->setChildren(
  66.                     $this->getPersonalizationMenuItems(
  67.                         $this->getCustomerId()
  68.                     )
  69.                 );
  70.             $menu->addChild($personalizationMenu);
  71.             $menuManipulator->moveToLastPosition($personalizationMenu);
  72.         }
  73.     }
  74.     /**
  75.      * @return \Knp\Menu\ItemInterface[]
  76.      */
  77.     private function getPersonalizationMenuItems(int $customerId): array
  78.     {
  79.         $settingsRoot $this->menuItemFactory->createItem(
  80.             self::ITEM_PERSONALIZATION__GROUP_SETTINGS,
  81.         );
  82.         $settingsRoot->addChild(
  83.             self::ITEM_PERSONALIZATION__MODELS,
  84.             [
  85.                 'route' => 'ibexa.personalization.models',
  86.                 'routeParameters' => [
  87.                     'customerId' => $customerId,
  88.                 ],
  89.                 'extras' => [
  90.                     'routes' => [
  91.                         'edit' => 'ibexa.personalization.model.edit',
  92.                         'details' => 'ibexa.personalization.model.details',
  93.                     ],
  94.                 ],
  95.             ]
  96.         );
  97.         $settingsRoot->addChild(
  98.             self::ITEM_PERSONALIZATION__SCENARIOS,
  99.             [
  100.                 'route' => 'ibexa.personalization.scenarios',
  101.                 'routeParameters' => [
  102.                     'customerId' => $customerId,
  103.                 ],
  104.                 'extras' => [
  105.                     'routes' => [
  106.                         'create' => 'ibexa.personalization.scenario.create',
  107.                         'edit' => 'ibexa.personalization.scenario.edit',
  108.                         'details' => 'ibexa.personalization.scenario.details',
  109.                         'preview' => 'ibexa.personalization.scenario.preview',
  110.                     ],
  111.                 ],
  112.             ]
  113.         );
  114.         return [
  115.             self::ITEM_PERSONALIZATION__DASHBOARD => $this->menuItemFactory->createItem(
  116.                 self::ITEM_PERSONALIZATION__DASHBOARD,
  117.                 [
  118.                     'route' => 'ibexa.personalization.dashboard',
  119.                     'routeParameters' => [
  120.                         'customerId' => $customerId,
  121.                     ],
  122.                 ]
  123.             ),
  124.             self::ITEM_PERSONALIZATION__IMPORT => $this->menuItemFactory->createItem(
  125.                 self::ITEM_PERSONALIZATION__IMPORT,
  126.                 [
  127.                     'route' => 'ibexa.personalization.import',
  128.                     'routeParameters' => [
  129.                         'customerId' => $customerId,
  130.                     ],
  131.                 ]
  132.             ),
  133.             self::ITEM_PERSONALIZATION__GROUP_SETTINGS => $settingsRoot,
  134.         ];
  135.     }
  136.     /**
  137.      * {@inheritdoc}
  138.      */
  139.     public static function getTranslationMessages(): array
  140.     {
  141.         return [
  142.             (new Message(self::ITEM_PERSONALIZATIONself::TRANSLATION_DOMAIN))->setDesc('Personalization'),
  143.             (new Message(self::ITEM_PERSONALIZATION__DASHBOARDself::TRANSLATION_DOMAIN))->setDesc('Dashboard'),
  144.             (new Message(self::ITEM_PERSONALIZATION__MODELSself::TRANSLATION_DOMAIN))->setDesc('Models'),
  145.             (new Message(self::ITEM_PERSONALIZATION__SCENARIOSself::TRANSLATION_DOMAIN))->setDesc('Scenarios'),
  146.             (new Message(self::ITEM_PERSONALIZATION__IMPORTself::TRANSLATION_DOMAIN))->setDesc('Import'),
  147.             (new Message(self::ITEM_PERSONALIZATION__GROUP_SETTINGSself::TRANSLATION_DOMAIN))->setDesc('Settings'),
  148.         ];
  149.     }
  150.     private function getCustomerId(): int
  151.     {
  152.         $customerIdFromRequest $this->settingService->getCustomerIdFromRequest();
  153.         if (null !== $customerIdFromRequest) {
  154.             return $customerIdFromRequest;
  155.         }
  156.         if (!$this->securityService->hasGrantedAccess()) {
  157.             return 0;
  158.         }
  159.         $firstConfiguredCustomerId $this->securityService->getCurrentCustomerId();
  160.         /** Returns first configured customer id with granted access */
  161.         if (null !== $firstConfiguredCustomerId) {
  162.             return $firstConfiguredCustomerId;
  163.         }
  164.         throw new CustomerIdNotFoundException();
  165.     }
  166. }
  167. class_alias(ConfigurePersonalizationMenuListener::class, 'Ibexa\Platform\Personalization\Event\Listener\ConfigurePersonalizationMenuListener');