Magento 2.1.9: Changer de magasin en fonction du pays

10

Important: je ne souhaite acheter aucune extension GeoIP. J'ai un site Web Magento 2.1.9 avec une configuration multi-sites et multi-magasins. J'ai configuré un site Web pour KSA, les Émirats arabes unis, la Chine, l'Égypte, etc. et sous chaque site Web, il y a au moins 2 vues de magasin, par exemple, pour KSA, j'ai des vues de magasin en arabe et en anglais.

Je veux montrer à l'utilisateur le site Web en fonction de son pays selon l'adresse IP. par exemple, pour les utilisateurs accédant à partir de KSA, l'ar_sa (magasin arabe - arabie saoudite doit être par défaut) de même pour les utilisateurs des EAU (ar_uae ou en_uae).

J'ai fait le codage suivant jusqu'à présent et j'ai réussi à obtenir le pays de l'adresse IP.

Voici mon etc/frontend/events.xmldossier:

<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='urn:magento:framework/Event/etc/events.xsd'>
    <event name='controller_action_predispatch'>
        <observer name='Asoft_GeoIP_Redirect' instance='Asoft\GeoIP\Observer\Redirect' />
    </event>
</config>

Et voici mon Observer/Redirect.php:

namespace Asoft\GeoIP\Observer;

class Redirect implements \Magento\Framework\Event\ObserverInterface
{

    protected $_objectManager;
    protected $_storeManager;
    protected $_curl;

    public function __construct(
        \Magento\Framework\ObjectManagerInterface $objectManager,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Framework\HTTP\Client\Curl $curl
    ) {
        $this->_objectManager = $objectManager;
        $this->_storeManager = $storeManager;
        $this->_curl = $curl;

    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        //echo 'You are browsing from : '.$this->getCountryName();
        switch ($this->getCountryName()){
            case 'UAE':
                $store_id = '11';
                break;
            default :
                $store_id = '7';
        }$this->_storeManager->setCurrentStore($store_id);
    }

    public function getCountryName()
    {
        $visitorIp = $this->getVisitorIp();
        $url = "freegeoip.net/json/".$visitorIp;
        $this->_curl->get($url);
        $response = json_decode($this->_curl->getBody(), true);
        //echo '<pre>';
        //print_r($response);
        $countryCode = $response['country_code'];
        $countryName = $response['country_name'];
        $stateName = $response['region_name'];
        return $countryCode;
    }

    function getVisitorIp()
    {
        $remoteAddress = $this->_objectManager->create('Magento\Framework\HTTP\PhpEnvironment\RemoteAddress');
        return $remoteAddress->getRemoteAddress();
    }
}

Mais cela ne change que le nom du magasin et pas d'autres choses - comme la langue / devise ou la mise en page.

Abid Malik
la source
utilisez simplement geoip librement fourni dans votre webstack, soit le module php-geoip ou geoip apache, puis redirigez simplement les utilisateurs vers le code, par défaut magento MAGE_RUN_TYPE MAGE_RUN_CODE .... simple as 1 2 3
MagenX
puis-je utiliser en quelque sorte MAGE_RUN_TYPE et MAGE_RUN_CODE du module personnalisé
Abid Malik
Vous pouvez essayer l'extension ci-dessous si elle vous convient: magedelight.com/magento-2-extensions/… J'espère que cela fonctionnera bien pour vous.
Himmat Paliwal
@AbidMalik avez-vous trouvé des solutions.? Veuillez le partager ici. J'ai aussi besoin du même
Ask Bytes
@AskBytes - non, je me promène toujours.
Abid Malik

Réponses:

0

J'ai trouvé en regardant le commutateur de magasin par défaut de Magento qu'il appelle {{url}}? ___ store = {{store_code}}. Vous devrez donc rediriger l'utilisateur vers la même URL mais en ajoutant le paramètre get contenant le code du magasin, par exemplehttps://www.my-store.com/sofas?__store=france

Notez que cette détection PHP de l'emplacement et de la redirection ne fonctionnera jamais si vous prévoyez d'utiliser une technologie de mise en cache comme le vernis, ce que je pense que vous devriez. Si vous utilisez du vernis, vous pouvez toujours utiliser la plupart de votre code, mais il doit être exécuté à partir d'une demande AJAX après le chargement de la page.

デ リ エ ゴ く ん
la source
puis-je utiliser en quelque sorte MAGE_RUN_TYPE et MAGE_RUN_CODE du module personnalisé
Abid Malik