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

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