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