<?php
declare(strict_types=1);
namespace App\Application\Service\Menu;
use App\Application\Service\Session\SessionService;
use App\Controller\LegacyController;
use App\Manager\System\BrandLanguageManager;
use App\Manager\System\CustomerManager;
use App\Manager\System\LanguageManager;
use App\Application\Service\Helper\ControlPanelLinkGenerator;
use App\Application\Service\Helper\LegacyTranslator;
use App\Application\Service\Helper\LinkGenerator;
use App\Entity\System\Customer;
use App\Manager\System\PackManager;
use App\Manager\System\ProductManager;
use App\Manager\System\TagManager;
use App\Manager\System\TaxonomyLanguageManager;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\System\Pack;
abstract class BaseMenuService
{
public const CORPORATE = 1;
public const SHOP = 2;
protected LegacyTranslator $legacyTranslator;
protected RequestStack $requestStack;
protected LinkGenerator $linkGenerator;
protected string $baseUrl;
private LanguageManager $languageManager;
protected TranslatorInterface $translator;
protected RouterInterface $router;
protected ControlPanelLinkGenerator $controlPanelLinkGenerator;
private Security $security;
private SessionService $sessionService;
private CustomerManager $customerManager;
private PackManager $packManager;
private BrandLanguageManager $brandLanguageManager;
private TaxonomyLanguageManager $taxonomyLanguageManager;
private TagManager $tagManager;
private ProductManager $productManager;
public function __construct(
LegacyTranslator $legacyTranslator,
LinkGenerator $linkGenerator,
RequestStack $requestStack,
LanguageManager $languageManager,
ParameterBagInterface $parameterBag,
TranslatorInterface $translator,
RouterInterface $router,
ControlPanelLinkGenerator $controlPanelLinkGenerator,
Security $security,
SessionService $sessionService,
CustomerManager $customerManager,
PackManager $packManager,
BrandLanguageManager $brandLanguageManager,
TaxonomyLanguageManager $taxonomyLanguageManager,
TagManager $tagManager,
ProductManager $productManager
) {
$this->legacyTranslator = $legacyTranslator;
$this->linkGenerator = $linkGenerator;
$this->baseUrl = $parameterBag->get('base_url');
$this->requestStack = $requestStack;
$this->languageManager = $languageManager;
$this->translator = $translator;
$this->router = $router;
$this->controlPanelLinkGenerator = $controlPanelLinkGenerator;
$this->security = $security;
$this->sessionService = $sessionService;
$this->customerManager = $customerManager;
$this->packManager = $packManager;
$this->brandLanguageManager = $brandLanguageManager;
$this->taxonomyLanguageManager = $taxonomyLanguageManager;
$this->tagManager = $tagManager;
$this->productManager = $productManager;
}
/**
* @return array[]
*/
public function getTopbarLinks(int $selectedLink): array
{
return [
[
'name' => $this->legacyTranslator->trans('Empresa', 'accountController'),
'url' => $this->baseUrl.$this->requestStack->getSession()->get('lang'),
'selected' => $selectedLink === self::CORPORATE,
],
[
'name' => $this->translator->trans('menu.base.shopb2b.title'),
'url' => $this->linkGenerator->getFrontUrl('tiendab2b.html'),
'selected' => $selectedLink === self::SHOP,
],
];
}
public function getLanguages(): array
{
return $this->languageManager->findAllActiveNamesAndIsoCodes();
}
/**
* @return array<int, array{id: int, name: string, isoCode: string, isoCodeReal: string|null, url: string|null}>
*/
public function getLanguageLinks(string $parentController, ?string $url = null): array
{
$languages = $this->languageManager->findAllActiveNamesAndIsoCodes();
$isLegacyController = (false !== strpos($parentController, LegacyController::class));
$languageLinks = $this->getLanguagesController($languages);
if (
$languageLinks
&& (!$isLegacyController || $this->requestStack->getSession()->get('cms_new') === true)
) {
return $languageLinks;
}
$controllerName = $this->requestStack->getSession()->get('controller');
if ($controllerName === 'indexController') {
$controllerName = '';
}
if ($url === LinkGenerator::NAME_URL_TIENDA_B2B_WITH_TERMINATION_HTML) {
$controllerName = LinkGenerator::NAME_URL_TIENDA_B2B;
}
$controllerName = str_replace('Controller', '', $controllerName);
$languagesResult = [];
foreach ($languages as $language) {
$language['url'] = $this->linkGenerator->getCurrentLink($controllerName, $language['id']);
$languagesResult[] = $language;
}
return $languagesResult;
}
public function getLanguagesCmsController($languages): ?array
{
foreach ($languages as &$language) {
$language['url'] = $this->linkGenerator->getCmsLink(null, $language['id']);
}
return $languages;
}
public function getLanguagesController(array $languages): ?array
{
foreach ($languages as &$language) {
$shopLink = $this->getShopLanguageLink($language['id']);
if ($shopLink) {
$language['url'] = $shopLink;
continue;
}
$cmsRoute = $this->linkGenerator->getCmsLink(null, $language['id']);
$language['url'] = $cmsRoute;
}
return $languages;
}
public function getShopLanguageLink(int $languageId): ?string
{
$route = $this->requestStack->getMainRequest()->get('_route');
switch ($route) {
case 'shop_brand':
$params = $this->requestStack->getMainRequest()->get('_route_params');
$language = $this->languageManager->getLanguageByIsoLanguage($params['lang']);
$brandLanguage = $this->brandLanguageManager->findOneByLinkRewriteAndLanguage(
$params['url'],
$language->getId()
);
if (!$brandLanguage) {
return null;
}
return $this->linkGenerator->getManufacturerLink($brandLanguage->getBrand()->getId(), $languageId);
case 'shop_category':
$params = $this->requestStack->getMainRequest()->get('_route_params');
$language = $this->languageManager->getLanguageByIsoLanguage($params['lang']);
$taxonomyLanguage = $this->taxonomyLanguageManager->findOneByLinkRewriteAndLanguage(
$params['url'],
$language->getId()
);
if (!$taxonomyLanguage) {
return null;
}
return $this->linkGenerator->getTaxonomyLink($taxonomyLanguage->getTaxonomy()->getId(), $languageId);
case 'shop_tag':
$params = $this->requestStack->getMainRequest()->get('_route_params');
$language = $this->languageManager->getLanguageByIsoLanguage($params['lang']);
$tagOrigin = $this->tagManager->findOneByLinkRewriteAndLanguage(
$params['url'],
$language->getId()
);
if (!$tagOrigin) {
return null;
}
$tag = $this->tagManager->findOneByTagIdAndLanguage(
$tagOrigin->getId(),
$languageId
);
return $this->linkGenerator->getTagLink($tag->getLinkRewrite(), $tag->getLanguage()->getIsoCode());
case 'shop_product':
case 'shop_service':
$params = $this->requestStack->getMainRequest()->get('_route_params');
$language = $this->languageManager->getLanguageByIsoLanguage($params['lang']);
$productLanguage = $this->productManager->findOneProductLangByLinkRewriteAndLanguage(
$params['url'],
$language->getIsoCode()
);
if (!$productLanguage) {
return null;
}
return $this->linkGenerator->getProductLink($productLanguage->getProduct()->getId(), $languageId);
case 'checkout':
$language = $this->languageManager->findOneById($languageId);
return $this->router->generate('checkout', ['_locale' => $language->getIsoCode()]);
}
return null;
}
// TODO reimplement in Symfony
/**
* @return int
*/
public function getCartNumberOfProducts(): int
{
return (int)\Cart::staticCountProductsInCart($this->sessionService->get('id_cart'));
}
// TODO reimplement in Symfony
/**
* @return array|null[]|string[]
*/
public function getCustomerPackInfo(): array
{
/** @var Customer $user */
$user = $this->security->getUser();
if (!$user) {
return [
'pack_name' => null,
'pack_id' => null,
];
}
$customer = $this->customerManager->findOneById((int)$user->getId());
if (!$customer) {
return [
'pack_name' => null,
'pack_id' => null,
];
}
$packId = $customer->getIdPack() ?? Pack::PACK_WITHOUT_PACK;
/** @var Pack $pack */
$pack = $this->packManager->findOneBy(['id' => $packId, 'language' => $customer->getLanguage()]);
$packCustomer = $pack->getName();
return [
'pack_name' => $packCustomer,
'pack_id' => $packId,
];
}
public function getCategoryTreeInfo(): array
{
return [];
}
/**
* @param array $days
*
* @return string
*/
protected function getPopupTextDays(array $days): string
{
$popupTextDays = '<strong>';
$daysIndexedByMonth = [];
foreach ($days as $day) {
$dayMonth = explode('-', $day);
$daysIndexedByMonth[$dayMonth[1]][] = $dayMonth[0];
}
foreach ($daysIndexedByMonth as $month => $daysMonth) {
$popupTextDays .= implode(',', $daysMonth).' '.\Tools::displayTextMonth($month).', ';
}
return \substr($popupTextDays, 0, -2).'</strong>';
}
public function getRightMenuData(?Customer $loggedUser): array
{
$data = [];
if ($loggedUser) {
$data['link'] = $this->controlPanelLinkGenerator->getControlPanelLink();
$data['link_text'] = $this->translator->trans('menu.header.general.right.controlpanel');
}
return $data;
}
}