From bf309260ce22c565d8e962b80e5add338e1fbd79 Mon Sep 17 00:00:00 2001 From: Roger Date: Sun, 11 Dec 2022 17:28:29 +0000 Subject: [PATCH 1/5] Issue 36563: Remember Category Pagination causes a Document Expired/form submission error --- .../Magento/Catalog/Block/Product/ProductList/Toolbar.php | 3 ++- .../Catalog/view/frontend/web/js/product/list/toolbar.js | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php index fffbd052b4fb6..0d25cbdc7c89d 100644 --- a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php +++ b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php @@ -745,7 +745,8 @@ public function getWidgetOptionsJson(array $customOptions = []) 'limitDefault' => $this->_productListHelper->getDefaultLimitPerPageValue($defaultMode), 'url' => $this->getPagerUrl(), 'formKey' => $this->formKey->getFormKey(), - 'post' => $this->toolbarMemorizer->isMemorizingAllowed() ? true : false + 'post' => false, + 'memorizingAllowed' => $this->toolbarMemorizer->isMemorizingAllowed() ? true : false ]; $options = array_replace_recursive($options, $customOptions); return json_encode(['productListToolbarForm' => $options]); diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js index 0f8f284974382..a1ba76b3f6a39 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js @@ -30,7 +30,8 @@ define([ limitDefault: '9', url: '', formKey: '', - post: false + post: false, + memorizingAllowed: false }, /** @inheritdoc */ @@ -187,7 +188,7 @@ define([ document.body.appendChild(form); form.submit(); } else { - if (paramValue == defaultValue) { //eslint-disable-line eqeqeq + if (!this.options.memorizingAllowed && paramValue == defaultValue) { //eslint-disable-line eqeqeq delete paramData[paramName]; } From 9c67990ce316ca76a44783a6f1ea9eaed69edd88 Mon Sep 17 00:00:00 2001 From: Roger Date: Thu, 22 Dec 2022 16:23:58 +0000 Subject: [PATCH 2/5] Revert "Issue 36563: Remember Category Pagination causes a Document Expired/form submission error" This reverts commit bf309260ce22c565d8e962b80e5add338e1fbd79. --- .../Magento/Catalog/Block/Product/ProductList/Toolbar.php | 3 +-- .../Catalog/view/frontend/web/js/product/list/toolbar.js | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php index 0d25cbdc7c89d..fffbd052b4fb6 100644 --- a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php +++ b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php @@ -745,8 +745,7 @@ public function getWidgetOptionsJson(array $customOptions = []) 'limitDefault' => $this->_productListHelper->getDefaultLimitPerPageValue($defaultMode), 'url' => $this->getPagerUrl(), 'formKey' => $this->formKey->getFormKey(), - 'post' => false, - 'memorizingAllowed' => $this->toolbarMemorizer->isMemorizingAllowed() ? true : false + 'post' => $this->toolbarMemorizer->isMemorizingAllowed() ? true : false ]; $options = array_replace_recursive($options, $customOptions); return json_encode(['productListToolbarForm' => $options]); diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js index a1ba76b3f6a39..0f8f284974382 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js @@ -30,8 +30,7 @@ define([ limitDefault: '9', url: '', formKey: '', - post: false, - memorizingAllowed: false + post: false }, /** @inheritdoc */ @@ -188,7 +187,7 @@ define([ document.body.appendChild(form); form.submit(); } else { - if (!this.options.memorizingAllowed && paramValue == defaultValue) { //eslint-disable-line eqeqeq + if (paramValue == defaultValue) { //eslint-disable-line eqeqeq delete paramData[paramName]; } From d0b00096d4eb81cb4d31e24d9e9f13f9759d5480 Mon Sep 17 00:00:00 2001 From: Roger Date: Thu, 22 Dec 2022 17:12:43 +0000 Subject: [PATCH 3/5] Issue 36563: Remember Category Pagination causes a Document Expired/form submission error --- .../Catalog/Controller/Category/View.php | 24 ++++++++++++++++++- .../frontend/web/js/product/list/toolbar.js | 5 ++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Catalog/Controller/Category/View.php b/app/code/Magento/Catalog/Controller/Category/View.php index 196eb313bc62d..6ab041b31be87 100644 --- a/app/code/Magento/Catalog/Controller/Category/View.php +++ b/app/code/Magento/Catalog/Controller/Category/View.php @@ -22,7 +22,6 @@ use Magento\Framework\App\ActionInterface; use Magento\Framework\App\ObjectManager; use Magento\Framework\Controller\Result\ForwardFactory; -use Magento\Framework\Controller\ResultInterface; use Magento\Framework\DataObject; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\NoSuchEntityException; @@ -39,6 +38,8 @@ */ class View extends Action implements HttpGetActionInterface, HttpPostActionInterface { + protected const PARAM_NAME_REDIRECT_URL = 'redirect_url'; + /** * @var Registry */ @@ -211,6 +212,11 @@ public function execute() } $category = $this->_initCategory(); if ($category) { + $redirectUrl = $this->applyMemorizingRedirect(); + if ($redirectUrl) { + return $this->resultRedirectFactory->create()->setUrl($redirectUrl); + } + $this->layerResolver->create(Resolver::CATALOG_LAYER_CATEGORY); $settings = $this->_catalogDesign->getDesignSettings($category); @@ -294,4 +300,20 @@ private function applyLayoutUpdates( $page->addPageLayoutHandles($settings->getPageLayoutHandles()); } } + + /** + * Apply redirect for Memorizing + * + * @return false|mixed + */ + private function applyMemorizingRedirect() + { + if ($this->toolbarMemorizer->isMemorizingAllowed()) { + $url = $this->_request->getParam(self::PARAM_NAME_REDIRECT_URL); + if ($url) { + return $url; + } + } + return false; + } } diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js index 0f8f284974382..b58a453d860c7 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js @@ -179,6 +179,11 @@ define([ formKey.value = this.options.formKey; form.appendChild(formKey); + input = document.createElement('input'); + input.name = 'redirect_url'; + input.value = this.options.url; + form.appendChild(input); + paramData = $.param(paramData); baseUrl += paramData.length ? '?' + paramData : ''; From 51033d3f472e79f6a64fce83c00ab295d11717b8 Mon Sep 17 00:00:00 2001 From: Roger Date: Mon, 9 Jan 2023 16:01:39 +0000 Subject: [PATCH 4/5] Issue 36563: update code --- .../Catalog/Controller/Category/View.php | 24 +++---------------- .../Product/ProductList/ToolbarMemorizer.php | 20 ++++++++++++++-- .../frontend/web/js/product/list/toolbar.js | 5 ---- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/app/code/Magento/Catalog/Controller/Category/View.php b/app/code/Magento/Catalog/Controller/Category/View.php index 6ab041b31be87..0261b52ca2622 100644 --- a/app/code/Magento/Catalog/Controller/Category/View.php +++ b/app/code/Magento/Catalog/Controller/Category/View.php @@ -211,12 +211,10 @@ public function execute() return $this->resultRedirectFactory->create()->setUrl($this->_redirect->getRedirectUrl()); } $category = $this->_initCategory(); + if ($this->toolbarMemorizer->hasMemorizingParam()) { + return $this->resultRedirectFactory->create()->setUrl($this->_redirect->getRedirectUrl()); + } if ($category) { - $redirectUrl = $this->applyMemorizingRedirect(); - if ($redirectUrl) { - return $this->resultRedirectFactory->create()->setUrl($redirectUrl); - } - $this->layerResolver->create(Resolver::CATALOG_LAYER_CATEGORY); $settings = $this->_catalogDesign->getDesignSettings($category); @@ -300,20 +298,4 @@ private function applyLayoutUpdates( $page->addPageLayoutHandles($settings->getPageLayoutHandles()); } } - - /** - * Apply redirect for Memorizing - * - * @return false|mixed - */ - private function applyMemorizingRedirect() - { - if ($this->toolbarMemorizer->isMemorizingAllowed()) { - $url = $this->_request->getParam(self::PARAM_NAME_REDIRECT_URL); - if ($url) { - return $url; - } - } - return false; - } } diff --git a/app/code/Magento/Catalog/Model/Product/ProductList/ToolbarMemorizer.php b/app/code/Magento/Catalog/Model/Product/ProductList/ToolbarMemorizer.php index 9c1a781d594f7..84bf0b62f239e 100644 --- a/app/code/Magento/Catalog/Model/Product/ProductList/ToolbarMemorizer.php +++ b/app/code/Magento/Catalog/Model/Product/ProductList/ToolbarMemorizer.php @@ -3,7 +3,6 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ - declare(strict_types=1); namespace Magento\Catalog\Model\Product\ProductList; @@ -15,13 +14,14 @@ * Class ToolbarMemorizer * * Responds for saving toolbar settings to catalog session + * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) */ class ToolbarMemorizer { /** * XML PATH to enable/disable saving toolbar parameters to session */ - const XML_PATH_CATALOG_REMEMBER_PAGINATION = 'catalog/frontend/remember_pagination'; + public const XML_PATH_CATALOG_REMEMBER_PAGINATION = 'catalog/frontend/remember_pagination'; /** * @var CatalogSession @@ -63,6 +63,11 @@ class ToolbarMemorizer */ private $isMemorizingAllowed; + /** + * @var bool + */ + private $hasMemorizeParam = false; + /** * @param Toolbar $toolbarModel * @param CatalogSession $catalogSession @@ -173,7 +178,18 @@ private function memorizeParam($param, $value) { if ($value && $this->catalogSession->getData($param) != $value) { $this->catalogSession->setData($param, $value); + $this->hasMemorizeParam = true; } return $this; } + + /** + * Check has Memorize parameter value apply + * + * @return bool + */ + public function hasMemorizingParam() + { + return $this->hasMemorizeParam; + } } diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js index b58a453d860c7..0f8f284974382 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js @@ -179,11 +179,6 @@ define([ formKey.value = this.options.formKey; form.appendChild(formKey); - input = document.createElement('input'); - input.name = 'redirect_url'; - input.value = this.options.url; - form.appendChild(input); - paramData = $.param(paramData); baseUrl += paramData.length ? '?' + paramData : ''; From 1e155c7e3307fe2c7b8d3bc57d50d65615f2b401 Mon Sep 17 00:00:00 2001 From: Roger Date: Mon, 9 Jan 2023 16:02:38 +0000 Subject: [PATCH 5/5] Issue 36563: update code --- app/code/Magento/Catalog/Controller/Category/View.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/code/Magento/Catalog/Controller/Category/View.php b/app/code/Magento/Catalog/Controller/Category/View.php index 0261b52ca2622..b76f039aca5d2 100644 --- a/app/code/Magento/Catalog/Controller/Category/View.php +++ b/app/code/Magento/Catalog/Controller/Category/View.php @@ -38,8 +38,6 @@ */ class View extends Action implements HttpGetActionInterface, HttpPostActionInterface { - protected const PARAM_NAME_REDIRECT_URL = 'redirect_url'; - /** * @var Registry */