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.         $this->renderColumns(
  79.             $menuBuilder,
  80.             [
  81.                 $this->translator->trans('swatches.title', [], 'admin') => ['route' => 'admin_swatch_index'],
  82.             ],
  83.             $this->translator->trans('theming.title', [], 'admin'),
  84.             'fal fa-palette'
  85.         );
  86.         $menuBuilder->end();
  87.     }
  88.     private function mapRoutes(array $settings): array
  89.     {
  90.         $routes = [];
  91.         foreach ($settings as $settingName => $setting) {
  92.             $data = [
  93.                 'route' => 'admin_settings',
  94.                 'params' => ['type' => $settingName],
  95.                 'acl' => '',
  96.             ];
  97.             if ($setting instanceof AbstractSettingType) {
  98.                 $data['acl'] = $setting::getAclName();
  99.             }
  100.             $routes[$this->translator->trans($settingName, [], 'admin')] = $data;
  101.         }
  102.         return $routes;
  103.     }
  104.     private function renderColumns(
  105.         MenuBuilder $menuBuilder,
  106.         array $routes,
  107.         string $name,
  108.         string $icon
  109.     ) {
  110.         ksort($routes);
  111.         $columns array_chunk(
  112.             array_filter($routes, function (array $item) {
  113.                 if (\array_key_exists('acl'$item)) {
  114.                     return $this->authorizationChecker->isGranted(UserRolePermission::MASK_VIEW$item['acl']);
  115.                 }
  116.                 return true;
  117.             }),
  118.             6,
  119.             true
  120.         );
  121.         $first true;
  122.         foreach ($columns as $column) {
  123.             if ($first) {
  124.                 $menuBuilder->addColumn($name$icon);
  125.             } else {
  126.                 $menuBuilder->addColumn();
  127.             }
  128.             foreach ($column as $settingName => $item) {
  129.                 $menuBuilder->addItem($settingName$item['route'], $item['params'] ?? []);
  130.             }
  131.             $menuBuilder->end();
  132.             $first false;
  133.         }
  134.     }
  135. }