src/Application/Service/Menu/MenuService.php line 327

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Application\Service\Menu;
  4. use App\Application\Service\Session\SessionService;
  5. use App\Controller\LegacyController;
  6. use App\Entity\System\Cms;
  7. use App\Entity\System\Customer;
  8. use App\Entity\System\Pack;
  9. use App\Manager\System\BrandLanguageManager;
  10. use App\Manager\System\CustomerManager;
  11. use App\Manager\System\LanguageManager;
  12. use App\Application\Service\Helper\ControlPanelLinkGenerator;
  13. use App\Application\Service\Helper\LegacyTranslator;
  14. use App\Application\Service\Helper\LinkGenerator;
  15. use App\Entity\System\Menu;
  16. use App\Manager\System\PackManager;
  17. use App\Manager\System\ProductManager;
  18. use App\Manager\System\TagManager;
  19. use App\Manager\System\TaxonomyLanguageManager;
  20. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  21. use Symfony\Component\HttpFoundation\RequestStack;
  22. use Symfony\Component\Routing\RouterInterface;
  23. use Symfony\Component\Security\Core\Security;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. use App\Entity\System\Language;
  26. class MenuService
  27. {
  28.     public const CORPORATE 1;
  29.     public const SHOP 2;
  30.     protected LegacyTranslator $legacyTranslator;
  31.     protected RequestStack $requestStack;
  32.     protected LinkGenerator $linkGenerator;
  33.     protected string $baseUrl;
  34.     private LanguageManager $languageManager;
  35.     protected TranslatorInterface $translator;
  36.     protected RouterInterface $router;
  37.     protected ControlPanelLinkGenerator $controlPanelLinkGenerator;
  38.     private Security $security;
  39.     private CustomerManager $customerManager;
  40.     private PackManager $packManager;
  41.     private BrandLanguageManager $brandLanguageManager;
  42.     private TaxonomyLanguageManager $taxonomyLanguageManager;
  43.     private TagManager $tagManager;
  44.     private ProductManager $productManager;
  45.     private MenuBaseHeaderService $menuBaseHeaderService;
  46.     private ParameterBagInterface $parameterBag;
  47.     private SessionService $sessionService;
  48.     public function __construct(
  49.         LegacyTranslator $legacyTranslator,
  50.         LinkGenerator $linkGenerator,
  51.         RequestStack $requestStack,
  52.         LanguageManager $languageManager,
  53.         TranslatorInterface $translator,
  54.         RouterInterface $router,
  55.         MenuBaseHeaderService $menuBaseHeaderService,
  56.         ControlPanelLinkGenerator $controlPanelLinkGenerator,
  57.         ParameterBagInterface $parameterBag,
  58.         Security $security,
  59.         SessionService $sessionService,
  60.         CustomerManager $customerManager,
  61.         PackManager $packManager,
  62.         BrandLanguageManager $brandLanguageManager,
  63.         TaxonomyLanguageManager $taxonomyLanguageManager,
  64.         TagManager $tagManager,
  65.         ProductManager $productManager
  66.     ) {
  67.         $this->parameterBag $parameterBag;
  68.         $this->legacyTranslator $legacyTranslator;
  69.         $this->linkGenerator $linkGenerator;
  70.         $this->baseUrl $parameterBag->get('base_url');
  71.         $this->requestStack $requestStack;
  72.         $this->languageManager $languageManager;
  73.         $this->translator $translator;
  74.         $this->router $router;
  75.         $this->controlPanelLinkGenerator $controlPanelLinkGenerator;
  76.         $this->security $security;
  77.         $this->customerManager $customerManager;
  78.         $this->packManager $packManager;
  79.         $this->brandLanguageManager $brandLanguageManager;
  80.         $this->taxonomyLanguageManager $taxonomyLanguageManager;
  81.         $this->tagManager $tagManager;
  82.         $this->productManager $productManager;
  83.         $this->menuBaseHeaderService $menuBaseHeaderService;
  84.         $this->sessionService $sessionService;
  85.     }
  86.     public function getSocialLinks(): array
  87.     {
  88.         return [
  89.             [
  90.                 'icon' => '/public/img/icons/new-facebook.svg',
  91.                 'url' => $this->parameterBag->get('facebook_url'),
  92.                 'name' => 'facebook',
  93.             ],
  94.             [
  95.                 'icon' => '/public/img/icons/new-instagram.svg',
  96.                 'url' => $this->parameterBag->get('instagram_url'),
  97.                 'name' => 'instagram',
  98.             ],
  99.             [
  100.                 'icon' => '/public/img/icons/new-linkedin.svg',
  101.                 'url' => $this->parameterBag->get('linkedin_url'),
  102.                 'name' => 'linkedin',
  103.             ],
  104.             [
  105.                 'icon' => '/public/img/icons/new-youtube.svg',
  106.                 'url' => $this->parameterBag->get('youtube_url'),
  107.                 'name' => 'youtube',
  108.             ],
  109.             [
  110.                 'icon' => '/public/img/icons/new-twitter.svg',
  111.                 'url' => $this->parameterBag->get('twitter_url'),
  112.                 'name' => 'twitter',
  113.             ],
  114.             [
  115.                 'icon' => '/public/img/icons/new-pinterest.svg',
  116.                 'url' => $this->parameterBag->get('pinterest_url'),
  117.                 'name' => 'pinterest',
  118.             ],
  119.         ];
  120.     }
  121.     public function getAwards(): array
  122.     {
  123.         return [
  124.             [
  125.                 'image' => '/public/img/new_camara.png',
  126.                 'name' => '2023 - Innovation in the company',
  127.             ],
  128.             [
  129.                 'image' => '/public/img/landings/awards/mia-award.svg',
  130.                 'name' => '2023 - International Marketing - Finalist',
  131.             ],
  132.             [
  133.                 'image' => '/public/img/landings/awards/ecommerce-tools-award.svg',
  134.                 'name' => '2023 - Best Logistics and Internationalization',
  135.             ],
  136.             [
  137.                 'image' => '/public/img/landings/awards/ey-award.svg',
  138.                 'name' => '2023 - Best Scale Up - Finalist',
  139.             ],
  140.             [
  141.                 'image' => '/public/img/marketplaces-awards.svg',
  142.                 'name' => '2022 - Best Catalogue Solution',
  143.             ],
  144.             [
  145.                 'image' => '/public/img/marketplaces-awards.svg',
  146.                 'name' => '2022 - Best Logistics Solution',
  147.             ],
  148.             [
  149.                 'image' => '/public/img/marketplaces-awards.svg',
  150.                 'name' => '2022 - Best Manager',
  151.             ],
  152.             [
  153.                 'image' => '/public/img/new_camara.png',
  154.                 'name' => '2022 - International',
  155.             ],
  156.             [
  157.                 'image' => '/public/img/aster-award.svg',
  158.                 'name' => '2022 - Best Entrepreneurs',
  159.             ],
  160.             [
  161.                 'image' => '/public/img/onda-cero.svg',
  162.                 'name' => '2021 - Best company',
  163.             ],
  164.             [
  165.                 'image' => '/public/img/new_insentive_awards.svg',
  166.                 'name' => '2021 - Best Industry Service Provider',
  167.             ],
  168.             [
  169.                 'image' => '/public/img/new_cepyme.svg',
  170.                 'name' => '2021 - Best Business Practices',
  171.             ],
  172.             [
  173.                 'image' => '/public/img/new_camara.png',
  174.                 'name' => '2020 - Pyme del año',
  175.             ],
  176.             [
  177.                 'image' => '/public/img/new_cepyme.svg',
  178.                 'name' => '2018 - Finalist Job Creation',
  179.             ],
  180.             [
  181.                 'image' => '/public/img/new_eawards.svg',
  182.                 'name' => '2018 - Best Marketplace Technology',
  183.             ],
  184.             [
  185.                 'image' => '/public/img/new_ecommerce_awards.svg',
  186.                 'name' => '2017 - Best B2B E-Commerce',
  187.             ],
  188.             [
  189.                 'image' => '/public/img/new_eawards.svg',
  190.                 'name' => '2016 - Best International E-Commerce',
  191.             ],
  192.             [
  193.                 'image' => '/public/img/new_eawards.svg',
  194.                 'name' => '2016 - Best Innovative E-Commerce',
  195.             ],
  196.             [
  197.                 'image' => '/public/img/new_paypal.svg',
  198.                 'name' => '2015 - Best Innovative E-Commerce',
  199.             ],
  200.             [
  201.                 'image' => '/public/img/new_ecommerce_awards.svg',
  202.                 'name' => '2015 - Best Cross Border',
  203.             ],
  204.         ];
  205.     }
  206.     /**
  207.      * @return array[]
  208.      */
  209.     public function getBottomLinks(): array
  210.     {
  211.         return [
  212.             [
  213.                 'name' => $this->legacyTranslator->trans('Formas de pago''sitemap'),
  214.                 'url' => $this->linkGenerator->getCmsLink(Cms::CMS_PAYMENTS),
  215.                 'external_link' => false,
  216.                 'no_follow' => false,
  217.             ],
  218.             [
  219.                 'name' => $this->legacyTranslator->trans('Entrega y envío''sitemap'),
  220.                 'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_SHIPMENT_AND_DELIVERY),
  221.                 'external_link' => false,
  222.                 'no_follow' => false,
  223.             ],
  224.             [
  225.                 'name' => $this->legacyTranslator->trans('Impuestos''sitemap'),
  226.                 'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_TAXES),
  227.                 'external_link' => false,
  228.                 'no_follow' => false,
  229.             ],
  230.             [
  231.                 'name' => $this->legacyTranslator->trans('Garantía''sitemap'),
  232.                 'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_WARRANTY),
  233.                 'external_link' => false,
  234.                 'no_follow' => false,
  235.             ],
  236.             [
  237.                 'name' => $this->translator->trans('footer.bottom_links.general_conditions'),
  238.                 'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_GENERAL_PRIVACY_TERMS_AND_CONDITIONS),
  239.                 'external_link' => false,
  240.                 'no_follow' => false,
  241.             ],
  242.             [
  243.                 'name' => $this->translator->trans('footer.bottom_links.cookies', [], 'landings'),
  244.                 'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_COOKIES),
  245.                 'external_link' => false,
  246.                 'no_follow' => false,
  247.             ],
  248.             [
  249.                 'name' => $this->translator->trans('footer.bottom_links.privacy_policy'),
  250.                 'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_PRIVACY_POLICY),
  251.                 'external_link' => false,
  252.                 'no_follow' => false,
  253.             ],
  254.             [
  255.                 'name' => $this->translator->trans('footer.bottom_links.legal_notice'),
  256.                 'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_LEGAL_NOTICE),
  257.                 'external_link' => false,
  258.                 'no_follow' => false,
  259.             ],
  260.             [
  261.                 'name' => $this->translator->trans('footer.bottom_links.responsible_business'),
  262.                 'url' => $this->sessionService->getLocaleId() === Language::SPANISH_LANGUAGE_ID ?
  263.                     'https://responsiblebusiness.bigbuy.eu/' 'https://responsiblebusiness.bigbuy.eu/en_US/',
  264.                 'external_link' => true,
  265.                 'no_follow' => true,
  266.             ],
  267.         ];
  268.     }
  269.     /**
  270.      * @return array[]
  271.      */
  272.     public function getCorporateLinks(): array
  273.     {
  274.         return $this->menuBaseHeaderService->createMenuGeneralByMenuId(Menu::FOOTER_ID$this->requestStack->getSession()->get('lang'));
  275.     }
  276.     /**
  277.      * @return array[]
  278.      */
  279.     public function getTopbarLinks(int $selectedLink): array
  280.     {
  281.         return [
  282.             [
  283.                 'name' => $this->legacyTranslator->trans('Empresa''accountController'),
  284.                 'url' => $this->baseUrl.$this->requestStack->getSession()->get('lang'),
  285.                 'selected' => $selectedLink === self::CORPORATE,
  286.             ],
  287.             [
  288.                 'name' => $this->translator->trans('menu.base.shopb2b.title'),
  289.                 'url' => $this->linkGenerator->getFrontUrl('tiendab2b.html'),
  290.                 'selected' => $selectedLink === self::SHOP,
  291.             ],
  292.         ];
  293.     }
  294.     public function getLanguages(): array
  295.     {
  296.         return $this->languageManager->findAllActiveNamesAndIsoCodes();
  297.     }
  298.     /**
  299.      * @return array<int, array{id: int, name: string, isoCode: string, isoCodeReal: string|null, url: string|null}>
  300.      */
  301.     public function getLanguageLinks(string $parentController, ?string $url null): array
  302.     {
  303.         $languages $this->languageManager->findAllActiveNamesAndIsoCodes();
  304.         $isLegacyController = (false !== strpos($parentControllerLegacyController::class));
  305.         $languageLinks $this->getLanguagesController($languages);
  306.         if (
  307.             $languageLinks
  308.             && (!$isLegacyController || $this->requestStack->getSession()->get('cms_new') === true)
  309.         ) {
  310.             return $languageLinks;
  311.         }
  312.         $controllerName $this->requestStack->getSession()->get('controller');
  313.         if ($controllerName === 'indexController') {
  314.             $controllerName '';
  315.         }
  316.         if ($url === LinkGenerator::NAME_URL_TIENDA_B2B_WITH_TERMINATION_HTML) {
  317.             $controllerName LinkGenerator::NAME_URL_TIENDA_B2B;
  318.         }
  319.         /** @var string $controllerName */
  320.         $controllerName str_replace('Controller'''$controllerName);
  321.         $languagesResult = [];
  322.         foreach ($languages as $language) {
  323.             $language['url'] = $this->linkGenerator->getCurrentLink($controllerName$language['id']);
  324.             $languagesResult[] = $language;
  325.         }
  326.         return $languagesResult;
  327.     }
  328.     public function getLanguagesController(array $languages): ?array
  329.     {
  330.         foreach ($languages as &$language) {
  331.             $shopLink $this->getShopLanguageLink($language['id']);
  332.             if ($shopLink) {
  333.                 $language['url'] = $shopLink;
  334.                 continue;
  335.             }
  336.             $cmsRoute $this->linkGenerator->getCmsLink(null$language['id']);
  337.             $language['url'] = $cmsRoute;
  338.         }
  339.         return $languages;
  340.     }
  341.     public function getShopLanguageLink(int $languageId): ?string
  342.     {
  343.         $route $this->requestStack->getMainRequest()->get('_route');
  344.         switch ($route) {
  345.             case 'shop_brand':
  346.                 $params $this->requestStack->getMainRequest()->get('_route_params');
  347.                 $language $this->languageManager->getLanguageByIsoLanguage($params['lang']);
  348.                 $brandLanguage $this->brandLanguageManager->findOneByLinkRewriteAndLanguage(
  349.                     $params['url'],
  350.                     $language->getId()
  351.                 );
  352.                 if (!$brandLanguage) {
  353.                     return null;
  354.                 }
  355.                 return $this->linkGenerator->getManufacturerLink($brandLanguage->getBrand()->getId(), $languageId);
  356.             case 'shop_category':
  357.                 $params $this->requestStack->getMainRequest()->get('_route_params');
  358.                 $language $this->languageManager->getLanguageByIsoLanguage($params['lang']);
  359.                 $taxonomyLanguage $this->taxonomyLanguageManager->findOneByLinkRewriteAndLanguage(
  360.                     $params['url'],
  361.                     $language->getId()
  362.                 );
  363.                 if (!$taxonomyLanguage) {
  364.                     return null;
  365.                 }
  366.                 return $this->linkGenerator->getTaxonomyLink($taxonomyLanguage->getTaxonomy()->getId(), $languageId);
  367.             case 'shop_tag':
  368.                 $params $this->requestStack->getMainRequest()->get('_route_params');
  369.                 $language $this->languageManager->getLanguageByIsoLanguage($params['lang']);
  370.                 $tagOrigin $this->tagManager->findOneByLinkRewriteAndLanguage(
  371.                     $params['url'],
  372.                     $language->getId()
  373.                 );
  374.                 if (!$tagOrigin) {
  375.                     return null;
  376.                 }
  377.                 $tag $this->tagManager->findOneByTagIdAndLanguage(
  378.                     $tagOrigin->getId(),
  379.                     $languageId
  380.                 );
  381.                 return $this->linkGenerator->getTagLink($tag->getLinkRewrite(), $tag->getLanguage()->getIsoCode());
  382.             case 'shop_product':
  383.             case 'shop_service':
  384.             case 'shop_course':
  385.                 $params $this->requestStack->getMainRequest()->get('_route_params');
  386.                 $language $this->languageManager->getLanguageByIsoLanguage($params['lang']);
  387.                 $productLanguage $this->productManager->findOneProductLangByLinkRewriteAndLanguage(
  388.                     $params['url'],
  389.                     $language->getIsoCode()
  390.                 );
  391.                 if (!$productLanguage) {
  392.                     return null;
  393.                 }
  394.                 return $this->linkGenerator->getProductLink($productLanguage->getProduct()->getId(), $languageId);
  395.             case 'checkout':
  396.                 $language $this->languageManager->findOneById($languageId);
  397.                 return $this->router->generate('checkout', ['_locale' => $language->getIsoCode()]);
  398.         }
  399.         return null;
  400.     }
  401.     /**
  402.      * @return array|null[]|string[]
  403.      */
  404.     public function getCustomerPackInfo(): array
  405.     {
  406.         /** @var ?Customer $user */
  407.         $user $this->security->getUser();
  408.         if (!$user) {
  409.             return [
  410.                 'pack_name' => null,
  411.                 'pack_id' => null,
  412.             ];
  413.         }
  414.         $customer $this->customerManager->findOneById((int)$user->getId());
  415.         if (!$customer) {
  416.             return [
  417.                 'pack_name' => null,
  418.                 'pack_id' => null,
  419.             ];
  420.         }
  421.         /** @var Pack $pack */
  422.         $pack $this->packManager->findOneBy(['id' => $customer->getIdPack(), 'language' => $customer->getLanguage()]);
  423.         $packCustomer $pack->getName();
  424.         return [
  425.             'pack_name' => $packCustomer,
  426.             'pack_id' => $customer->getIdPack(),
  427.         ];
  428.     }
  429.     public function getRightMenuData(?Customer $loggedUser): array
  430.     {
  431.         $data = [];
  432.         if ($loggedUser) {
  433.             $data['link'] = $this->controlPanelLinkGenerator->getControlPanelLink();
  434.             $data['link_text'] = $this->translator->trans('menu.header.general.right.controlpanel');
  435.         }
  436.         return $data;
  437.     }
  438. }