custom/plugins/EtrpCurrencyGeoIp/src/Subscriber/DetectCountryUser.php line 22

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace EtrpCurrencyGeoIp\Subscriber;
  3. use EtrpCurrencyGeoIp\Service\GeoipServices;
  4. use Shopware\Core\PlatformRequest;
  5. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  6. use Shopware\Storefront\Event\StorefrontRenderEvent;
  7. use Shopware\Storefront\Framework\Routing\RequestTransformer;
  8. use Shopware\Storefront\Framework\Routing\Router;
  9. use Shopware\Storefront\Page\GenericPageLoadedEvent;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpFoundation\Cookie;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\HttpKernel\Event\KernelEvent;
  16. use Symfony\Component\HttpKernel\Event\RequestEvent;
  17. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. class DetectCountryUser implements EventSubscriberInterface
  20. {
  21.   /**
  22.    * @var GeoipServices
  23.    */
  24.   private $GeoipServices;
  25.   /**
  26.    * @var Router
  27.    */
  28.   private $router;
  29.   /**
  30.    * DetectCountryUser constructor.
  31.    * @param GeoipServices $GeoipServices
  32.    * @param Router $router
  33.    */
  34.   public function __construct(
  35.     GeoipServices $GeoipServices,
  36.     Router $router
  37.   )
  38.   {
  39.     $this->GeoipServices $GeoipServices;
  40.     $this->router $router;
  41.   }
  42.   /**
  43.    * @return \array[]
  44.    */
  45.   public static function getSubscribedEvents(): array
  46.   {
  47.     return [
  48.       KernelEvents::RESPONSE => ['isoCurrentUser'9999], ['b2bCustomer'9999]
  49.     ];
  50.   }
  51.   /**
  52.    * @param ResponseEvent $event
  53.    */
  54.   public function isoCurrentUser(ResponseEvent $event): void
  55.   {
  56.     if (!$event->getRequest()->attributes->get('sw-sales-channel-context')){
  57.       return;
  58.     }
  59.     //id canale shopware
  60.     $salesChannel $event->getRequest()->attributes->get('sw-sales-channel-context')->getSalesChannel();
  61.     $salesChannelId $event->getRequest()->attributes->get('sw-sales-channel-id');
  62.     //var_dump($salesChannelId);
  63.     $salesChannelName $salesChannel->getTranslated()['name'];
  64.     if (!isset($salesChannel)) {
  65.       return;
  66.     }
  67.     
  68.     $context $event->getRequest()->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  69.     //se admin non continuo
  70.     if (!$context instanceof SalesChannelContext) {
  71.       return;
  72.     }
  73.     $ip $event->getRequest()->getClientIp();
  74.     /**
  75.      * PER TEST DA LOCALHOST
  76.      * //USA - CANADA 184.151.230.135
  77.      * //IT 94.89.28.10
  78.      * //UK 195.195.237.39
  79.      */
  80.     if ('127.0.0.1' === $ip) {
  81.       $ip '94.89.28.10';
  82.     }
  83.     $cookieset $event->getRequest()->cookies->get('domainrefer');
  84.     if ($cookieset == null) {
  85.       $countryIso $this->GeoipServices->ip2country($ip);
  86.       $domainForCountry $this->domainForCountry($countryIso);
  87.     } else {
  88.       $domainForCountry $cookieset;
  89.     }
  90.     $currentDomain $event->getRequest()->attributes->get(RequestTransformer::SALES_CHANNEL_BASE_URL);
  91.     $currentDomain $currentDomain === "" "/it" $currentDomain;
  92.     $currentUri $event->getRequest()->getRequestUri();
  93.           $currentRouteName $event->getRequest()->attributes->get('_route');
  94.     $currentRouteLink $event->getRequest()->attributes->get('sw-original-request-uri');
  95.     $maindomain $event->getRequest()->attributes->get(RequestTransformer::SALES_CHANNEL_ABSOLUTE_BASE_URL);
  96.     $domainPath $domainForCountry === '/it' '/it' $domainForCountry;
  97.     $newUrl $maindomain $domainPath $currentUri;
  98.     if (str_contains($salesChannelName'B2B')) {
  99.       $customer $event->getRequest()->attributes->get('sw-sales-channel-context')->getCustomer();
  100.       $currentRouteName $event->getRequest()->attributes->get('_route');
  101.       if ($customer == null) {
  102.          if ($currentRouteName === 'frontend.account.recover.page') {
  103.            return;
  104.         }else if ($currentRouteName === 'frontend.home.page') {
  105.           return;
  106.         }
  107.         else if ($currentRouteName === 'frontend.account.recover.password.page') {
  108.           return;
  109.         } else if ($currentRouteName === 'frontend.account.recover.request') {
  110.           return;
  111.         } else if ($currentRouteName !== 'frontend.account.login.page') {
  112.           $isAllowed $event->getRequest()->attributes->getBoolean('XmlHttpRequest'false);
  113.           if ($isAllowed) {
  114.             return;
  115.           }
  116.           $newUrl $this->router->generate('frontend.account.login.page');
  117.           $redirectResponse = new RedirectResponse($newUrl);
  118.           $redirectResponse->send();
  119.         }
  120.       } else {
  121.         $customerIdGroup $customer->getGroupId();
  122.         $domainForCustomer $this->domainForCustomer($customerIdGroup);
  123.         if($domainForCustomer) {
  124.           if ($currentDomain !== $domainForCustomer) {
  125.             $domainPath $domainForCustomer === '/it' '/it' $domainForCustomer;
  126.             $newUrl $maindomain $domainPath $currentUri;
  127.             $redirectResponse = new RedirectResponse($newUrl);
  128.             $redirectResponse->send();
  129.           }
  130.         } else if ($currentRouteName !== 'frontend.account.home.page') {
  131.           $isAllowed $event->getRequest()->attributes->getBoolean('XmlHttpRequest'false);
  132.           if ($isAllowed) {
  133.             return;
  134.           }
  135.             $newUrl $this->router->generate('frontend.account.home.page');
  136.             $redirectResponse = new RedirectResponse($newUrl);
  137.             $redirectResponse->send();
  138.         }
  139.         return;
  140.       }
  141.     }
  142. //    $response = new Response();
  143.     $event->getResponse()->headers->setCookie(Cookie::create('domainrefer'$domainForCountry));
  144.    // $event->getResponse()->headers->setCookie(Cookie::create('ip', $countryIso));
  145.     if ($currentDomain !== $domainForCountry) {
  146.       $redirectResponse = new RedirectResponse($newUrl);
  147.       $redirectResponse->send();
  148.     }
  149.   }
  150.   /**
  151.    * @param string $country
  152.    * @return string
  153.    */
  154.   public function domainForCountry(string $country)
  155.   {
  156.     switch ($country) {
  157.       case "UK":
  158.         $domain '/uk';
  159.         break;
  160.       case "US":
  161.       case "CA":
  162.         $domain '/usa';
  163.         break;
  164.       case "IT":
  165.         $domain '/it';
  166.         break;
  167.       default:
  168.         $domain '/en';
  169.     }
  170.     return $domain;
  171.   }
  172.   /**
  173.    * @param string $country
  174.    * @return string
  175.    */
  176.   public function domainForCustomer(string $categoryUser)
  177.   {
  178.     switch ($categoryUser) {
  179.       case "ce2c04e5fa89404ebc2b9f133a81e3e1":
  180.       case "0173864dfe1744ceb3fbc7dce2b843c6":
  181.         $domain '/usa';
  182.         break;
  183.       case "abd998f9c25a450fa64662348294d4a3":
  184.       case "57fd39492c974bc3aaa4e3c6d635c903":
  185.       case "0ac146b10d064ceea5fe63032520d122":
  186.         $domain false;
  187.         break;
  188.       case "8d37666518ff479c8453855c061e3571":
  189.       case "e88dfa92e9e54de194cea0d5332f27ca":
  190.       case "01a3a5fa086343d6bed217f542874213":
  191.         $domain '/it';
  192.         break;
  193.       default:
  194.         $domain '/en';
  195.     }
  196.     return $domain;
  197.   }
  198. }