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

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