<?php
declare(strict_types=1);
namespace App\Controller\Front;
use App\Application\Service\Helper\ConfigurationService;
use App\Application\Service\Helper\PathService;
use App\Application\Service\Menu\BaseMenuService;
use App\Application\Service\Menu\CorporateMenuService;
use App\Application\Service\Menu\MenuBaseHeaderService;
use App\Application\Service\Menu\ShopMenuService;
use App\Application\Service\Session\SessionService;
use App\Entity\System\Customer;
use App\Entity\System\Menu;
use App\Service\Customer\CustomerPackService;
use Psr\Cache\InvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Security\Core\Security;
class HeaderController extends AbstractController
{
private ShopMenuService $shopMenuService;
private CorporateMenuService $corporateMenuService;
private PathService $pathService;
private MenuBaseHeaderService $menuGeneralService;
private TranslatorInterface $translator;
private RequestStack $requestStack;
private ConfigurationService $configurationService;
private Security $security;
private CustomerPackService $customerPackService;
private SessionService $sessionService;
public function __construct(
ShopMenuService $shopMenuService,
CorporateMenuService $corporateMenuService,
PathService $pathService,
MenuBaseHeaderService $menuGeneralService,
TranslatorInterface $translator,
RequestStack $requestStack,
ConfigurationService $configurationService,
Security $security,
CustomerPackService $customerPackService,
SessionService $sessionService
) {
$this->shopMenuService = $shopMenuService;
$this->corporateMenuService = $corporateMenuService;
$this->pathService = $pathService;
$this->menuGeneralService = $menuGeneralService;
$this->translator = $translator;
$this->requestStack = $requestStack;
$this->configurationService = $configurationService;
$this->security = $security;
$this->customerPackService = $customerPackService;
$this->sessionService = $sessionService;
}
/**
* @return Response
*/
public function corporateHeader(Request $request, string $parentController, string $uri): Response
{
$dataMenu = $this->menuGeneralService->createMenuGeneralByMenuId(Menu::HEADER_ID, $this->sessionService->getLocale());
$parametersMenu = $this->menuGeneralService->buildParametersMenu($request->get('legacy_controller') ?? [], $uri, Menu::HEADER_ID, $this->sessionService->getLocaleId());
$masterRequestRouteName = $this->requestStack->getMainRequest()->get('_route');
$languages = $masterRequestRouteName ? $this->shopMenuService->getLanguageLinks($parentController, $this->pathService->getUrlFromLegacyController($request)) : [];
$announcement = null;
return $this->render('front/base/header/corporate/header_corporate.html.twig', [
'languages' => $languages,
'pages' => $dataMenu,
'topbar' => $this->corporateMenuService->getTopbarLinks(BaseMenuService::CORPORATE),
'user_packs' => $this->corporateMenuService->getCustomerPackInfo(),
'popup_data' => $this->getPopupInformation($request->getSession()->get('lang')),
'cart_number_of_products' => $this->corporateMenuService->getCartNumberOfProducts(),
'parameters_menu' => $parametersMenu,
'first_parent' => $this->menuGeneralService->menuFirstLevelChildrenToBeShownIds($dataMenu, $parametersMenu),
'announcement' => $announcement,
'isChristmas' => $this->configurationService->getCachedValue('LOGO_NAVIDAD'),
'routeName' => $masterRequestRouteName,
'right_menu' => $this->corporateMenuService->getRightMenuData($this->getUser()),
]);
}
/**
* @throws InvalidArgumentException
*/
public function shopHeader(Request $request, string $parentController, string $uri, string $menuHtml = ''): Response
{
$languageIsoCode = $request->getSession()->get('lang');
$languageId = (int)$request->getSession()->get('id_lang');
$customer = $this->getUser();
$packInfo = ['pack_name' => null, 'pack_id' => null, ];
$dataMenu = $this->menuGeneralService->createMenuGeneralByMenuId(Menu::HEADER_ID, $languageIsoCode);
$parametersMenu = $this->menuGeneralService->buildParametersMenu($request->get('legacy_controller'), $uri, Menu::HEADER_ID, $languageId);
$masterRequestRouteName = $this->requestStack->getMainRequest()->get('_route');
if ($customer !== null) {
$customerPackInfo = $this->customerPackService->getCustomerPackInfo((int)$customer->getUserIdentifier(), $languageId);
$packInfo['pack_name'] = $customerPackInfo['pack_name'] ?? null;
$packInfo['pack_id'] = $customerPackInfo['pack_id'] ?? null;
}
return $this->render('front/base/header/shop/header_shop.html.twig', [
'pages' => $dataMenu,
'topbar' => $this->shopMenuService->getTopbarLinks(BaseMenuService::SHOP),
'languages' => $this->shopMenuService->getLanguageLinks($parentController, $this->pathService->getUrlFromLegacyController($request)),
'featured_links' => $this->shopMenuService->getFeaturedLinks($languageId),
'user_packs' => $packInfo,
'popup_data' => $this->getPopupInformation($languageIsoCode),
'cart_number_of_products' => $this->shopMenuService->getCartNumberOfProducts(),
'menu_html' => $menuHtml,
'mobileTreeCategory' => $this->shopMenuService->getCategoryTreeInfo(),
'taxonomyTree' => $this->shopMenuService->getTaxonomyTreeInfo(),
'parameters_menu' => $parametersMenu,
'first_parent' => $this->menuGeneralService->menuFirstLevelChildrenToBeShownIds($dataMenu, $parametersMenu),
'announcement' => null,
'isChristmas' => $this->configurationService->getCachedValue('LOGO_NAVIDAD'),
'right_menu' => $this->shopMenuService->getRightMenuData($customer),
]);
}
protected function getPopupInformation(string $language): ?array
{
/** @var UserInterface|null $user */
$user = $this->security->getUser();
if (!$user instanceof Customer || !$user->getForcePasswordUpdate() || isset($_COOKIE['popup_psw_update'])) {
return null;
}
\setcookie('popup_psw_update', '1', time() + (60 * 60 * 24), '/');
return [
'title' => $this->translator->trans('forcepassword.title', [], 'messages', $language),
'msg1' => $this->translator->trans('forcepassword.msg1', [], 'messages', $language),
'msg2' => $this->translator->trans('forcepassword.msg2', [], 'messages', $language),
];
}
}