src/EventSubscriber/SidebarMenuBuilderSubscriber.php line 53

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use A4BGroup\A4bThemeBundle\Event\SidebarMenuEvent;
  5. use A4BGroup\A4bThemeBundle\Event\BreadcrumbMenuEvent;
  6. use A4BGroup\A4bThemeBundle\Model\MenuItemInterface;
  7. use A4BGroup\A4bThemeBundle\Model\MenuItemModel;
  8. use App\Entity\System\Employee;
  9. use App\Service\AdminRouteSecurityService;
  10. use App\Service\SecurityService;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Contracts\Translation\TranslatorInterface;
  13. use Symfony\Component\HttpFoundation\Request;
  14. /**
  15. * Class SidebarMenuBuilderSubscriber configures the main navigation.
  16. */
  17. class SidebarMenuBuilderSubscriber implements EventSubscriberInterface
  18. {
  19. private TranslatorInterface $translatorService;
  20. private AdminRouteSecurityService $adminRouteSecurityService;
  21. private SecurityService $securityService;
  22. public function __construct(
  23. TranslatorInterface $translatorService,
  24. AdminRouteSecurityService $adminRouteSecurityService,
  25. SecurityService $securityService,
  26. ) {
  27. $this->translatorService = $translatorService;
  28. $this->adminRouteSecurityService = $adminRouteSecurityService;
  29. $this->securityService = $securityService;
  30. }
  31. /**
  32. * @return array
  33. */
  34. public static function getSubscribedEvents(): array
  35. {
  36. return [
  37. SidebarMenuEvent::class => 'onSetup',
  38. BreadcrumbMenuEvent::class => 'onSetup',
  39. ];
  40. }
  41. /**
  42. * Generate the main menu.
  43. *
  44. * @param SidebarMenuEvent $event
  45. */
  46. public function onSetup(SidebarMenuEvent $event): void
  47. {
  48. /** @var Employee $employee */
  49. $employee = $this->securityService->findSessionEmployee();
  50. $event->addItem(
  51. new MenuItemModel(
  52. 'admin_dashboard',
  53. 'Dashboard',
  54. 'admin_dashboard_index',
  55. [],
  56. 'fa-solid fa-house'
  57. )
  58. );
  59. $event->addItem(
  60. new MenuItemModel(
  61. 'admin_cache_index',
  62. 'Cache',
  63. 'admin_cache_index',
  64. [],
  65. 'fa-solid fa-recycle'
  66. )
  67. );
  68. $event->addItem(
  69. new MenuItemModel(
  70. 'logs',
  71. $this->translatorService->trans('menu.item.logs'),
  72. 'logs_admin_index',
  73. [],
  74. 'fal fa-tag'
  75. )
  76. );
  77. // MENU ACCOUNTING START
  78. $accounting = new MenuItemModel(
  79. 'accounting',
  80. $this->translatorService->trans('menu.item.accounting'),
  81. '',
  82. [],
  83. 'fal fa-address-book',
  84. );
  85. $accounting->addChild(
  86. new MenuItemModel(
  87. 'customers',
  88. $this->translatorService->trans('menu.item.customers'),
  89. 'customer_admin_index',
  90. []
  91. )
  92. );
  93. $accounting->addChild(
  94. new MenuItemModel(
  95. 'customers_invalid_subscriptions',
  96. $this->translatorService->trans('menu.item.customers_invalid_subscriptions'),
  97. 'customer_admin_invalid_subscriptions',
  98. []
  99. )
  100. );
  101. $accounting->addChild(
  102. new MenuItemModel(
  103. 'orders',
  104. $this->translatorService->trans('menu.item.orders'),
  105. 'order_admin_index',
  106. []
  107. )
  108. );
  109. $accounting->addChild(
  110. new MenuItemModel(
  111. 'virtual_orders',
  112. $this->translatorService->trans('menu.item.virtual.orders'),
  113. 'admin_virtual_orders',
  114. []
  115. )
  116. );
  117. $accounting->addChild(
  118. new MenuItemModel(
  119. 'orders_cancellation',
  120. 'Solicitudes de cancelación de pedido',
  121. 'order_cancellation_request_admin_index',
  122. []
  123. )
  124. );
  125. $accounting->addChild(
  126. new MenuItemModel(
  127. 'carts',
  128. $this->translatorService->trans('menu.item.carts'),
  129. 'cart_admin_index',
  130. []
  131. )
  132. );
  133. $accounting->addChild(
  134. new MenuItemModel(
  135. 'vies',
  136. $this->translatorService->trans('menu.item.vies'),
  137. 'vies_admin_index',
  138. []
  139. )
  140. );
  141. $accounting->addChild(
  142. new MenuItemModel(
  143. 'wishlist',
  144. $this->translatorService->trans('menu.item.wishlist'),
  145. 'wishlist_admin_index',
  146. []
  147. )
  148. );
  149. $accounting->addChild(
  150. new MenuItemModel(
  151. 'ftp',
  152. $this->translatorService->trans('menu.item.ftp'),
  153. 'ftp_admin_index',
  154. []
  155. )
  156. );
  157. $accounting->addChild(
  158. new MenuItemModel(
  159. 'access control',
  160. $this->translatorService->trans('menu.item.access_control'),
  161. 'customer_authentication_access_control_admin_index',
  162. []
  163. )
  164. );
  165. $accounting->addChild(
  166. new MenuItemModel(
  167. 'access control log',
  168. $this->translatorService->trans('menu.item.access_control_log'),
  169. 'customer_authentication_access_control_log_admin_index',
  170. []
  171. )
  172. );
  173. $accounting->addChild(
  174. new MenuItemModel(
  175. 'force passwd update',
  176. $this->translatorService->trans('menu.item.force_passwd_update'),
  177. 'admin_password_reset_index',
  178. []
  179. )
  180. );
  181. $event->addItem($accounting);
  182. $packs = new MenuItemModel(
  183. 'packs',
  184. $this->translatorService->trans('menu.item.packs'),
  185. '',
  186. [],
  187. 'fal fa-box',
  188. );
  189. $packs->addChild(
  190. new MenuItemModel(
  191. 'purchasedPacks',
  192. $this->translatorService->trans('menu.item.purchased_packs'),
  193. 'subscription_customer_admin_index',
  194. []
  195. )
  196. );
  197. $packs->addChild(
  198. new MenuItemModel(
  199. 'historyPacks',
  200. $this->translatorService->trans('menu.item.history_packs'),
  201. 'admin_subscription_customer_history',
  202. []
  203. )
  204. );
  205. $event->addItem($packs);
  206. $shops = new MenuItemModel(
  207. 'shops',
  208. $this->translatorService->trans('menu.item.shops'),
  209. '',
  210. [],
  211. 'fa-sharp fa-light fa-shop',
  212. );
  213. $shops->addChild(
  214. new MenuItemModel(
  215. 'shops',
  216. $this->translatorService->trans('menu.shops'),
  217. 'shops_admin_index',
  218. [],
  219. )
  220. );
  221. $shops->addChild(
  222. new MenuItemModel(
  223. 'shops_active',
  224. $this->translatorService->trans('menu.shops.active'),
  225. 'shops_admin_filter_active',
  226. [],
  227. )
  228. );
  229. $shops->addChild(
  230. new MenuItemModel(
  231. 'shops_prestashop',
  232. $this->translatorService->trans('menu.shops.prestashop'),
  233. 'shops_admin_filter_prestashop',
  234. [],
  235. )
  236. );
  237. $shops->addChild(
  238. new MenuItemModel(
  239. 'shops_shopify',
  240. $this->translatorService->trans('menu.shops.shopify'),
  241. 'shops_admin_filter_shopify',
  242. [],
  243. )
  244. );
  245. $event->addItem($shops);
  246. $stripe = new MenuItemModel(
  247. 'stripe',
  248. $this->translatorService->trans('menu.item.stripe'),
  249. '',
  250. [],
  251. 'fa-brands fa-stripe-s',
  252. );
  253. $stripe->addChild(
  254. new MenuItemModel(
  255. 'stripeSubscriptions',
  256. $this->translatorService->trans('menu.item.stripe_subscriptions'),
  257. 'stripe_subscription_admin_index',
  258. []
  259. )
  260. );
  261. $stripe->addChild(
  262. new MenuItemModel(
  263. 'stripeNotifications',
  264. $this->translatorService->trans('menu.item.stripe_notifications'),
  265. 'stripe_notification_admin_index',
  266. []
  267. )
  268. );
  269. $event->addItem($stripe);
  270. $returns = new MenuItemModel(
  271. 'returns',
  272. $this->translatorService->trans('menu.item.returns'),
  273. '',
  274. [],
  275. 'fal fa-right-left',
  276. );
  277. $returns->addChild(
  278. new MenuItemModel(
  279. 'return_admin_index',
  280. $this->translatorService->trans('menu.item.return_admin'),
  281. 'return_admin_index',
  282. []
  283. )
  284. );
  285. $returns->addChild(
  286. new MenuItemModel(
  287. 'return_admin_filter_sat',
  288. $this->translatorService->trans('menu.item.return_admin.sat'),
  289. 'return_admin_filter_sat',
  290. [],
  291. )
  292. );
  293. $event->addItem($returns);
  294. $catalog = new MenuItemModel(
  295. 'catalog',
  296. $this->translatorService->trans('menu.item.catalog'),
  297. '',
  298. [],
  299. 'fa-sharp fa-light fa-list-tree',
  300. );
  301. $catalog->addChild(
  302. new MenuItemModel(
  303. 'product',
  304. $this->translatorService->trans('menu.product'),
  305. 'product_admin_index',
  306. [],
  307. )
  308. );
  309. $catalog->addChild(
  310. new MenuItemModel(
  311. 'taxonomy',
  312. $this->translatorService->trans('menu.taxonomy'),
  313. 'taxonomy_admin_index',
  314. [],
  315. )
  316. );
  317. $catalog->addChild(
  318. new MenuItemModel(
  319. 'catalog',
  320. $this->translatorService->trans('menu.catalog'),
  321. 'catalog_admin_index',
  322. [],
  323. )
  324. );
  325. $catalog->addChild(
  326. new MenuItemModel(
  327. 'gpsr',
  328. $this->translatorService->trans('menu.item.gpsr'),
  329. 'gpsr_admin_index',
  330. [],
  331. )
  332. );
  333. $event->addItem($catalog);
  334. $report = new MenuItemModel(
  335. 'report',
  336. $this->translatorService->trans('menu.item.report'),
  337. '',
  338. [],
  339. 'fal fa-cart-shopping'
  340. );
  341. $report->addChild(
  342. new MenuItemModel(
  343. 'paypal_payer_detail',
  344. $this->translatorService->trans('menu.item.paypal_payer_detail'),
  345. 'paypal_payer_detail_admin_index',
  346. []
  347. )
  348. );
  349. $report->addChild(
  350. new MenuItemModel(
  351. 'order_file_batches',
  352. $this->translatorService->trans('menu.item.order_file_batches'),
  353. 'order_file_batch_admin_index',
  354. []
  355. )
  356. );
  357. $event->addItem($report);
  358. $configuration = new MenuItemModel(
  359. 'configuration',
  360. $this->translatorService->trans('menu.item.configuration'),
  361. '',
  362. [],
  363. 'fal fa-gear'
  364. );
  365. $configuration->addChild(
  366. new MenuItemModel(
  367. 'paymentMethodConfiguration',
  368. $this->translatorService->trans('menu.item.payment_method_configuration'),
  369. 'payment_method_configuration_admin_index',
  370. []
  371. )
  372. );
  373. $configuration->addChild(
  374. new MenuItemModel(
  375. 'discountCode',
  376. $this->translatorService->trans('menu.item.discount_code_configuration'),
  377. 'code_discount_admin_index',
  378. []
  379. )
  380. );
  381. $configuration->addChild(
  382. new MenuItemModel(
  383. 'discountCodeRule',
  384. 'Discount code rules',
  385. // $this->translatorService->trans('menu.item.discount_code_rule_configuration'),
  386. 'code_discount_rule_admin_index',
  387. []
  388. )
  389. );
  390. $configuration->addChild(
  391. new MenuItemModel(
  392. 'language',
  393. $this->translatorService->trans('menu.item.language'),
  394. 'language_admin_index',
  395. []
  396. )
  397. );
  398. $configuration->addChild(
  399. new MenuItemModel(
  400. 'country',
  401. $this->translatorService->trans('menu.item.country'),
  402. 'country_admin_index',
  403. []
  404. )
  405. );
  406. $configuration->addChild(
  407. new MenuItemModel(
  408. 'state',
  409. $this->translatorService->trans('menu.item.state'),
  410. 'state_admin_index',
  411. []
  412. )
  413. );
  414. $configuration->addChild(
  415. new MenuItemModel(
  416. 'employee',
  417. $this->translatorService->trans('menu.item.employees'),
  418. 'employee_admin_index',
  419. []
  420. )
  421. );
  422. $configuration->addChild(
  423. new MenuItemModel(
  424. 'acl',
  425. $this->translatorService->trans('menu.item.routes'),
  426. 'acl_admin_index',
  427. []
  428. )
  429. );
  430. $configuration->addChild(
  431. new MenuItemModel(
  432. 'topSales',
  433. 'Top Ventas',
  434. 'top_sales_admin_index',
  435. []
  436. )
  437. );
  438. $event->addItem($configuration);
  439. $services = new MenuItemModel(
  440. 'services',
  441. $this->translatorService->trans('menu.item.services'),
  442. '',
  443. [],
  444. 'fal fa-network-wired'
  445. );
  446. $services->addChild(
  447. new MenuItemModel(
  448. 'service_list',
  449. $this->translatorService->trans('menu.item.services_list'),
  450. 'service_admin_index',
  451. []
  452. )
  453. );
  454. $event->addItem($services);
  455. $tapfiliate = new MenuItemModel(
  456. 'tapfiliate',
  457. $this->translatorService->trans('menu.item.tapfiliate'),
  458. '',
  459. [],
  460. 'fal fa-money-check',
  461. );
  462. $tapfiliate->addChild(
  463. new MenuItemModel(
  464. 'tapfiliate_customers',
  465. $this->translatorService->trans('menu.item.tapfiliate_customers'),
  466. 'admin_tapfiliate_customers',
  467. []
  468. )
  469. );
  470. $tapfiliate->addChild(
  471. new MenuItemModel(
  472. 'tapfiliate_conversion',
  473. $this->translatorService->trans('menu.item.tapfiliate_conversion'),
  474. 'admin_tapfiliate_conversion',
  475. []
  476. )
  477. );
  478. $event->addItem($tapfiliate);
  479. $event->addItem(
  480. new MenuItemModel(
  481. 'alert_management_admin_index',
  482. $this->translatorService->trans('menu.item.alert_management'),
  483. 'alert_management_admin_index',
  484. [],
  485. 'fa fa-triangle-exclamation'
  486. )
  487. );
  488. $request = $event->getRequest();
  489. $this->accessControlEvent($event);
  490. /** @var MenuItemModel[] $items */
  491. $items = $event->getItems();
  492. $this->activateByRoute(
  493. $request,
  494. $event->getRequest()->get('_route'),
  495. $items
  496. );
  497. }
  498. /**
  499. * @param MenuItemModel[] $items
  500. */
  501. protected function activateByRoute(
  502. Request $request,
  503. ?string $route,
  504. array $items,
  505. ): void {
  506. if (empty($route)) {
  507. return;
  508. }
  509. foreach ($items as $item) {
  510. if ($item->hasChildren()) {
  511. $this->activateByRoute($request, $route, $item->getChildren());
  512. } elseif ($item->getRoute() === $route) {
  513. $item->setActive(true);
  514. return;
  515. }
  516. }
  517. }
  518. protected function accessControlEvent(
  519. SidebarMenuEvent $event,
  520. ): void {
  521. foreach ($event->getItems() as $item) {
  522. if (!empty($item->getRoute()) && !$this->adminRouteSecurityService->accessToRoute($item->getRoute())) {
  523. $event->removeItem($item);
  524. continue;
  525. }
  526. if ($item->hasChildren()) {
  527. $this->accessControlItem($item);
  528. if (!$item->hasChildren() && $item->getRoute() === '') {
  529. $event->removeItem($item);
  530. }
  531. } elseif ($item->getRoute() === '') {
  532. $event->removeItem($item);
  533. }
  534. }
  535. }
  536. protected function accessControlItem(
  537. MenuItemInterface $item,
  538. ): void {
  539. $a = 0;
  540. /** @var MenuItemModel $child */
  541. foreach ($item->getChildren() as $child) {
  542. if (!empty($child->getRoute()) && !$this->adminRouteSecurityService->accessToRoute($child->getRoute())) {
  543. $item->removeChild($child);
  544. continue;
  545. }
  546. if ($child->hasChildren()) {
  547. $this->accessControlItem($child);
  548. if (!$child->hasChildren() && $child->getRoute() === '') {
  549. $item->removeChild($child);
  550. }
  551. } elseif ($child->getRoute() === '') {
  552. $item->removeChild($child);
  553. }
  554. }
  555. }
  556. }