<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use A4BGroup\A4bThemeBundle\Event\SidebarMenuEvent;
use A4BGroup\A4bThemeBundle\Event\BreadcrumbMenuEvent;
use A4BGroup\A4bThemeBundle\Model\MenuItemInterface;
use A4BGroup\A4bThemeBundle\Model\MenuItemModel;
use App\Entity\System\Employee;
use App\Service\AdminRouteSecurityService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\Request;
/**
* Class SidebarMenuBuilderSubscriber configures the main navigation.
*/
class SidebarMenuBuilderSubscriber implements EventSubscriberInterface
{
private Security $security;
private TranslatorInterface $translatorService;
private AdminRouteSecurityService $adminRouteSecurityService;
public function __construct(
Security $security,
TranslatorInterface $translatorService,
AdminRouteSecurityService $adminRouteSecurityService
) {
$this->security = $security;
$this->translatorService = $translatorService;
$this->adminRouteSecurityService = $adminRouteSecurityService;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
SidebarMenuEvent::class => 'onSetup',
BreadcrumbMenuEvent::class => 'onSetup',
];
}
/**
* Generate the main menu.
*
* @param SidebarMenuEvent $event
*/
public function onSetup(SidebarMenuEvent $event): void
{
/** @var Employee $employee */
$employee = $this->security->getUser();
$this->translatorService->setLocale($employee->getLocale() ?? \Locale::getDefault());
$event->addItem(
new MenuItemModel(
'admin_dashboard',
'Dashboard',
'admin_dashboard_index',
[],
'fa-solid fa-grid-horizontal'
)
);
$event->addItem(
new MenuItemModel(
'admin_cache_index',
'Cache',
'admin_cache_index',
[],
'fa-solid fa-recycle'
)
);
$event->addItem(
new MenuItemModel(
'logs',
$this->translatorService->trans('menu.item.logs'),
'logs_admin_index',
[],
'fal fa-tag'
)
);
// MENU ACCOUNTING START
$accounting = new MenuItemModel(
'accounting',
$this->translatorService->trans('menu.item.accounting'),
'',
[],
'fal fa-user',
);
$accounting->addChild(
new MenuItemModel(
'customers',
$this->translatorService->trans('menu.item.customers'),
'customer_admin_index',
[]
)
);
$accounting->addChild(
new MenuItemModel(
'orders',
$this->translatorService->trans('menu.item.orders'),
'order_admin_index',
[]
)
);
$accounting->addChild(
new MenuItemModel(
'orders_cancellation',
'Solicitudes de cancelación de pedido',
'order_cancellation_request_admin_index',
[]
)
);
$accounting->addChild(
new MenuItemModel(
'carts',
$this->translatorService->trans('menu.item.carts'),
'cart_admin_index',
[]
)
);
$accounting->addChild(
new MenuItemModel(
'vies',
$this->translatorService->trans('menu.item.vies'),
'vies_admin_index',
[]
)
);
$accounting->addChild(
new MenuItemModel(
'wishlist',
$this->translatorService->trans('menu.item.wishlist'),
'wishlist_admin_index',
[]
)
);
$accounting->addChild(
new MenuItemModel(
'ftp',
$this->translatorService->trans('menu.item.ftp'),
'ftp_admin_index',
[]
)
);
$accounting->addChild(
new MenuItemModel(
'access control',
$this->translatorService->trans('menu.item.access_control'),
'customer_authentication_access_control_admin_index',
[]
)
);
$accounting->addChild(
new MenuItemModel(
'access control log',
$this->translatorService->trans('menu.item.access_control_log'),
'customer_authentication_access_control_log_admin_index',
[]
)
);
$event->addItem($accounting);
$packs = new MenuItemModel(
'packs',
$this->translatorService->trans('menu.item.packs'),
'',
[],
'fal fa-box',
);
$packs->addChild(
new MenuItemModel(
'purchasedPacks',
$this->translatorService->trans('menu.item.purchased_packs'),
'subscription_customer_admin_index',
[]
)
);
$event->addItem($packs);
$stripe = new MenuItemModel(
'stripe',
$this->translatorService->trans('menu.item.stripe'),
'',
[],
'fal fa-box',
);
$stripe->addChild(
new MenuItemModel(
'stripeSubscriptions',
$this->translatorService->trans('menu.item.stripe_subscriptions'),
'stripe_subscription_admin_index',
[]
)
);
$stripe->addChild(
new MenuItemModel(
'stripeNotifications',
$this->translatorService->trans('menu.item.stripe_notifications'),
'stripe_notification_admin_index',
[]
)
);
$event->addItem($stripe);
$returns = new MenuItemModel(
'returns',
$this->translatorService->trans('menu.item.returns'),
'return_admin_index',
[],
'fa-sharp fa-light fa-person-walking-arrow-loop-left',
);
$event->addItem($returns);
$catalog = new MenuItemModel(
'catalog',
$this->translatorService->trans('menu.item.catalog'),
'',
[],
'fa-sharp fa-light fa-boxes-stacked',
);
$catalog->addChild(
new MenuItemModel(
'product',
$this->translatorService->trans('menu.product'),
'product_admin_index',
[],
'fa-sharp fa-light fa-box',
)
);
$catalog->addChild(
new MenuItemModel(
'product_stock',
$this->translatorService->trans('menu.product_stock'),
'product_stock_admin_index',
[],
'fa-sharp fa-light fa-box',
)
);
$catalog->addChild(
new MenuItemModel(
'product_attribute',
$this->translatorService->trans('menu.product_attribute'),
'product_attribute_admin_index',
[],
'fa-sharp fa-light fa-box',
)
);
$catalog->addChild(
new MenuItemModel(
'taxonomy',
$this->translatorService->trans('menu.taxonomy'),
'taxonomy_admin_index',
[],
'fa-sharp fa-light fa-box',
)
);
$catalog->addChild(
new MenuItemModel(
'catalog',
$this->translatorService->trans('menu.catalog'),
'catalog_admin_index',
[],
'fa-sharp fa-light fa-box',
)
);
$catalog->addChild(
new MenuItemModel(
'gpsr',
$this->translatorService->trans('menu.item.gpsr'),
'gpsr_admin_index',
[],
'fa-sharp fa-light fa-box',
)
);
$event->addItem($catalog);
$report = new MenuItemModel(
'report',
$this->translatorService->trans('menu.item.report'),
'',
[],
'fal fa-list'
);
$report->addChild(
new MenuItemModel(
'order_report',
$this->translatorService->trans('menu.item.customer_order_report'),
'customer_order_info_report_admin_index',
[]
)
);
$report->addChild(
new MenuItemModel(
'paypal_payer_detail',
$this->translatorService->trans('menu.item.paypal_payer_detail'),
'paypal_payer_detail_admin_index',
[]
)
);
$event->addItem($report);
$configuration = new MenuItemModel(
'configuration',
$this->translatorService->trans('menu.item.configuration'),
'',
[],
'fal fa-gear'
);
$configuration->addChild(
new MenuItemModel(
'paymentMethodConfiguration',
$this->translatorService->trans('menu.item.payment_method_configuration'),
'payment_method_configuration_admin_index',
[]
)
);
$configuration->addChild(
new MenuItemModel(
'discountCode',
$this->translatorService->trans('menu.item.discount_code_configuration'),
'code_discount_admin_index',
[]
)
);
$configuration->addChild(
new MenuItemModel(
'discountCodeRule',
'Discount code rules',
// $this->translatorService->trans('menu.item.discount_code_rule_configuration'),
'code_discount_rule_admin_index',
[]
)
);
$configuration->addChild(
new MenuItemModel(
'language',
$this->translatorService->trans('menu.item.language'),
'language_admin_index',
[]
)
);
$configuration->addChild(
new MenuItemModel(
'country',
$this->translatorService->trans('menu.item.country'),
'country_admin_index',
[]
)
);
$configuration->addChild(
new MenuItemModel(
'state',
$this->translatorService->trans('menu.item.state'),
'state_admin_index',
[]
)
);
$configuration->addChild(
new MenuItemModel(
'employee',
$this->translatorService->trans('menu.item.employees'),
'employee_admin_index',
[]
)
);
$configuration->addChild(
new MenuItemModel(
'acl',
$this->translatorService->trans('menu.item.routes'),
'acl_admin_index',
[]
)
);
$event->addItem($configuration);
$services = new MenuItemModel(
'services',
$this->translatorService->trans('menu.item.services'),
'',
[],
'fal fa-cart-shopping'
);
$services->addChild(
new MenuItemModel(
'service_list',
$this->translatorService->trans('menu.item.services_list'),
'service_admin_index',
[]
)
);
$event->addItem($services);
$tapfiliate = new MenuItemModel(
'tapfiliate',
$this->translatorService->trans('menu.item.tapfiliate'),
'',
[],
'fal fa-cart-shopping',
);
$tapfiliate->addChild(
new MenuItemModel(
'tapfiliate_customers',
$this->translatorService->trans('menu.item.tapfiliate_customers'),
'admin_tapfiliate_customers',
[]
)
);
$tapfiliate->addChild(
new MenuItemModel(
'tapfiliate_conversion',
$this->translatorService->trans('menu.item.tapfiliate_conversion'),
'admin_tapfiliate_conversion',
[]
)
);
$event->addItem($tapfiliate);
$event->addItem(
new MenuItemModel(
'old_admin',
'Old Admin Panel',
'old_admin',
[],
'fa fa-home'
)
);
$request = $event->getRequest();
$this->accessControlEvent($event);
/** @var MenuItemModel[] $items */
$items = $event->getItems();
$this->activateByRoute(
$request,
$event->getRequest()->get('_route'),
$items
);
}
/**
* @param MenuItemModel[] $items
*/
protected function activateByRoute(
Request $request,
?string $route,
array $items
): void {
if (empty($route)) {
return;
}
foreach ($items as $item) {
if ($item->hasChildren()) {
$this->activateByRoute($request, $route, $item->getChildren());
} elseif ($item->getRoute() === $route) {
$item->setActive(true);
return;
}
}
}
protected function accessControlEvent(
SidebarMenuEvent $event
): void {
foreach ($event->getItems() as $item) {
if (!empty($item->getRoute()) && !$this->adminRouteSecurityService->accessToRoute($item->getRoute())) {
$event->removeItem($item);
continue;
}
if ($item->hasChildren()) {
$this->accessControlItem($item);
if (!$item->hasChildren() && $item->getRoute() === '') {
$event->removeItem($item);
}
} elseif ($item->getRoute() === '') {
$event->removeItem($item);
}
}
}
protected function accessControlItem(
MenuItemInterface $item
): void {
$a = 0;
/** @var MenuItemModel $child */
foreach ($item->getChildren() as $child) {
if (!empty($child->getRoute()) && !$this->adminRouteSecurityService->accessToRoute($child->getRoute())) {
$item->removeChild($child);
continue;
}
if ($child->hasChildren()) {
$this->accessControlItem($child);
if (!$child->hasChildren() && $child->getRoute() === '') {
$item->removeChild($child);
}
} elseif ($child->getRoute() === '') {
$item->removeChild($child);
}
}
}
}