Magento 2.1.9: смена магазина в зависимости от страны


10

Важно: я не хочу покупать какие-либо расширения GeoIP. У меня есть веб-сайт Magento 2.1.9 с настройкой нескольких сайтов и нескольких магазинов. У меня есть настроенный веб-сайт для KSA, ОАЭ, КИТАЯ, ЕГИПЕТА и т. Д., И под каждым веб-сайтом по крайней мере 2 просмотра магазина, например, для KSA у меня есть арабские и английские представления магазина.

Я хочу показать пользователю веб-сайт в соответствии с его страной согласно IP-адресу. например, для пользователей, получающих доступ из KSA, ar_sa (по умолчанию арабский - хранилище в Саудовской Аравии) аналогично для пользователей из ОАЭ (ar_uae или en_uae).

До сих пор я выполнил следующее кодирование и успешно получил страну с IP-адреса.

Это мой etc/frontend/events.xmlфайл:

<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>

И это мое 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();
    }
}

Но это меняет только название магазина, а не другие вещи, такие как язык / валюта или макет.


просто используйте geoip, свободно предоставленный в вашем веб-стеке, либо в php-geoip, либо в модуле apache geoip, а затем просто перенаправьте пользователей для хранения кода, как по умолчанию magento MAGE_RUN_TYPE MAGE_RUN_CODE .... просто как 1 2 3
MagenX

могу ли я как-то использовать MAGE_RUN_TYPE и MAGE_RUN_CODE из пользовательского модуля
Абид Малик

Вы можете попробовать расширение ниже, если оно подходит вам: magedelight.com/magento-2-extensions/… Я надеюсь, что оно будет работать нормально для вас.
Химмат Паливал

@AbidMalik вы получили какие-либо решения? Пожалуйста, поделитесь этим здесь. Мне тоже нужно то же самое
Спросите байтов

@AskBytes - нет, я все еще брожу.
Абид Малик

Ответы:


0

Посмотрев на переключатель хранилища Magento по умолчанию, я обнаружил, что он вызывает {{url}}? ___ store = {{store_code}}. Таким образом, вам придется перенаправить пользователя на тот же URL-адрес, но добавить параметр get, содержащий код хранилища, напримерhttps://www.my-store.com/sofas?__store=france

Обратите внимание, что это обнаружение и перенаправление в PHP никогда не сработает, если вы планируете использовать технологию кэширования, такую ​​как лак, что, я думаю, вам следует. Если вы используете лак, то вы все равно можете использовать большую часть своего кода, но его необходимо выполнить из запроса AJAX после загрузки страницы.


могу ли я как-то использовать MAGE_RUN_TYPE и MAGE_RUN_CODE из пользовательского модуля
Абид Малик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.