Magento 2 Перенаправление на другой магазин в зависимости от клиента - PullRequest
2 голосов
/ 20 мая 2019

Я использую наблюдателя для события "controller_action_predispatch", чтобы перенаправить клиентов в определенные представления магазина (на основе некоторых атрибутов)

Проблема в том, что, насколько мне известно, текущий вид магазина меняется послеMagento загрузил тему.

Поэтому, чтобы получить желаемый результат (каждый просмотр магазина соответствует отдельной теме), я должен перезагрузить страницу после успешного входа в систему.

Мои events.xml

<?xml version="1.0"?>
<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="redirect_customer_to_store_view" instance="Namespace\Module\Observer\CustomerRedirection" />
    </event>
</config>

namespace Namespace\Module\Observer;

use Magento\Framework\App\ObjectManager;
use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;
use \Magento\Store\Model\Store;

class CustomerRedirection implements ObserverInterface
{

    private $_storeManager;
    private $_store_cookie_manager;
    private $_http_context;
    private $_customer_session;
    private $_storeIdsMap;
    private $_storeRepository;
    private $_responseFactory;
    private $_url;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Store\Api\StoreCookieManagerInterface $store_cookie_manager,
        \Magento\Framework\App\Http\Context $http_context,
        \Magento\Customer\Model\Session $customer_session,
        \Magento\Store\Api\StoreRepositoryInterface $storeRepository,
        \Magento\Framework\App\ResponseFactory $responseFactory,
        \Magento\Framework\UrlInterface $url

    ) {
        $this->_storeManager         = $context->getStoreManager();
        $this->_store_cookie_manager = $store_cookie_manager;
        $this->_http_context         = $http_context;
        $this->_customer_session     = $customer_session;
        $this->_storeRepository      = $storeRepository;
        $this->_responseFactory      = $responseFactory;
        $this->_url                  = $url;

        $this->_storeIdsMap = //Store ids map

    }

    private function changeStoreView($storeId)
    {
        $stores = $this->_storeManager->getStores();

        foreach ($stores as $store) {
            if ($storeId === $store['store_id']) {

                $this->_storeManager->setCurrentStore($storeId);
                $store = $this->_storeRepository->getActiveStoreByCode($store->getCode());
                $this->_http_context->setValue(Store::ENTITY, $store->getCode(), $store->getCode());
                $this->_store_cookie_manager->setStoreCookie($store);

                return;
            }
        }
    }

    public function execute(EventObserver $observer)
    {

        $this->changeStoreView(//Store View Id Here);
        return $this;
    }
}

Попытка вернуть новый объект ответа (содержащий новый путь перенаправления) и без использования плагина в контроллере LoginPost

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...