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. //$ip = "1.186.255.255";
  75.     /**
  76.      * PER TEST DA LOCALHOST
  77.      * //USA - CANADA 184.151.230.135
  78.      * //IT 94.89.28.10
  79.      * //UK 195.195.237.39
  80.      */
  81.     if ('127.0.0.1' === $ip) {
  82.       $ip '94.89.28.10';
  83.     }
  84.     $cookieset $event->getRequest()->cookies->get('domainref');
  85.     if ($cookieset == null) {
  86.       $countryIso $this->GeoipServices->ip2country($ip);
  87.       $domainForCountry $this->domainForCountry($countryIso);
  88.     } else {
  89.       $domainForCountry $cookieset;
  90.     }
  91.     $currentDomain $event->getRequest()->attributes->get(RequestTransformer::SALES_CHANNEL_BASE_URL);
  92.     $currentDomain $currentDomain === "" "/it" $currentDomain;
  93.     $currentUri $event->getRequest()->getRequestUri();
  94.           $currentRouteName $event->getRequest()->attributes->get('_route');
  95.     $currentRouteLink $event->getRequest()->attributes->get('sw-original-request-uri');
  96.     $maindomain $event->getRequest()->attributes->get(RequestTransformer::SALES_CHANNEL_ABSOLUTE_BASE_URL);
  97.     $domainPath $domainForCountry === '/it' '/it' $domainForCountry;
  98.     $newUrl $maindomain $domainPath $currentUri;
  99.     if (str_contains($salesChannelName'B2B')) {
  100.       $customer $event->getRequest()->attributes->get('sw-sales-channel-context')->getCustomer();
  101.       $currentRouteName $event->getRequest()->attributes->get('_route');
  102.       if ($customer == null) {
  103.          if ($currentRouteName === 'frontend.account.recover.page') {
  104.            return;
  105.         }else if ($currentRouteName === 'frontend.home.page') {
  106.           return;
  107.         }
  108.         else if ($currentRouteName === 'frontend.login') {
  109.           return;
  110.         }else if ($currentRouteName === 'frontend.account.register.page') {
  111.           return;
  112.         }
  113.         else if ($currentRouteName === 'frontend.account.recover.password.page') {
  114.           return;
  115.         } else if ($currentRouteName === 'frontend.account.recover.request') {
  116.           return;
  117.         } else if ($currentRouteName !== 'frontend.login') {
  118.           $isAllowed $event->getRequest()->attributes->getBoolean('XmlHttpRequest'false);
  119.           if ($isAllowed) {
  120.             return;
  121.           }
  122.           $newUrl $this->router->generate('frontend.login');
  123.           $redirectResponse = new RedirectResponse($newUrl);
  124.           $redirectResponse->send();
  125.         }
  126.       } else {
  127.         $customerIdGroup $customer->getGroupId();
  128.         $domainForCustomer $this->domainForCustomer($customerIdGroup);
  129.         if($domainForCustomer) {
  130.           if ($currentDomain !== $domainForCustomer) {
  131.             $domainPath $domainForCustomer === '/it' '/it' $domainForCustomer;
  132.             $newUrl $maindomain $domainPath $currentUri;
  133.             $redirectResponse = new RedirectResponse($newUrl);
  134.             $redirectResponse->send();
  135.           }
  136.         } else if ($currentRouteName !== 'frontend.account.home.page') {
  137.           $isAllowed $event->getRequest()->attributes->getBoolean('XmlHttpRequest'false);
  138.           if ($isAllowed) {
  139.             return;
  140.           }
  141.             $newUrl $this->router->generate('frontend.account.home.page');
  142.             $redirectResponse = new RedirectResponse($newUrl);
  143.             $redirectResponse->send();
  144.         }
  145.         return;
  146.       }
  147.     }
  148. //    $response = new Response();
  149.     $event->getResponse()->headers->setCookie(Cookie::create('domainref'$domainForCountry));
  150.    // $event->getResponse()->headers->setCookie(Cookie::create('ip', $countryIso));
  151.     if ($currentDomain !== $domainForCountry) {
  152.       $redirectResponse = new RedirectResponse($newUrl);
  153.       $redirectResponse->send();
  154.     }
  155.   }
  156.   /**
  157.    * @param string $country
  158.    * @return string
  159.    */
  160.   public function domainForCountry(string $country)
  161.   {
  162.     switch ($country) {
  163.       case "UK":
  164.       case "GB":
  165.         $domain '/uk';
  166.         break;
  167.       case "US":
  168.       case "CA":
  169.         $domain '/usa';
  170.         break;
  171.       case "IT":
  172.         $domain '/it';
  173.         break;
  174.       default:
  175.         $domain '/en';
  176.     }
  177.     return $domain;
  178.   }
  179.   /**
  180.    * @param string $country
  181.    * @return string
  182.    */
  183.   public function domainForCustomer(string $categoryUser)
  184.   {
  185.     switch ($categoryUser) {
  186.       case "ce2c04e5fa89404ebc2b9f133a81e3e1":
  187.       case "0173864dfe1744ceb3fbc7dce2b843c6":
  188.         $domain '/usa';
  189.         break;
  190.       case "abd998f9c25a450fa64662348294d4a3":
  191.       case "57fd39492c974bc3aaa4e3c6d635c903":
  192.       case "0ac146b10d064ceea5fe63032520d122":
  193.         $domain false;
  194.         break;
  195.       case "8d37666518ff479c8453855c061e3571":
  196.       case "e88dfa92e9e54de194cea0d5332f27ca":
  197.       case "01a3a5fa086343d6bed217f542874213":
  198.       case "6386fa194c64468197b076897e22f048":
  199.         $domain '/it';
  200.         break;
  201.       default:
  202.         $domain '/en';
  203.     }
  204.     return $domain;
  205.   }
  206. }