diff --git a/vendor/magento/module-catalog/Controller/Category/View.php b/vendor/magento/module-catalog/Controller/Category/View.php index 196eb313bc62d..5a47e53440c96 100644 --- a/vendor/magento/module-catalog/Controller/Category/View.php +++ b/vendor/magento/module-catalog/Controller/Category/View.php @@ -13,6 +13,7 @@ use Magento\Catalog\Model\Design; use Magento\Catalog\Model\Layer\Resolver; use Magento\Catalog\Model\Product\ProductList\ToolbarMemorizer; +use Magento\Catalog\Model\Product\ProductList\Toolbar; use Magento\Catalog\Model\Session; use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator; use Magento\Framework\App\Action\Action; @@ -22,7 +23,7 @@ use Magento\Framework\App\ActionInterface; use Magento\Framework\App\ObjectManager; use Magento\Framework\Controller\Result\ForwardFactory; -use Magento\Framework\Controller\ResultInterface; +use Magento\Framework\Controller\ResultFactory; use Magento\Framework\DataObject; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\NoSuchEntityException; @@ -209,6 +210,7 @@ public function execute() //phpcs:ignore Magento2.Legacy.ObsoleteResponse return $this->resultRedirectFactory->create()->setUrl($this->_redirect->getRedirectUrl()); } + $category = $this->_initCategory(); if ($category) { $this->layerResolver->create(Resolver::CATALOG_LAYER_CATEGORY); @@ -247,6 +249,9 @@ public function execute() ->addBodyClass('categorypath-' . $this->categoryUrlPathGenerator->getUrlPath($category)) ->addBodyClass('category-' . $category->getUrlKey()); + if ($this->shouldRedirectOnToolbarAction()) { + $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl()); + } return $page; } elseif (!$this->getResponse()->isRedirect()) { $result = $this->resultForwardFactory->create()->forward('noroute'); @@ -294,4 +299,21 @@ private function applyLayoutUpdates( $page->addPageLayoutHandles($settings->getPageLayoutHandles()); } } + + /** + * Checks for toolbar actions + * + * @return bool + */ + private function shouldRedirectOnToolbarAction(): bool + { + $params = $this->getRequest()->getParams(); + + return $this->toolbarMemorizer->isMemorizingAllowed() && empty(array_intersect([ + Toolbar::ORDER_PARAM_NAME, + Toolbar::DIRECTION_PARAM_NAME, + Toolbar::MODE_PARAM_NAME, + Toolbar::LIMIT_PARAM_NAME + ], array_keys($params))) === false; + } } diff --git a/vendor/magento/module-catalog-search/Controller/Result/Index.php b/vendor/magento/module-catalog-search/Controller/Result/Index.php index 975c6ba1e7eb9..02d993dc130bb 100644 --- a/vendor/magento/module-catalog-search/Controller/Result/Index.php +++ b/vendor/magento/module-catalog-search/Controller/Result/Index.php @@ -14,6 +14,8 @@ use Magento\Store\Model\StoreManagerInterface; use Magento\Search\Model\QueryFactory; use Magento\Search\Model\PopularSearchTerms; +use Magento\Catalog\Model\Product\ProductList\ToolbarMemorizer; +use Magento\Catalog\Model\Product\ProductList\Toolbar; /** * Search result. @@ -23,10 +25,10 @@ class Index extends \Magento\Framework\App\Action\Action implements HttpGetActio /** * No results default handle. */ - const DEFAULT_NO_RESULT_HANDLE = 'catalogsearch_result_index_noresults'; + public const DEFAULT_NO_RESULT_HANDLE = 'catalogsearch_result_index_noresults'; /** - * Catalog session + * Catalog session for storing catalog-related data * * @var Session */ @@ -49,25 +51,34 @@ class Index extends \Magento\Framework\App\Action\Action implements HttpGetActio */ private $layerResolver; + /** + * @var ToolbarMemorizer + */ + private $toolbarMemorizer; + /** * @param Context $context * @param Session $catalogSession * @param StoreManagerInterface $storeManager * @param QueryFactory $queryFactory * @param Resolver $layerResolver + * @param ToolbarMemorizer|null $toolbarMemorizer */ public function __construct( Context $context, Session $catalogSession, StoreManagerInterface $storeManager, QueryFactory $queryFactory, - Resolver $layerResolver + Resolver $layerResolver, + ?ToolbarMemorizer $toolbarMemorizer = null ) { parent::__construct($context); $this->_storeManager = $storeManager; $this->_catalogSession = $catalogSession; $this->_queryFactory = $queryFactory; $this->layerResolver = $layerResolver; + $this->toolbarMemorizer = $toolbarMemorizer ?: + \Magento\Framework\App\ObjectManager::getInstance()->get(ToolbarMemorizer::class); } /** @@ -102,6 +113,11 @@ public function execute() $handles[] = static::DEFAULT_NO_RESULT_HANDLE; } + if ($this->shouldRedirectOnToolbarAction()) { + $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl()); + return; + } + if (empty($getAdditionalRequestParameters) && $this->_objectManager->get(PopularSearchTerms::class)->isCacheable($queryText, $storeId) ) { @@ -167,4 +183,21 @@ private function getNotCacheableResult($catalogSearchHelper, $query, $handles) $this->getResponse()->setNoCacheHeaders(); $this->_view->renderLayout(); } + + /** + * Checks for toolbar actions + * + * @return bool + */ + private function shouldRedirectOnToolbarAction(): bool + { + $params = $this->getRequest()->getParams(); + + return $this->toolbarMemorizer->isMemorizingAllowed() && empty(array_intersect([ + Toolbar::ORDER_PARAM_NAME, + Toolbar::DIRECTION_PARAM_NAME, + Toolbar::MODE_PARAM_NAME, + Toolbar::LIMIT_PARAM_NAME + ], array_keys($params))) === false; + } } diff --git a/vendor/magento/module-catalog-search/Observer/ToolbarMemorizerObserver.php b/vendor/magento/module-catalog-search/Observer/ToolbarMemorizerObserver.php new file mode 100644 index 0000000000000..49a11b58e21c5 --- /dev/null +++ b/vendor/magento/module-catalog-search/Observer/ToolbarMemorizerObserver.php @@ -0,0 +1,40 @@ +toolbarMemorizer = $toolbarMemorizer; + } + + /** + * Save toolbar parameters in catalog session + * + * @param Observer $observer + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function execute(Observer $observer): void + { + $this->toolbarMemorizer->memorizeParams(); + } +} diff --git a/vendor/magento/module-catalog-search/etc/frontend/events.xml b/vendor/magento/module-catalog-search/etc/frontend/events.xml new file mode 100644 index 0000000000000..ffbfb399815d9 --- /dev/null +++ b/vendor/magento/module-catalog-search/etc/frontend/events.xml @@ -0,0 +1,15 @@ + + + + + + + + + +