src/Component/AdminMenu/EventSubscriber/SettingMenuSubscriber.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\Component\AdminMenu\EventSubscriber;
  3. use App\Component\AdminMenu\Event\AbstractBuildMenuEvent;
  4. use App\Component\AdminMenu\MenuBuilder;
  5. use App\Component\UserRole\Permission\UserRolePermission;
  6. use App\Form\Setting\AbstractSettingType;
  7. use App\Type\TypeCollection;
  8. use Flagception\Manager\FeatureManagerInterface;
  9. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  10. use Symfony\Contracts\Translation\TranslatorInterface;
  11. class SettingMenuSubscriber extends AbstractMenuBuildEventSubscriber
  12. {
  13.     protected static int $priority = -200;
  14.     protected TypeCollection $typeCollection;
  15.     protected TranslatorInterface $translator;
  16.     public function __construct(
  17.         AuthorizationCheckerInterface $authorizationChecker,
  18.         FeatureManagerInterface $featureManager,
  19.         TypeCollection $typeCollection,
  20.         TranslatorInterface $translator
  21.     ) {
  22.         parent::__construct($authorizationChecker$featureManager);
  23.         $this->typeCollection $typeCollection;
  24.         $this->translator $translator;
  25.     }
  26.     public function buildMenu(AbstractBuildMenuEvent $event)
  27.     {
  28.         if (!$this->authorizationChecker->isGranted('ROLE_ADMIN_USER')
  29.             || !$this->authorizationChecker->isGranted(
  30.                 UserRolePermission::MASK_VIEW,
  31.                 AbstractSettingType::class)) {
  32.             return;
  33.         }
  34.         $trans = [$this->translator'trans'];
  35.         $menuBuilder $this->getMenuBuilder($event->getMenu())
  36.             ->addMainItem('Settings''fal fa-cog')
  37.             ->addOverlay();
  38.         $generalSettings $this->typeCollection->getTypesByGroup(TypeCollection::GROUP_GENERAL);
  39.         $generalSettingRoutes $this->mapRoutes($generalSettings);
  40.         $generalSettingRoutes[$trans('Appearance', [], 'admin')] = ['route' => 'admin_appearance_index'];
  41.         $generalSettingRoutes[$trans('User roles', [], 'admin')] = ['route' => 'admin_user_role_index'];
  42.         $generalSettingRoutes[$trans('forms.overview', [], 'admin')] = ['route' => 'admin_forms'];
  43.         $menuBuilder->addSection('General settings');
  44.         $this->renderColumns($menuBuilder$generalSettingRoutes'General''fal fa-cog');
  45.         $menuBuilder->end();
  46.         $menuBuilder->addSection('Vacancy settings');
  47.         $this->renderColumns(
  48.             $menuBuilder,
  49.             $this->mapRoutes($this->typeCollection->getTypesByGroup(TypeCollection::GROUP_VACANCY)),
  50.             'Vacancy',
  51.             'fal fa-suitcase'
  52.         );
  53.         $this->renderColumns(
  54.             $menuBuilder,
  55.             $this->mapRoutes($this->typeCollection->getTypesByGroup(TypeCollection::GROUP_ATS)),
  56.             'ATS',
  57.             'fal fa-users-cog'
  58.         );
  59.         $menuBuilder->end();
  60.         $moduleRoutes $this->mapRoutes($this->typeCollection->getTypesByGroup(TypeCollection::GROUP_MODULES));
  61.         if ($this->featureManager->isActive('feature_salary_scale')) {
  62.             $salaryScaleName $this->translator->trans(id'salary_scale'domain'admin');
  63.             $moduleRoutes[$salaryScaleName] = ['route' => 'admin_feature_salary_scale_index'];
  64.         }
  65.         $menuBuilder->addSection('Module settings');
  66.         $this->renderColumns(
  67.             $menuBuilder,
  68.             $moduleRoutes,
  69.             'Modules',
  70.             'fal fa-cubes'
  71.         );
  72.         $this->renderColumns(
  73.             $menuBuilder,
  74.             $this->mapRoutes($this->typeCollection->getTypesByGroup(TypeCollection::GROUP_EXTERNAL_PLUGINGS)),
  75.             'External plugins',
  76.             'fal fa-plug'
  77.         );
  78.         $menuBuilder->end();
  79.     }
  80.     private function mapRoutes(array $settings): array
  81.     {
  82.         $routes = [];
  83.         foreach ($settings as $settingName => $setting) {
  84.             $routes[$this->translator->trans($settingName, [], 'admin')] = [
  85.                 'route' => 'admin_settings',
  86.                 'params' => ['type' => $settingName],
  87.             ];
  88.         }
  89.         return $routes;
  90.     }
  91.     private function renderColumns(
  92.         MenuBuilder $menuBuilder,
  93.         array $routes,
  94.         string $name,
  95.         string $icon
  96.     ) {
  97.         ksort($routes);
  98.         $columns array_chunk($routes6true);
  99.         $first true;
  100.         foreach ($columns as $column) {
  101.             if ($first) {
  102.                 $menuBuilder->addColumn($name$icon);
  103.             } else {
  104.                 $menuBuilder->addColumn();
  105.             }
  106.             foreach ($column as $settingName => $item) {
  107.                 $menuBuilder->addItem($settingName$item['route'], $item['params'] ?? []);
  108.             }
  109.             $menuBuilder->end();
  110.             $first false;
  111.         }
  112.     }
  113. }