From 6e8aa57655cd14d02a7f0bb5d8a51efe40029e1c Mon Sep 17 00:00:00 2001 From: Imran Date: Tue, 14 Oct 2025 14:53:07 +0530 Subject: [PATCH 01/12] Fix admin auto-logout when displaying large number of product reviews --- .../Magento/Review/Block/Adminhtml/Edit.php | 1 - .../Magento/Review/Block/Adminhtml/Grid.php | 15 -- .../Magento/Review/Helper/Action/Pager.php | 127 +++--------- .../Review/Product/Collection.php | 24 --- .../Test/Unit/Helper/Action/PagerTest.php | 189 +++++++++++++----- 5 files changed, 164 insertions(+), 192 deletions(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Edit.php b/app/code/Magento/Review/Block/Adminhtml/Edit.php index 9162d293f9332..fa319261f98e3 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Edit.php +++ b/app/code/Magento/Review/Block/Adminhtml/Edit.php @@ -67,7 +67,6 @@ protected function _construct() /** @var $actionPager \Magento\Review\Helper\Action\Pager */ $actionPager = $this->_reviewActionPager; - $actionPager->setStorageId('reviews'); $reviewId = $this->getRequest()->getParam('id'); $prevId = $actionPager->getPreviousItemId($reviewId); diff --git a/app/code/Magento/Review/Block/Adminhtml/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Grid.php index 798d6ae7148af..5d62c28a05268 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Review/Block/Adminhtml/Grid.php @@ -93,21 +93,6 @@ protected function _construct() $this->setDefaultSort('created_at'); } - /** - * Save search results - * - * @return \Magento\Backend\Block\Widget\Grid - */ - protected function _afterLoadCollection() - { - /** @var $actionPager \Magento\Review\Helper\Action\Pager */ - $actionPager = $this->_reviewActionPager; - $actionPager->setStorageId('reviews'); - $actionPager->setItems($this->getCollection()->getResultingIds()); - - return parent::_afterLoadCollection(); - } - /** * @inheritDoc */ diff --git a/app/code/Magento/Review/Helper/Action/Pager.php b/app/code/Magento/Review/Helper/Action/Pager.php index 5d1c5fd308e9c..e0bcc3ac78805 100644 --- a/app/code/Magento/Review/Helper/Action/Pager.php +++ b/app/code/Magento/Review/Helper/Action/Pager.php @@ -6,7 +6,8 @@ namespace Magento\Review\Helper\Action; -use Magento\Framework\Exception\LocalizedException; +use Magento\Framework\App\Helper\AbstractHelper; +use Magento\Review\Model\ResourceModel\Review\CollectionFactory; /** * Action pager helper for iterating over search results @@ -14,136 +15,68 @@ * @api * @since 100.0.2 */ -class Pager extends \Magento\Framework\App\Helper\AbstractHelper +class Pager extends AbstractHelper { - const STORAGE_PREFIX = 'search_result_ids'; - - /** - * Storage id - * - * @var int - */ - protected $_storageId = null; - /** - * Array of items + * Review collection factory * - * @var array + * @var CollectionFactory */ - protected $_items = null; + protected $reviewCollectionFactory; /** - * Backend session model + * Pager constructor. * - * @var \Magento\Backend\Model\Session - */ - protected $_backendSession; - - /** * @param \Magento\Framework\App\Helper\Context $context - * @param \Magento\Backend\Model\Session $backendSession + * @param CollectionFactory $reviewCollectionFactory */ public function __construct( \Magento\Framework\App\Helper\Context $context, - \Magento\Backend\Model\Session $backendSession + CollectionFactory $reviewCollectionFactory ) { - $this->_backendSession = $backendSession; parent::__construct($context); + $this->reviewCollectionFactory = $reviewCollectionFactory; } /** - * Set storage id - * - * @param int $storageId - * @return void - */ - public function setStorageId($storageId) - { - $this->_storageId = $storageId; - } - - /** - * Set items to storage - * - * @param array $items - * @return $this - */ - public function setItems(array $items) - { - $this->_items = $items; - $this->_backendSession->setData($this->_getStorageKey(), $this->_items); - - return $this; - } - - /** - * Load stored items - * - * @return void - */ - protected function _loadItems() - { - if ($this->_items === null) { - $this->_items = (array)$this->_backendSession->getData($this->_getStorageKey()); - } - } - - /** - * Get next item id + * Get the next review id. * * @param int $id - * @return int|bool + * @return int|false */ public function getNextItemId($id) { - $position = $this->_findItemPositionByValue($id); - if ($position === false || $position == count($this->_items) - 1) { - return false; - } - - return $this->_items[$position + 1]; + return $this->getRelativeReviewId($id, 'gt', 'ASC'); } /** - * Get previous item id + * Get the previous review id. * * @param int $id - * @return int|bool + * @return int|false */ public function getPreviousItemId($id) { - $position = $this->_findItemPositionByValue($id); - if ($position === false || $position == 0) { - return false; - } - - return $this->_items[$position - 1]; + return $this->getRelativeReviewId($id, 'lt', 'DESC'); } /** - * Return item position based on passed in value + * Get the review id based on comparison and order. * - * @param mixed $value - * @return int|bool + * @param int $id + * @param string $operator + * @param string $order + * @return int|false */ - protected function _findItemPositionByValue($value) + private function getRelativeReviewId($id, $operator, $order) { - $this->_loadItems(); - return array_search($value, $this->_items); - } - - /** - * Get storage key - * - * @return string - * @throws \Magento\Framework\Exception\LocalizedException - */ - protected function _getStorageKey() - { - if (!$this->_storageId) { - throw new LocalizedException(__("The storage key wasn't set. Add the storage key and try again.")); - } - - return self::STORAGE_PREFIX . $this->_storageId; + $collection = $this->reviewCollectionFactory->create(); + $collection->addFieldToFilter('main_table.review_id', [$operator => $id]) + ->setOrder('main_table.review_id', $order) + ->setPageSize(1) + ->setCurPage(1); + + $item = $collection->getFirstItem(); + return $item->getId() ? (int)$item->getId() : false; } } diff --git a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php index 900cdc1f330d4..87912df2d0dba 100644 --- a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php +++ b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php @@ -401,30 +401,6 @@ public function getAllIds($limit = null, $offset = null) return $this->getConnection()->fetchCol($idsSelect); } - /** - * Get result sorted ids - * - * @return array - */ - public function getResultingIds() - { - $idsSelect = clone $this->getSelect(); - $data = $this->getConnection() - ->fetchAll( - $idsSelect - ->reset(Select::LIMIT_COUNT) - ->reset(Select::LIMIT_OFFSET) - ->columns('rt.review_id') - ); - - return array_map( - function ($value) { - return $value['review_id']; - }, - $data - ); - } - /** * Render SQL for retrieve product count * diff --git a/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php b/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php index 4529184fa0e4b..5a237427cdf90 100644 --- a/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php +++ b/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php @@ -7,93 +7,172 @@ namespace Magento\Review\Test\Unit\Helper\Action; -use Magento\Backend\Model\Session; use Magento\Framework\App\Helper\Context; +use Magento\Framework\DataObject; use Magento\Review\Helper\Action\Pager; +use Magento\Review\Model\ResourceModel\Review\Collection; +use Magento\Review\Model\ResourceModel\Review\CollectionFactory; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +/** + * Unit test for \Magento\Review\Helper\Action\Pager + */ class PagerTest extends TestCase { /** @var Pager */ - protected $_helper = null; + private $pager; + + /** @var CollectionFactory|MockObject */ + private $collectionFactory; + + /** @var Collection|MockObject */ + private $collection; /** - * Prepare helper object + * Set up test environment + * + * @return void */ protected function setUp(): void { - $sessionMock = $this->getMockBuilder( - Session::class - )->disableOriginalConstructor() - ->setMethods( - ['setData', 'getData'] - )->getMock(); - $sessionMock->expects( - $this->any() - )->method( - 'setData' - )->with( - 'search_result_idsreviews', - $this->anything() - ); - $sessionMock->expects( - $this->any() - )->method( - 'getData' - )->with( - 'search_result_idsreviews' - )->willReturn( - [3, 2, 6, 5] - ); - - $contextMock = $this->createPartialMock( - Context::class, - ['getModuleManager', 'getRequest'] - ); - $this->_helper = new Pager($contextMock, $sessionMock); - $this->_helper->setStorageId('reviews'); - } + $this->collection = $this->createMock(Collection::class); - /** - * Test storage set with proper parameters - */ - public function testStorageSet() - { - $result = $this->_helper->setItems([1]); - $this->assertEquals($result, $this->_helper); + $this->collectionFactory = $this->createMock(CollectionFactory::class); + $this->collectionFactory->expects($this->any()) + ->method('create') + ->willReturn($this->collection); + + $context = $this->createMock(Context::class); + + $this->pager = new Pager($context, $this->collectionFactory); } /** - * Test getNextItem + * Test getting next review ID + * + * @return void */ - public function testGetNextItem() + public function testGetNextItemId() { - $this->assertEquals(2, $this->_helper->getNextItemId(3)); + $item = new DataObject(['id' => 10]); + + $this->collection->expects($this->once()) + ->method('addFieldToFilter') + ->with('main_table.review_id', ['gt' => 5]) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setOrder') + ->with('main_table.review_id', 'ASC') + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setPageSize') + ->with(1) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setCurPage') + ->with(1) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('getFirstItem') + ->willReturn($item); + + $this->assertEquals(10, $this->pager->getNextItemId(5)); } /** - * Test getNextItem when item not found or no next item + * Test that getNextItemId returns false when no item exists + * + * @return void */ - public function testGetNextItemNotFound() + public function testGetNextItemIdReturnsFalse() { - $this->assertFalse($this->_helper->getNextItemId(30)); - $this->assertFalse($this->_helper->getNextItemId(5)); + $item = new DataObject([]); + + $this->collection->expects($this->once()) + ->method('addFieldToFilter') + ->with('main_table.review_id', ['gt' => 99]) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setOrder') + ->with('main_table.review_id', 'ASC') + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setPageSize') + ->with(1) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setCurPage') + ->with(1) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('getFirstItem') + ->willReturn($item); + + $this->assertFalse($this->pager->getNextItemId(99)); } /** - * Test getPreviousItemId + * Test getting previous review ID + * + * @return void */ - public function testGetPreviousItem() + public function testGetPreviousItemId() { - $this->assertEquals(2, $this->_helper->getPreviousItemId(6)); + $item = new DataObject(['id' => 4]); + + $this->collection->expects($this->once()) + ->method('addFieldToFilter') + ->with('main_table.review_id', ['lt' => 5]) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setOrder') + ->with('main_table.review_id', 'DESC') + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setPageSize') + ->with(1) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setCurPage') + ->with(1) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('getFirstItem') + ->willReturn($item); + + $this->assertEquals(4, $this->pager->getPreviousItemId(5)); } /** - * Test getPreviousItemId when item not found or no next item + * Test that getPreviousItemId returns false when no item exists + * + * @return void */ - public function testGetPreviousItemNotFound() + public function testGetPreviousItemIdReturnsFalse() { - $this->assertFalse($this->_helper->getPreviousItemId(30)); - $this->assertFalse($this->_helper->getPreviousItemId(3)); + $item = new DataObject([]); + + $this->collection->expects($this->once()) + ->method('addFieldToFilter') + ->with('main_table.review_id', ['lt' => 1]) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setOrder') + ->with('main_table.review_id', 'DESC') + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setPageSize') + ->with(1) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('setCurPage') + ->with(1) + ->willReturnSelf(); + $this->collection->expects($this->once()) + ->method('getFirstItem') + ->willReturn($item); + + $this->assertFalse($this->pager->getPreviousItemId(1)); } } From 4ab76c23d33103e399686b1bbe9643bf76f128ae Mon Sep 17 00:00:00 2001 From: Imran Date: Thu, 20 Nov 2025 18:58:09 +0530 Subject: [PATCH 02/12] Fixed failed static and integration tests --- .../Magento/Review/Helper/Action/Pager.php | 17 ++++++------- .../Review/Product/Collection.php | 25 +++++++++++++++++++ .../Test/Unit/Helper/Action/PagerTest.php | 8 +++--- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/app/code/Magento/Review/Helper/Action/Pager.php b/app/code/Magento/Review/Helper/Action/Pager.php index 84789463a1674..f77eeecc9f3f9 100644 --- a/app/code/Magento/Review/Helper/Action/Pager.php +++ b/app/code/Magento/Review/Helper/Action/Pager.php @@ -3,7 +3,6 @@ * Copyright 2013 Adobe * All Rights Reserved. */ - namespace Magento\Review\Helper\Action; use Magento\Framework\App\Helper\AbstractHelper; @@ -18,7 +17,7 @@ class Pager extends AbstractHelper { /** - * Review collection factory + * Review collection model factory * * @var CollectionFactory */ @@ -42,9 +41,9 @@ public function __construct( * Get the next review id. * * @param int $id - * @return int|false + * @return int|false */ - public function getNextItemId($id) + public function getNextItemId($id): int|false { return $this->getRelativeReviewId($id, 'gt', 'ASC'); } @@ -55,7 +54,7 @@ public function getNextItemId($id) * @param int $id * @return int|false */ - public function getPreviousItemId($id) + public function getPreviousItemId($id): int|false { return $this->getRelativeReviewId($id, 'lt', 'DESC'); } @@ -63,12 +62,12 @@ public function getPreviousItemId($id) /** * Get the review id based on comparison and order. * - * @param int $id - * @param string $operator - * @param string $order + * @param int $id + * @param string $operator + * @param string $order * @return int|false */ - private function getRelativeReviewId($id, $operator, $order) + private function getRelativeReviewId($id, $operator, $order): int|false { $collection = $this->reviewCollectionFactory->create(); $collection->addFieldToFilter('main_table.review_id', [$operator => $id]) diff --git a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php index 1c4d3a7a22ad3..83efd5ef26302 100644 --- a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php +++ b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php @@ -401,6 +401,31 @@ public function getAllIds($limit = null, $offset = null) return $this->getConnection()->fetchCol($idsSelect); } + /** + * Get result sorted ids + * + * @return array + * @deprecated This method is not being used to fetch ids anymore.We use it only to support backward compatibility + */ + public function getResultingIds() + { + $idsSelect = clone $this->getSelect(); + $data = $this->getConnection() + ->fetchAll( + $idsSelect + ->reset(Select::LIMIT_COUNT) + ->reset(Select::LIMIT_OFFSET) + ->columns('rt.review_id') + ); + + return array_map( + function ($value) { + return $value['review_id']; + }, + $data + ); + } + /** * Render SQL for retrieve product count * diff --git a/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php b/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php index 181491e8e2289..0eae1137a8a1f 100644 --- a/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php +++ b/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php @@ -53,7 +53,7 @@ protected function setUp(): void * * @return void */ - public function testGetNextItemId() + public function testGetNextItemId(): void { $item = new DataObject(['id' => 10]); @@ -85,7 +85,7 @@ public function testGetNextItemId() * * @return void */ - public function testGetNextItemIdReturnsFalse() + public function testGetNextItemIdReturnsFalse(): void { $item = new DataObject([]); @@ -117,7 +117,7 @@ public function testGetNextItemIdReturnsFalse() * * @return void */ - public function testGetPreviousItemId() + public function testGetPreviousItemId(): void { $item = new DataObject(['id' => 4]); @@ -149,7 +149,7 @@ public function testGetPreviousItemId() * * @return void */ - public function testGetPreviousItemIdReturnsFalse() + public function testGetPreviousItemIdReturnsFalse(): void { $item = new DataObject([]); From ed08e6279459be03820eba0ca5dfb766d18dac79 Mon Sep 17 00:00:00 2001 From: Imran Date: Fri, 21 Nov 2025 11:21:22 +0530 Subject: [PATCH 03/12] Fixed failed static test --- .../Review/Model/ResourceModel/Review/Product/Collection.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php index 83efd5ef26302..c35c58009fbaa 100644 --- a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php +++ b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php @@ -9,6 +9,7 @@ use Magento\Eav\Model\Entity\Attribute\AbstractAttribute; use Magento\Framework\DB\Select; use Magento\Framework\EntityManager\MetadataPool; +use Magento\Review\Helper\Action\Pager; /** * Review Product Collection @@ -406,6 +407,7 @@ public function getAllIds($limit = null, $offset = null) * * @return array * @deprecated This method is not being used to fetch ids anymore.We use it only to support backward compatibility + * @see Pager */ public function getResultingIds() { From 73e7edccde2c31517c2b5e1137155e2ef952245c Mon Sep 17 00:00:00 2001 From: Imran Date: Fri, 21 Nov 2025 12:28:36 +0530 Subject: [PATCH 04/12] Improved doc block --- app/code/Magento/Review/Block/Adminhtml/Grid.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Grid.php index 16edc77800610..781bc8e7f633d 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Review/Block/Adminhtml/Grid.php @@ -19,21 +19,21 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended { /** - * Review action pager + * Review action pager helper * * @var \Magento\Review\Helper\Action\Pager */ protected $_reviewActionPager = null; /** - * Review data + * Review helper data * * @var \Magento\Review\Helper\Data */ protected $_reviewData = null; /** - * Core registry + * Magento framework Core registry * * @var \Magento\Framework\Registry */ From 39502f5022b206bcdb2c0efc038dba62b708ca03 Mon Sep 17 00:00:00 2001 From: Imran Date: Mon, 24 Nov 2025 12:44:18 +0530 Subject: [PATCH 05/12] Added methods to support backward compatibility --- .../Magento/Review/Block/Adminhtml/Grid.php | 20 +-- .../Magento/Review/Helper/Action/Pager.php | 117 ++++++++++++++++-- 2 files changed, 118 insertions(+), 19 deletions(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Grid.php index 781bc8e7f633d..e6a67f66a2f08 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Review/Block/Adminhtml/Grid.php @@ -18,13 +18,6 @@ */ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended { - /** - * Review action pager helper - * - * @var \Magento\Review\Helper\Action\Pager - */ - protected $_reviewActionPager = null; - /** * Review helper data * @@ -59,7 +52,6 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended * @param \Magento\Review\Model\ReviewFactory $reviewFactory * @param \Magento\Review\Model\ResourceModel\Review\Product\CollectionFactory $productsFactory * @param \Magento\Review\Helper\Data $reviewData - * @param \Magento\Review\Helper\Action\Pager $reviewActionPager * @param \Magento\Framework\Registry $coreRegistry * @param array $data */ @@ -69,14 +61,12 @@ public function __construct( \Magento\Review\Model\ReviewFactory $reviewFactory, \Magento\Review\Model\ResourceModel\Review\Product\CollectionFactory $productsFactory, \Magento\Review\Helper\Data $reviewData, - \Magento\Review\Helper\Action\Pager $reviewActionPager, \Magento\Framework\Registry $coreRegistry, array $data = [] ) { $this->_productsFactory = $productsFactory; $this->_coreRegistry = $coreRegistry; $this->_reviewData = $reviewData; - $this->_reviewActionPager = $reviewActionPager; $this->_reviewFactory = $reviewFactory; parent::__construct($context, $backendHelper, $data); } @@ -93,6 +83,16 @@ protected function _construct() $this->setDefaultSort('created_at'); } + /** + * Executes after the collection is loaded. + * + * @return \Magento\Backend\Block\Widget\Grid + */ + protected function _afterLoadCollection() + { + return parent::_afterLoadCollection(); + } + /** * @inheritDoc */ diff --git a/app/code/Magento/Review/Helper/Action/Pager.php b/app/code/Magento/Review/Helper/Action/Pager.php index f77eeecc9f3f9..375b6201cfac5 100644 --- a/app/code/Magento/Review/Helper/Action/Pager.php +++ b/app/code/Magento/Review/Helper/Action/Pager.php @@ -3,9 +3,11 @@ * Copyright 2013 Adobe * All Rights Reserved. */ + namespace Magento\Review\Helper\Action; -use Magento\Framework\App\Helper\AbstractHelper; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Exception\LocalizedException; use Magento\Review\Model\ResourceModel\Review\CollectionFactory; /** @@ -14,27 +16,94 @@ * @api * @since 100.0.2 */ -class Pager extends AbstractHelper +class Pager extends \Magento\Framework\App\Helper\AbstractHelper { + const STORAGE_PREFIX = 'search_result_ids'; + /** - * Review collection model factory + * Storage id + * + * @var int + */ + protected $_storageId = null; + + /** + * Array of items + * + * @var array + */ + protected $_items = null; + + /** + * Backend session model * - * @var CollectionFactory + * @var \Magento\Backend\Model\Session */ - protected $reviewCollectionFactory; + protected $_backendSession; /** - * Pager constructor. + * Review collection model factory * + * @var CollectionFactory|null + */ + protected $reviewCollectionFactory = null; + + /** * @param \Magento\Framework\App\Helper\Context $context - * @param CollectionFactory $reviewCollectionFactory + * @param \Magento\Backend\Model\Session $backendSession */ public function __construct( \Magento\Framework\App\Helper\Context $context, - CollectionFactory $reviewCollectionFactory + \Magento\Backend\Model\Session $backendSession, + ?CollectionFactory $reviewCollectionFactory = null + ) { + $this->_backendSession = $backendSession; + $this->reviewCollectionFactory = $reviewCollectionFactory ?: ObjectManager::getInstance()->get(CollectionFactory::class); parent::__construct($context); - $this->reviewCollectionFactory = $reviewCollectionFactory; + } + + /** + * Set storage id + * + * @param int $storageId + * @return void + * @deprecated This method is no longer used for setting storage id.We use it only to support backward compatibility + * @see self::getRelativeReviewId() + */ + public function setStorageId($storageId) + { + $this->_storageId = $storageId; + } + + /** + * Set items to storage + * + * @param array $items + * @return $this + * @deprecated This method is no longer used for setting items in the session.We use it only to support backward compatibility + * @see self::getRelativeReviewId() + */ + public function setItems(array $items) + { + $this->_items = $items; + $this->_backendSession->setData($this->_getStorageKey(), $this->_items); + + return $this; + } + + /** + * Load stored items + * + * @return void + * @deprecated This method is not being used anymore to load the items.We use it only to support backward compatibility + * @see self::getRelativeReviewId() + */ + protected function _loadItems() + { + if ($this->_items === null) { + $this->_items = (array)$this->_backendSession->getData($this->_getStorageKey()); + } } /** @@ -59,6 +128,36 @@ public function getPreviousItemId($id): int|false return $this->getRelativeReviewId($id, 'lt', 'DESC'); } + /** + * Return item position based on passed in value + * + * @param mixed $value + * @return int|bool + * @deprecated This method is not being used anymore.We use it only to support backward compatibility + * @see self::getRelativeReviewId() + */ + protected function _findItemPositionByValue($value) + { + $this->_loadItems(); + return array_search($value, $this->_items); + } + + /** + * Get storage key + * + * @return string + * @throws \Magento\Framework\Exception\LocalizedException + * @deprecated This method is not being used anymore to get storage key.We use it only to support backward compatibility + */ + protected function _getStorageKey() + { + if (!$this->_storageId) { + throw new LocalizedException(__("The storage key wasn't set. Add the storage key and try again.")); + } + + return self::STORAGE_PREFIX . $this->_storageId; + } + /** * Get the review id based on comparison and order. * From 1e122b1ddfa2cd3823d891732c5437696ae20aa6 Mon Sep 17 00:00:00 2001 From: Imran Date: Mon, 24 Nov 2025 17:41:14 +0530 Subject: [PATCH 06/12] Fixedfailed static test --- app/code/Magento/Review/Helper/Action/Pager.php | 16 +++++++++------- .../Review/Test/Unit/Helper/Action/PagerTest.php | 3 ++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/Review/Helper/Action/Pager.php b/app/code/Magento/Review/Helper/Action/Pager.php index 375b6201cfac5..d19a9219410c3 100644 --- a/app/code/Magento/Review/Helper/Action/Pager.php +++ b/app/code/Magento/Review/Helper/Action/Pager.php @@ -15,13 +15,14 @@ * * @api * @since 100.0.2 + * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) */ class Pager extends \Magento\Framework\App\Helper\AbstractHelper { - const STORAGE_PREFIX = 'search_result_ids'; + protected const STORAGE_PREFIX = 'search_result_ids'; /** - * Storage id + * Key identifier for session storage id * * @var int */ @@ -51,12 +52,12 @@ class Pager extends \Magento\Framework\App\Helper\AbstractHelper /** * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\Backend\Model\Session $backendSession + * @param CollectionFactory|null $reviewCollectionFactory */ public function __construct( \Magento\Framework\App\Helper\Context $context, \Magento\Backend\Model\Session $backendSession, ?CollectionFactory $reviewCollectionFactory = null - ) { $this->_backendSession = $backendSession; $this->reviewCollectionFactory = $reviewCollectionFactory ?: ObjectManager::getInstance()->get(CollectionFactory::class); @@ -81,7 +82,7 @@ public function setStorageId($storageId) * * @param array $items * @return $this - * @deprecated This method is no longer used for setting items in the session.We use it only to support backward compatibility + * @deprecated This method is not being used.We use it only to support compatibility * @see self::getRelativeReviewId() */ public function setItems(array $items) @@ -96,7 +97,7 @@ public function setItems(array $items) * Load stored items * * @return void - * @deprecated This method is not being used anymore to load the items.We use it only to support backward compatibility + * @deprecated This method is not being used.We use it only to support compatibility * @see self::getRelativeReviewId() */ protected function _loadItems() @@ -133,7 +134,7 @@ public function getPreviousItemId($id): int|false * * @param mixed $value * @return int|bool - * @deprecated This method is not being used anymore.We use it only to support backward compatibility + * @deprecated This method is not being used.We use it only to support compatibility * @see self::getRelativeReviewId() */ protected function _findItemPositionByValue($value) @@ -147,7 +148,8 @@ protected function _findItemPositionByValue($value) * * @return string * @throws \Magento\Framework\Exception\LocalizedException - * @deprecated This method is not being used anymore to get storage key.We use it only to support backward compatibility + * @deprecated This method is not being used.We use it only to support compatibility + * @see self::getRelativeReviewId() */ protected function _getStorageKey() { diff --git a/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php b/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php index 0eae1137a8a1f..c73a2a07a8baa 100644 --- a/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php +++ b/app/code/Magento/Review/Test/Unit/Helper/Action/PagerTest.php @@ -44,8 +44,9 @@ protected function setUp(): void ->willReturn($this->collection); $context = $this->createMock(Context::class); + $backendSession = $this->createMock(\Magento\Backend\Model\Session::class); - $this->pager = new Pager($context, $this->collectionFactory); + $this->pager = new Pager($context, $backendSession, $this->collectionFactory); } /** From 922e107fd5e97a70d0c4892d74d3de8d303c150a Mon Sep 17 00:00:00 2001 From: Imran Date: Mon, 24 Nov 2025 18:46:24 +0530 Subject: [PATCH 07/12] Updated return type for methods --- app/code/Magento/Review/Block/Adminhtml/Edit.php | 1 + app/code/Magento/Review/Helper/Action/Pager.php | 12 ++++++------ .../ResourceModel/Review/Product/Collection.php | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Edit.php b/app/code/Magento/Review/Block/Adminhtml/Edit.php index 23e5d16bd2f74..ff8fea031e2b1 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Edit.php +++ b/app/code/Magento/Review/Block/Adminhtml/Edit.php @@ -84,6 +84,7 @@ protected function _construct() /** @var $actionPager \Magento\Review\Helper\Action\Pager */ $actionPager = $this->_reviewActionPager; + $actionPager->setStorageId('reviews'); $reviewId = $this->getRequest()->getParam('id'); $prevId = $actionPager->getPreviousItemId($reviewId); diff --git a/app/code/Magento/Review/Helper/Action/Pager.php b/app/code/Magento/Review/Helper/Action/Pager.php index d19a9219410c3..37c5b9978ff65 100644 --- a/app/code/Magento/Review/Helper/Action/Pager.php +++ b/app/code/Magento/Review/Helper/Action/Pager.php @@ -111,9 +111,9 @@ protected function _loadItems() * Get the next review id. * * @param int $id - * @return int|false + * @return int|bool */ - public function getNextItemId($id): int|false + public function getNextItemId($id): int|bool { return $this->getRelativeReviewId($id, 'gt', 'ASC'); } @@ -122,9 +122,9 @@ public function getNextItemId($id): int|false * Get the previous review id. * * @param int $id - * @return int|false + * @return int|bool */ - public function getPreviousItemId($id): int|false + public function getPreviousItemId($id): int|bool { return $this->getRelativeReviewId($id, 'lt', 'DESC'); } @@ -166,9 +166,9 @@ protected function _getStorageKey() * @param int $id * @param string $operator * @param string $order - * @return int|false + * @return int|bool */ - private function getRelativeReviewId($id, $operator, $order): int|false + private function getRelativeReviewId($id, $operator, $order): int|bool { $collection = $this->reviewCollectionFactory->create(); $collection->addFieldToFilter('main_table.review_id', [$operator => $id]) diff --git a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php index c35c58009fbaa..de31099326e14 100644 --- a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php +++ b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php @@ -407,7 +407,7 @@ public function getAllIds($limit = null, $offset = null) * * @return array * @deprecated This method is not being used to fetch ids anymore.We use it only to support backward compatibility - * @see Pager + * @see Pager::getRelativeReviewId() */ public function getResultingIds() { From 49b25bc660e0c9fddba2963ebb4321a54292e499 Mon Sep 17 00:00:00 2001 From: Imran Date: Tue, 25 Nov 2025 14:47:35 +0530 Subject: [PATCH 08/12] Fixed failed static test --- app/code/Magento/Review/Block/Adminhtml/Grid.php | 4 ++++ app/code/Magento/Review/Helper/Action/Pager.php | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Grid.php index e6a67f66a2f08..05e5f70f21dd9 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Review/Block/Adminhtml/Grid.php @@ -7,6 +7,8 @@ namespace Magento\Review\Block\Adminhtml; +use Magento\Review\Helper\Action\Pager; + /** * Adminhtml reviews grid * @@ -87,6 +89,8 @@ protected function _construct() * Executes after the collection is loaded. * * @return \Magento\Backend\Block\Widget\Grid + * @deprecated This method is no longer in used.We use it only to support compatibility + * @see Pager::getRelativeReviewId() */ protected function _afterLoadCollection() { diff --git a/app/code/Magento/Review/Helper/Action/Pager.php b/app/code/Magento/Review/Helper/Action/Pager.php index 37c5b9978ff65..c7c7125f66b17 100644 --- a/app/code/Magento/Review/Helper/Action/Pager.php +++ b/app/code/Magento/Review/Helper/Action/Pager.php @@ -60,7 +60,8 @@ public function __construct( ?CollectionFactory $reviewCollectionFactory = null ) { $this->_backendSession = $backendSession; - $this->reviewCollectionFactory = $reviewCollectionFactory ?: ObjectManager::getInstance()->get(CollectionFactory::class); + $this->reviewCollectionFactory = $reviewCollectionFactory + ?: ObjectManager::getInstance()->get(CollectionFactory::class); parent::__construct($context); } From e1220b33460eaed253f90331064dc82c80941fcf Mon Sep 17 00:00:00 2001 From: Imran Date: Tue, 25 Nov 2025 15:39:29 +0530 Subject: [PATCH 09/12] Removed extra space --- app/code/Magento/Review/Block/Adminhtml/Grid.php | 2 +- app/code/Magento/Review/Helper/Action/Pager.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Grid.php index 05e5f70f21dd9..c5d88847a2700 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Review/Block/Adminhtml/Grid.php @@ -86,7 +86,7 @@ protected function _construct() } /** - * Executes after the collection is loaded. + * Executes after the collection is loaded. This method is intentionally overridden to preserve compatibility * * @return \Magento\Backend\Block\Widget\Grid * @deprecated This method is no longer in used.We use it only to support compatibility diff --git a/app/code/Magento/Review/Helper/Action/Pager.php b/app/code/Magento/Review/Helper/Action/Pager.php index c7c7125f66b17..f3234dec6a946 100644 --- a/app/code/Magento/Review/Helper/Action/Pager.php +++ b/app/code/Magento/Review/Helper/Action/Pager.php @@ -60,7 +60,7 @@ public function __construct( ?CollectionFactory $reviewCollectionFactory = null ) { $this->_backendSession = $backendSession; - $this->reviewCollectionFactory = $reviewCollectionFactory + $this->reviewCollectionFactory = $reviewCollectionFactory ?: ObjectManager::getInstance()->get(CollectionFactory::class); parent::__construct($context); } From c9ef532778131f9377a02859cfb412cfa35d7ac2 Mon Sep 17 00:00:00 2001 From: Imran Date: Thu, 27 Nov 2025 17:11:20 +0530 Subject: [PATCH 10/12] Fixed failed static test --- app/code/Magento/Review/Block/Adminhtml/Grid.php | 14 ++++++++++++++ app/code/Magento/Review/Helper/Action/Pager.php | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Grid.php index c5d88847a2700..0b8fc5599bd3a 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Review/Block/Adminhtml/Grid.php @@ -20,6 +20,13 @@ */ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended { + /** + * Review action pager + * + * @var \Magento\Review\Helper\Action\Pager + */ + protected $_reviewActionPager = null; + /** * Review helper data * @@ -54,6 +61,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended * @param \Magento\Review\Model\ReviewFactory $reviewFactory * @param \Magento\Review\Model\ResourceModel\Review\Product\CollectionFactory $productsFactory * @param \Magento\Review\Helper\Data $reviewData + * @param \Magento\Review\Helper\Action\Pager $reviewActionPager * @param \Magento\Framework\Registry $coreRegistry * @param array $data */ @@ -63,12 +71,14 @@ public function __construct( \Magento\Review\Model\ReviewFactory $reviewFactory, \Magento\Review\Model\ResourceModel\Review\Product\CollectionFactory $productsFactory, \Magento\Review\Helper\Data $reviewData, + \Magento\Review\Helper\Action\Pager $reviewActionPager, \Magento\Framework\Registry $coreRegistry, array $data = [] ) { $this->_productsFactory = $productsFactory; $this->_coreRegistry = $coreRegistry; $this->_reviewData = $reviewData; + $this->_reviewActionPager = $reviewActionPager; $this->_reviewFactory = $reviewFactory; parent::__construct($context, $backendHelper, $data); } @@ -94,6 +104,10 @@ protected function _construct() */ protected function _afterLoadCollection() { + /** @var $actionPager \Magento\Review\Helper\Action\Pager */ + $actionPager = $this->_reviewActionPager; + $actionPager->setStorageId('reviews'); + return parent::_afterLoadCollection(); } diff --git a/app/code/Magento/Review/Helper/Action/Pager.php b/app/code/Magento/Review/Helper/Action/Pager.php index f3234dec6a946..eec1e5d368923 100644 --- a/app/code/Magento/Review/Helper/Action/Pager.php +++ b/app/code/Magento/Review/Helper/Action/Pager.php @@ -19,7 +19,7 @@ */ class Pager extends \Magento\Framework\App\Helper\AbstractHelper { - protected const STORAGE_PREFIX = 'search_result_ids'; + public const STORAGE_PREFIX = 'search_result_ids'; /** * Key identifier for session storage id From 831cdcc0d148c14f620c1b344d5c8a38b2a9985a Mon Sep 17 00:00:00 2001 From: Imran Date: Thu, 27 Nov 2025 17:12:22 +0530 Subject: [PATCH 11/12] Removed space --- app/code/Magento/Review/Block/Adminhtml/Grid.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Grid.php index 0b8fc5599bd3a..0170aff75c887 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Review/Block/Adminhtml/Grid.php @@ -104,7 +104,7 @@ protected function _construct() */ protected function _afterLoadCollection() { - /** @var $actionPager \Magento\Review\Helper\Action\Pager */ + /** @var $actionPager \Magento\Review\Helper\Action\Pager */ $actionPager = $this->_reviewActionPager; $actionPager->setStorageId('reviews'); From cc213302c4de3274f557f4cd5a213876e915a686 Mon Sep 17 00:00:00 2001 From: Imran Date: Fri, 28 Nov 2025 10:21:07 +0530 Subject: [PATCH 12/12] Fixed failed test --- app/code/Magento/Review/Block/Adminhtml/Grid.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Review/Block/Adminhtml/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Grid.php index 0170aff75c887..556c6f05b54e1 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Review/Block/Adminhtml/Grid.php @@ -21,7 +21,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended { /** - * Review action pager + * Magento Review action pager * * @var \Magento\Review\Helper\Action\Pager */