src/WebBundle/Service/LocalizationService.php line 88

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace WebBundle\Service;
  4. use Doctrine\ORM\NonUniqueResultException;
  5. use Doctrine\ORM\NoResultException;
  6. use Exception;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use WebBundle\Constant\CookieKeysConstant;
  9. use WebBundle\Dto\ShowUserLocaleDto;
  10. use WebBundle\Entity\BuyOrder;
  11. use WebBundle\Enum\BuyOrderStatusEnum;
  12. use WebBundle\Helper\App;
  13. use WebBundle\Helper\ArrHelper;
  14. use WebBundle\Helper\CookieHelper;
  15. use WebBundle\Helper\FilterHelper;
  16. use WebBundle\Helper\LocaleHelper;
  17. use WebBundle\Helper\StrHelper;
  18. use WebBundle\Helper\UserHelper;
  19. use WebBundle\Repository\BuyOrderRepository;
  20. use WebBundle\Repository\ListCountryRepository;
  21. use WebBundle\Repository\OrderAddressRepository;
  22. /**
  23.  * Сервис для работы с локализацией
  24.  */
  25. class LocalizationService
  26. {
  27.     /** @required */
  28.     public OrderService $orderService;
  29.     /** @required */
  30.     public ListCountryRepository $listCountryRepository;
  31.     /** @required */
  32.     public OrderAddressRepository $orderAddressRepository;
  33.     /** @required */
  34.     public BuyOrderRepository $buyOrderRepository;
  35.     /**
  36.      * Получение uri без локали
  37.      */
  38.     public function getUriWithoutLocale(): string
  39.     {
  40.         $request App::getRequest();
  41.         $localeFromUri LocaleHelper::getLocaleFromUri($request->getRequestUri());
  42.         return str_ireplace('index.php'''$localeFromUri->getStringWithUrlWithoutLocale());
  43.     }
  44.     /**
  45.      * Получение списка доступных локалей для выпадающего списка
  46.      * @return array
  47.      */
  48.     public function getSelectLocales(ShowUserLocaleDto $showUserLocaleDto): array
  49.     {
  50.         $userCountryWas $showUserLocaleDto->getUserCountryWas();
  51.         $uri $this->getUriWithoutLocale();
  52.         $selectLocales = [];
  53.         foreach (LocaleHelper::getListAvailable() as $code => $row) {
  54.             if ($code === 'cn') {
  55.                 continue;
  56.             }
  57.             if (false !== stripos($uri'catalogue')) {
  58.                 $url FilterHelper::getUrl(null$code);
  59.                 $url str_replace('/' $code '/''/' $code '-' $userCountryWas '/'$url);
  60.             } else {
  61.                 if ($code != $userCountryWas) {
  62.                     $url '/' $code '-' $userCountryWas '/' $uri;
  63.                 } else {
  64.                     $url '/' $code '/' $uri;
  65.                 }
  66.             }
  67.             $url rtrim($url'/');
  68.             $selectLocales[$code] = [
  69.                 'code' => $code,
  70.                 'name' => $row['name'][$code],
  71.                 'uri' => $url,
  72.             ];
  73.         }
  74.         return $selectLocales;
  75.     }
  76.     public function getShowUserLocaleDto(): ShowUserLocaleDto
  77.     {
  78.         $showUserLocaleDto = new ShowUserLocaleDto();
  79.         $request App::getRequest();
  80.         $showLocale $request->getSession()->get('showLocale');
  81.         if ($showLocale
  82.             && !$request->get('qr'// Запрет на показ плашки если просматривается образец по ссылке QR кода
  83.         ) {
  84.             $showUserLocaleDto
  85.                 ->setUserLocaleWas($showLocale['lang'])
  86.                 ->setUserCountryWas($showLocale['country'])
  87.                 ->setUserCurrencyWas($showLocale['currency'])
  88.                 ->setUserMeasureWas($showLocale['measure'])
  89.                 ->setShowLocale(true);
  90.         } else {
  91.             $showUserLocaleDto
  92.                 ->setUserLocaleWas(App::getCurLocale())
  93.                 ->setUserCountryWas(App::getCurCountry())
  94.                 ->setUserCurrencyWas(LocaleHelper::getCur())
  95.                 ->setUserMeasureWas(LocaleHelper::getUserMeasure())
  96.                 ->setShowLocale(false);
  97.         }
  98.         $request->getSession()->remove('showLocale');
  99.         return $showUserLocaleDto;
  100.     }
  101.     public function setLocalizationAndGetUrlForRedirect(Request $request): string
  102.     {
  103.         $data $request->get('data', []);
  104.         $localeFromUri LocaleHelper::getLocaleFromUri($request->getRequestUri());
  105.         // установка языка
  106.         $nowLocale $this->setLanguage($data);
  107.         // установка страны
  108.         $nowLocale $this->setCountry($data$nowLocale);
  109.         // установка валюты
  110.         $this->setCurrency($data);
  111.         // установка единиц измерения
  112.         $this->setMeasure($data);
  113.         // удаляем данные высвечиваемой плашки
  114.         $request->getSession()->remove('showLocale');
  115.         $request->getSession()->remove('showLocaleReact');
  116.         CookieHelper::set(CookieKeysConstant::USER_APPROVED'yes', ['httponly' => false]);
  117.         CookieHelper::set(CookieKeysConstant::SHOW_POPUP'yes', ['httponly' => false]);
  118.         $reqLastUrl = empty($_SERVER['HTTP_REFERER']) ? null $_SERVER['HTTP_REFERER'];
  119.         // проверяем с какой страницы была смена валюты заказа
  120.         $this->checkIfThisIsOrderThenChangeCountryForDelivery($data$reqLastUrl);
  121.         return empty($nowLocale)
  122.             ? $reqLastUrl
  123.             $request->getSchemeAndHttpHost() . '/' $nowLocale '/' $localeFromUri->getStringWithUrlWithoutLocale();
  124.     }
  125.     private function setLanguage(array $data): string
  126.     {
  127.         $lang CookieHelper::get(CookieKeysConstant::LANG'en');
  128.         if (!empty($data['lang'])) {
  129.             if (ArrHelper::get(LocaleHelper::getListCode(), $data['lang'])) {
  130.                 $lang $data['lang'];
  131.             }
  132.         }
  133.         CookieHelper::set(CookieKeysConstant::LANG$lang, ['httponly' => false]);
  134.         return $lang;
  135.     }
  136.     private function setCountry(array $datastring $nowLocale): string
  137.     {
  138.         $country CookieHelper::get(CookieKeysConstant::COUNTRY'us');
  139.         if (!empty($data['country'])) {
  140.             try {
  141.                 $availableCountry $this->listCountryRepository->getCountry($data['country']);
  142.             } catch (NonUniqueResultException $_) {
  143.                 $availableCountry null;
  144.             }
  145.             try {
  146.                 if (null !== $availableCountry
  147.                     && array_key_exists(strtolower($availableCountry->getCode()), App::getCountryList())
  148.                 ) {
  149.                     $country strtolower($availableCountry->getCode());
  150.                 }
  151.             } catch (Exception $_) {
  152.             }
  153.             if ($nowLocale !== $country) {
  154.                 $nowLocale .= '-' $country;
  155.             }
  156.         }
  157.         if (!empty($data['first'])) {
  158.             CookieHelper::set('first'$country);
  159.         }
  160.         CookieHelper::set(CookieKeysConstant::COUNTRY$country, ['httponly' => false]);
  161.         return $nowLocale;
  162.     }
  163.     private function setCurrency(array $data): void
  164.     {
  165.         if (!empty($data['currency'])
  166.             && !empty($data['country'])
  167.             && in_array($data['currency'], LocaleHelper::getCurrencyList($data['country']))
  168.         ) {
  169.             CookieHelper::set(CookieKeysConstant::CURRENCY$data['currency'], ['httponly' => false]);
  170.         } else {
  171.             CookieHelper::set(CookieKeysConstant::CURRENCY'EUR', ['httponly' => false]);
  172.         }
  173.     }
  174.     private function setMeasure(array $data): void
  175.     {
  176.         $isUsaOrCanada in_array(StrHelper::toLower($data['country'] ?? ''), ['us''ca']);
  177.         $measureKey $isUsaOrCanada CookieKeysConstant::MEASURE_FT CookieKeysConstant::MEASURE;
  178.         if ($isUsaOrCanada) {
  179.             if ($data['measure'] && in_array($data['measure'], LocaleHelper::getMeasureList())) {
  180.                 CookieHelper::set($measureKey$data['measure'], ['httponly' => false]);
  181.             }
  182.         } else {
  183.             CookieHelper::set(CookieKeysConstant::MEASURE'm', ['httponly' => false]);
  184.         }
  185.     }
  186.     private function checkIfThisIsOrderThenChangeCountryForDelivery(array $data, ?string $reqLastUrl): void
  187.     {
  188.         $orderId $this->getOrderIdInPrevUrl($reqLastUrl);
  189.         if (empty($orderId)) {
  190.             return;
  191.         }
  192.         try {
  193.             $country $this->listCountryRepository->getCountry($data['country']);
  194.         } catch (NonUniqueResultException $_) {
  195.             return;
  196.         }
  197.         if (empty($country)) {
  198.             return;
  199.         }
  200.         try {
  201.             $order $this->orderService->getOrderObj($orderId);
  202.             $token UserHelper::getInstance()->getToken();
  203.             if ($this->forbiddenChangeThisOrder($order$token)) {
  204.                 return;
  205.             }
  206.             $order->setDeliveryCountry($country);
  207.             $address $order->getAddressRecipient();
  208.             if ($address) {
  209.                 $address->setCountry($country);
  210.             }
  211.             $this->buyOrderRepository->save($order);
  212.             $this->orderAddressRepository->save($address);
  213.         } catch (NonUniqueResultException|NoResultException $_) {
  214.             // да и фиг с ним
  215.         }
  216.     }
  217.     private function getOrderIdInPrevUrl(?string $lastUrl): ?string
  218.     {
  219.         if (null === $lastUrl) {
  220.             return null;
  221.         }
  222.         if (stripos($lastUrl'/buy-order/') === false) {
  223.             return null;
  224.         }
  225.         preg_match('#/buy-order/(\w*\d*).*$#is'$lastUrl$matches);
  226.         return $matches[1];
  227.     }
  228.     private function forbiddenChangeThisOrder(BuyOrder $orderstring $token): bool
  229.     {
  230.         if ($order->getStatus() >= BuyOrderStatusEnum::PARTIALLY_PAID) {
  231.             return true;
  232.         }
  233.         if ($order->getToken() !== $token) {
  234.             return true;
  235.         }
  236.         return false;
  237.     }
  238. }