/** * @param \Magento\Framework\App\ActionInterface $subject * @param callable $proceed * @param \Magento\Framework\App\RequestInterface $request * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundExecute( \Magento\Framework\App\ActionInterface $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request ) { /** @var \Magento\Store\Model\Store $defaultStore */ $defaultStore = $this->storeManager->getWebsite()->getDefaultStore(); $requestedStoreCode = $this->httpRequest->getParam( StoreResolverInterface::PARAM_NAME, $this->storeCookieManager->getStoreCodeFromCookie() ); /** @var \Magento\Store\Model\Store $currentStore */ $currentStore = $requestedStoreCode ? $this->storeManager->getStore($requestedStoreCode) : $defaultStore; $this->httpContext->setValue( StoreManagerInterface::CONTEXT_STORE, $currentStore->getCode(), $this->storeManager->getDefaultStoreView()->getCode() ); $this->httpContext->setValue( HttpContext::CONTEXT_CURRENCY, $this->session->getCurrencyCode() ?: $currentStore->getDefaultCurrencyCode(), $defaultStore->getDefaultCurrencyCode() ); return $proceed($request); }
/** * @return void */ public function executeInternal() { $storeCode = $this->_request->getParam( StoreResolver::PARAM_NAME, $this->storeCookieManager->getStoreCodeFromCookie() ); try { $store = $this->storeRepository->getActiveStoreByCode($storeCode); } catch (StoreIsInactiveException $e) { $error = __('Requested store is inactive'); } catch (NoSuchEntityException $e) { $error = __('Requested store is not found'); } if (isset($error)) { $this->messageManager->addError($error); $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl()); return; } $defaultStoreView = $this->storeManager->getDefaultStoreView(); if ($defaultStoreView->getId() == $store->getId()) { $this->storeCookieManager->deleteStoreCookie($store); } else { $this->httpContext->setValue(Store::ENTITY, $store->getCode(), $defaultStoreView->getCode()); $this->storeCookieManager->setStoreCookie($store); } $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl()); }
/** * Delete cookie "store" if the store (a value in the cookie) does not exist or is inactive * * @param \Magento\Framework\App\FrontController $subject * @param \Magento\Framework\App\RequestInterface $request * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function beforeDispatch(\Magento\Framework\App\FrontController $subject, \Magento\Framework\App\RequestInterface $request) { $storeCodeFromCookie = $this->storeCookieManager->getStoreCodeFromCookie(); if ($storeCodeFromCookie) { try { $this->storeRepository->getActiveStoreByCode($storeCodeFromCookie); } catch (StoreIsInactiveException $e) { $this->storeCookieManager->deleteStoreCookie($this->storeManager->getDefaultStoreView()); } catch (NoSuchEntityException $e) { $this->storeCookieManager->deleteStoreCookie($this->storeManager->getDefaultStoreView()); } catch (InvalidArgumentException $e) { $this->storeCookieManager->deleteStoreCookie($this->storeManager->getDefaultStoreView()); } } }
/** * Set up */ public function setUp() { $this->sessionMock = $this->getMock('Magento\\Framework\\Session\\Generic', ['getCurrencyCode'], [], '', false); $this->httpContextMock = $this->getMock('Magento\\Framework\\App\\Http\\Context', [], [], '', false); $this->httpRequestMock = $this->getMock('Magento\\Framework\\App\\Request\\Http', ['getParam'], [], '', false); $this->storeManager = $this->getMock('Magento\\Store\\Model\\StoreManagerInterface'); $this->storeCookieManager = $this->getMock('Magento\\Store\\Api\\StoreCookieManagerInterface'); $this->storeMock = $this->getMock('Magento\\Store\\Model\\Store', [], [], '', false); $this->currentStoreMock = $this->getMock('Magento\\Store\\Model\\Store', [], [], '', false); $this->websiteMock = $this->getMock('Magento\\Store\\Model\\Website', ['getDefaultStore', '__wakeup'], [], '', false); $this->closureMock = function () { return 'ExpectedValue'; }; $this->subjectMock = $this->getMock('Magento\\Framework\\App\\Action\\Action', [], [], '', false); $this->requestMock = $this->getMock('Magento\\Framework\\App\\RequestInterface'); $this->plugin = (new ObjectManager($this))->getObject('Magento\\Store\\App\\Action\\Plugin\\Context', ['session' => $this->sessionMock, 'httpContext' => $this->httpContextMock, 'httpRequest' => $this->httpRequestMock, 'storeManager' => $this->storeManager, 'storeCookieManager' => $this->storeCookieManager]); $this->storeManager->expects($this->once())->method('getWebsite')->will($this->returnValue($this->websiteMock)); $this->storeManager->method('getDefaultStoreView')->willReturn($this->storeMock); $this->storeManager->method('getStore')->willReturn($this->currentStoreMock); $this->websiteMock->expects($this->once())->method('getDefaultStore')->will($this->returnValue($this->storeMock)); $this->storeMock->expects($this->once())->method('getDefaultCurrencyCode')->will($this->returnValue(self::CURRENCY_DEFAULT)); $this->storeMock->expects($this->once())->method('getCode')->willReturn('default'); $this->currentStoreMock->expects($this->once())->method('getCode')->willReturn('custom_store'); $this->storeCookieManager->expects($this->once())->method('getStoreCodeFromCookie')->will($this->returnValue('storeCookie')); $this->httpRequestMock->expects($this->once())->method('getParam')->with($this->equalTo('___store'))->will($this->returnValue('default')); $this->currentStoreMock->expects($this->any())->method('getDefaultCurrencyCode')->will($this->returnValue(self::CURRENCY_CURRENT_STORE)); }
/** * @param \Magento\Framework\App\ActionInterface $subject * @param callable $proceed * @param \Magento\Framework\App\RequestInterface $request * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundDispatch(\Magento\Framework\App\ActionInterface $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request) { /** @var \Magento\Store\Model\Store $defaultStore */ $defaultStore = $this->storeManager->getWebsite()->getDefaultStore(); $storeCode = $this->httpRequest->getParam(StoreResolverInterface::PARAM_NAME, $this->storeCookieManager->getStoreCodeFromCookie()); if (is_array($storeCode)) { if (!isset($storeCode['_data']['code'])) { throw new \InvalidArgumentException(new Phrase('Invalid store parameter.')); } $storeCode = $storeCode['_data']['code']; } /** @var \Magento\Store\Model\Store $currentStore */ $currentStore = $storeCode ? $this->storeManager->getStore($storeCode) : $defaultStore; $this->httpContext->setValue(StoreManagerInterface::CONTEXT_STORE, $currentStore->getCode(), $this->storeManager->getDefaultStoreView()->getCode()); $this->httpContext->setValue(HttpContext::CONTEXT_CURRENCY, $this->session->getCurrencyCode() ?: $currentStore->getDefaultCurrencyCode(), $defaultStore->getDefaultCurrencyCode()); return $proceed($request); }
/** * {@inheritdoc} */ public function getCurrentStoreId() { list($stores, $defaultStoreId) = $this->getStoresData(); $storeCode = $this->request->getParam(self::PARAM_NAME, $this->storeCookieManager->getStoreCodeFromCookie()); if ($storeCode) { try { $store = $this->getRequestedStoreByCode($storeCode); } catch (NoSuchEntityException $e) { $store = $this->getDefaultStoreById($defaultStoreId); } if (!in_array($store->getId(), $stores)) { $store = $this->getDefaultStoreById($defaultStoreId); } } else { $store = $this->getDefaultStoreById($defaultStoreId); } return $store->getId(); }
public function testBeforeDispatchNoStoreCookie() { $storeCode = null; $this->storeCookieManagerMock->expects($this->once())->method('getStoreCodeFromCookie')->willReturn($storeCode); $this->storeManagerMock->expects($this->never())->method('getDefaultStoreView')->willReturn($this->storeMock); $this->storeRepositoryMock->expects($this->never())->method('getActiveStoreByCode'); $this->storeCookieManagerMock->expects($this->never())->method('deleteStoreCookie')->with($this->storeMock); $this->plugin->beforeDispatch($this->subjectMock, $this->requestMock); }
public function testAroundDispatchNoStoreCookie() { $storeCode = null; $this->storeManagerMock->expects($this->once())->method('getDefaultStoreView')->willReturn($this->storeMock); $this->storeCookieManagerMock->expects($this->once())->method('getStoreCodeFromCookie')->willReturn($storeCode); $this->storeRepositoryMock->expects($this->never())->method('getActiveStoreByCode'); $this->storeCookieManagerMock->expects($this->never())->method('deleteStoreCookie')->with($this->storeMock); $this->assertEquals('ExpectedValue', $this->plugin->aroundDispatch($this->subjectMock, $this->closureMock, $this->requestMock)); }
/** * {@inheritdoc} */ public function getCurrentStoreId() { list($stores, $defaultStoreId) = $this->getStoresData(); $storeCode = $this->request->getParam(self::PARAM_NAME, $this->storeCookieManager->getStoreCodeFromCookie()); if (is_array($storeCode)) { if (!isset($storeCode['_data']['code'])) { throw new \InvalidArgumentException(__('Invalid store parameter.')); } $storeCode = $storeCode['_data']['code']; } if ($storeCode) { try { $store = $this->getRequestedStoreByCode($storeCode); } catch (NoSuchEntityException $e) { $store = $this->getDefaultStoreById($defaultStoreId); } if (!in_array($store->getId(), $stores)) { $store = $this->getDefaultStoreById($defaultStoreId); } } else { $store = $this->getDefaultStoreById($defaultStoreId); } return $store->getId(); }