Skip to content

Commit 0b893ee

Browse files
ENGCOM-8501: Fix issue #30270 Product Reviews can not be sorted by Admin on the Product edit page #30477
- Merge Pull Request #30477 from Chandresh22/magento2:2.4-develop - Merged commits: 1. 4c5a130 2. 4e80ef9 3. c1eb748 4. 1c6672e 5. 9bd848a 6. f18ab23 7. da7bb72 8. 379027f 9. be1d79a 10. 3eb3553 11. 9985552
2 parents 21ce3d7 + 9985552 commit 0b893ee

File tree

2 files changed

+173
-17
lines changed

2 files changed

+173
-17
lines changed

app/code/Magento/Review/Ui/DataProvider/Product/ReviewDataProvider.php

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
*/
66
namespace Magento\Review\Ui\DataProvider\Product;
77

8+
use Magento\Framework\Api\Filter;
89
use Magento\Framework\App\RequestInterface;
9-
use Magento\Ui\DataProvider\AbstractDataProvider;
10-
use Magento\Review\Model\ResourceModel\Review\Product\CollectionFactory;
1110
use Magento\Review\Model\ResourceModel\Review\Product\Collection;
12-
use Magento\Review\Model\Review;
11+
use Magento\Review\Model\ResourceModel\Review\Product\CollectionFactory;
12+
use Magento\Ui\DataProvider\AbstractDataProvider;
1313

1414
/**
15-
* Class ReviewDataProvider
15+
* DataProvider for product reviews
1616
*
1717
* @api
1818
*
@@ -58,7 +58,7 @@ public function __construct(
5858
}
5959

6060
/**
61-
* {@inheritdoc}
61+
* @inheritdoc
6262
* @since 100.1.0
6363
*/
6464
public function getData()
@@ -79,24 +79,42 @@ public function getData()
7979
}
8080

8181
/**
82-
* {@inheritdoc}
83-
* @since 100.1.0
82+
* Returns prepared field name
83+
*
84+
* @param string $name
85+
* @return string
8486
*/
85-
public function addFilter(\Magento\Framework\Api\Filter $filter)
87+
private function getPreparedField(string $name): string
8688
{
87-
$field = $filter->getField();
89+
$preparedName = '';
8890

89-
if (in_array($field, ['review_id', 'created_at', 'status_id'])) {
90-
$filter->setField('rt.' . $field);
91+
if (in_array($name, ['review_id', 'created_at', 'status_id'])) {
92+
$preparedName = 'rt.' . $name;
93+
} elseif (in_array($name, ['title', 'nickname', 'detail'])) {
94+
$preparedName = 'rdt.' . $name;
95+
} elseif ($name === 'review_created_at') {
96+
$preparedName = 'rt.created_at';
9197
}
9298

93-
if (in_array($field, ['title', 'nickname', 'detail'])) {
94-
$filter->setField('rdt.' . $field);
95-
}
99+
return $preparedName ?: $name;
100+
}
96101

97-
if ($field === 'review_created_at') {
98-
$filter->setField('rt.created_at');
99-
}
102+
/**
103+
* @inheritDoc
104+
*/
105+
public function addOrder($field, $direction)
106+
{
107+
$this->getCollection()->setOrder($this->getPreparedField($field), $direction);
108+
}
109+
110+
/**
111+
* @inheritdoc
112+
* @since 100.1.0
113+
*/
114+
public function addFilter(Filter $filter)
115+
{
116+
$field = $filter->getField();
117+
$filter->setField($this->getPreparedField($field));
100118

101119
parent::addFilter($filter);
102120
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\Review\Ui\DataProvider\Product;
10+
11+
use Magento\Framework\App\RequestInterface;
12+
use Magento\Framework\ObjectManagerInterface;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
use PHPUnit\Framework\TestCase;
15+
use Magento\Framework\Api\Filter;
16+
17+
/**
18+
* Test for \Magento\Review\Ui\DataProvider\Product\ReviewDataProvider.
19+
*/
20+
class ReviewDataProviderTest extends TestCase
21+
{
22+
/**
23+
* @var array
24+
*/
25+
private $modelParams = [
26+
'name' => 'review_listing_data_source',
27+
'primaryFieldName' => 'review_id',
28+
'requestFieldName' => 'entity_id',
29+
];
30+
31+
/**
32+
* @var ObjectManagerInterface
33+
*/
34+
private $objectManager;
35+
36+
/**
37+
* @inheritDoc
38+
*/
39+
protected function setUp(): void
40+
{
41+
$this->objectManager = Bootstrap::getObjectManager();
42+
}
43+
44+
/**
45+
* Sorting dataProvider test
46+
*
47+
* @magentoDataFixture Magento/Review/_files/different_reviews.php
48+
* @dataProvider sortingDataProvider
49+
*
50+
* @param string $field
51+
* @param string $direction
52+
* @param array $expectedSortedTitles
53+
* @return void
54+
*/
55+
public function testSorting(string $field, string $direction, array $expectedSortedTitles): void
56+
{
57+
$request = $this->objectManager->create(RequestInterface::class);
58+
$request->setParam('current_product_id', 1);
59+
60+
$dataProvider = $this->objectManager->create(
61+
ReviewDataProvider::class,
62+
array_merge($this->modelParams, ['request' => $request])
63+
);
64+
$dataProvider->addOrder($field, $direction);
65+
$result = $dataProvider->getData();
66+
67+
$this->assertEquals($this->getItemsField($result, 'title'), $expectedSortedTitles);
68+
}
69+
70+
/**
71+
* Return items field data
72+
*
73+
* @param array $arrItems
74+
* @param string $field
75+
* @return array
76+
*/
77+
private function getItemsField(array $arrItems, string $field): array
78+
{
79+
$data = [];
80+
foreach ($arrItems['items'] as $review) {
81+
$data[] = $review[$field];
82+
}
83+
84+
return $data;
85+
}
86+
87+
/**
88+
* DataProvider for testSorting
89+
*
90+
* @return array
91+
*/
92+
public function sortingDataProvider(): array
93+
{
94+
return [
95+
'sort by title field ascending' => [
96+
'title',
97+
'asc',
98+
['1 filter second review', '2 filter first review', 'Review Summary'],
99+
],
100+
'sort by title field descending' => [
101+
'title',
102+
'desc',
103+
['Review Summary', '2 filter first review', '1 filter second review'],
104+
],
105+
];
106+
}
107+
108+
/**
109+
* Filter dataProvider test
110+
*
111+
* @magentoDataFixture Magento/Review/_files/different_reviews.php
112+
*
113+
* @return void
114+
*/
115+
public function testFilter(): void
116+
{
117+
$searchTitle = '2 filter first review';
118+
119+
$request = $this->objectManager->create(RequestInterface::class);
120+
$request->setParam('current_product_id', 1);
121+
122+
/** @var ReviewDataProvider $dataProvider */
123+
$dataProvider = $this->objectManager->create(
124+
ReviewDataProvider::class,
125+
array_merge($this->modelParams, ['request' => $request])
126+
);
127+
128+
/** @var Filter $filter */
129+
$filter = $this->objectManager->create(Filter::class);
130+
$filter->setField('title')
131+
->setValue($searchTitle);
132+
133+
$dataProvider->addFilter($filter);
134+
$result = $dataProvider->getData();
135+
136+
$this->assertEquals($this->getItemsField($result, 'title'), [$searchTitle]);
137+
}
138+
}

0 commit comments

Comments
 (0)