Skip to content

Commit e269ed7

Browse files
committed
Merge remote-tracking branch 'magento-l3/ACP2E-2653' into Tier4-Kings-PR-03-19-2024
2 parents 9e90edc + 8a75b6d commit e269ed7

File tree

2 files changed

+125
-22
lines changed

2 files changed

+125
-22
lines changed

app/code/Magento/CatalogGraphQl/DataProvider/Product/LayeredNavigation/Builder/Aggregations/Category/IncludeDirectChildrenOnly.php

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
namespace Magento\CatalogGraphQl\DataProvider\Product\LayeredNavigation\Builder\Aggregations\Category;
99

1010
use Magento\Catalog\Api\CategoryListInterface;
11+
use Magento\Catalog\Model\Config\LayerCategoryConfig;
1112
use Magento\Framework\Api\SearchCriteriaBuilder;
13+
use Magento\Framework\App\ObjectManager;
1214
use Magento\Framework\ObjectManager\ResetAfterRequestInterface;
1315
use Magento\Framework\Search\Response\Aggregation;
1416
use Magento\Framework\Search\Response\AggregationFactory;
@@ -61,25 +63,34 @@ class IncludeDirectChildrenOnly implements ResetAfterRequestInterface
6163
*/
6264
private $searchCriteriaBuilder;
6365

66+
/**
67+
* @var LayerCategoryConfig|null
68+
*/
69+
private $layerCategoryConfig;
70+
6471
/**
6572
* @param AggregationFactory $aggregationFactory
6673
* @param BucketFactory $bucketFactory
6774
* @param StoreManagerInterface $storeManager
6875
* @param CategoryListInterface $categoryList
6976
* @param SearchCriteriaBuilder $searchCriteriaBuilder
77+
* @param LayerCategoryConfig|null $layerCategoryConfig
7078
*/
7179
public function __construct(
7280
AggregationFactory $aggregationFactory,
7381
BucketFactory $bucketFactory,
7482
StoreManagerInterface $storeManager,
7583
CategoryListInterface $categoryList,
76-
SearchCriteriaBuilder $searchCriteriaBuilder
84+
SearchCriteriaBuilder $searchCriteriaBuilder,
85+
?LayerCategoryConfig $layerCategoryConfig = null
7786
) {
7887
$this->aggregationFactory = $aggregationFactory;
7988
$this->bucketFactory = $bucketFactory;
8089
$this->storeManager = $storeManager;
8190
$this->categoryList = $categoryList;
8291
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
92+
$this->layerCategoryConfig = $layerCategoryConfig ?? ObjectManager::getInstance()
93+
->get(LayerCategoryConfig::class);
8394
}
8495

8596
/**
@@ -91,28 +102,34 @@ public function __construct(
91102
*/
92103
public function filter(AggregationInterface $aggregation, ?int $storeId): Aggregation
93104
{
94-
$categoryIdsRequested = $this->filter['category'] ?? null;
95-
if ($categoryIdsRequested === null) {
96-
return $aggregation;
97-
}
98-
$buckets = $aggregation->getBuckets();
99-
$categoryBucket = $buckets[self::CATEGORY_BUCKET] ?? null;
100-
if ($categoryBucket === null || empty($categoryBucket->getValues())) {
101-
return $aggregation;
105+
if (!$this->layerCategoryConfig->isCategoryFilterVisibleInLayerNavigation()) {
106+
$buckets = $aggregation->getBuckets();
107+
unset($buckets[self::CATEGORY_BUCKET]);
108+
} else {
109+
$categoryIdsRequested = $this->filter['category'] ?? null;
110+
if ($categoryIdsRequested === null) {
111+
return $aggregation;
112+
}
113+
$buckets = $aggregation->getBuckets();
114+
$categoryBucket = $buckets[self::CATEGORY_BUCKET] ?? null;
115+
if ($categoryBucket === null || empty($categoryBucket->getValues())) {
116+
return $aggregation;
117+
}
118+
$categoryIdsRequested = is_array($categoryIdsRequested) ? $categoryIdsRequested : [$categoryIdsRequested];
119+
$bucketValuesFiltered = $this->filterBucketValues(
120+
$categoryBucket->getValues(),
121+
$categoryIdsRequested,
122+
$storeId
123+
);
124+
$categoryBucketResolved = $this->bucketFactory->create(
125+
[
126+
'name' => self::CATEGORY_BUCKET,
127+
'values' => $bucketValuesFiltered
128+
]
129+
);
130+
$buckets[self::CATEGORY_BUCKET] = $categoryBucketResolved;
102131
}
103-
$categoryIdsRequested = is_array($categoryIdsRequested) ? $categoryIdsRequested : [$categoryIdsRequested];
104-
$bucketValuesFiltered = $this->filterBucketValues(
105-
$categoryBucket->getValues(),
106-
$categoryIdsRequested,
107-
$storeId
108-
);
109-
$categoryBucketResolved = $this->bucketFactory->create(
110-
[
111-
'name' => self::CATEGORY_BUCKET,
112-
'values' => $bucketValuesFiltered
113-
]
114-
);
115-
$buckets[self::CATEGORY_BUCKET] = $categoryBucketResolved;
132+
116133
return $this->aggregationFactory->create([self::BUCKETS_NAME => $buckets]);
117134
}
118135

dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductSearchCategoryAggregationsTest.php

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,92 @@ private function getGraphQlQuery(string $categoryList, string $includeDirectChil
225225
}
226226
}
227227
}
228+
QUERY;
229+
}
230+
231+
/**
232+
* Test the categories that appear in aggregation Layered Navigation > Display Category Filter => Yes (default).
233+
*
234+
* @magentoApiDataFixture Magento/Catalog/_files/categories.php
235+
* @throws \Exception
236+
*/
237+
public function testFetchCategoriesWhenDisplayCategoryEnabled(): void
238+
{
239+
$result = $this->aggregationWithDisplayCategorySetting();
240+
$aggregationAttributeCode = [];
241+
foreach ($result['products']['aggregations'] as $aggregation) {
242+
$this->assertArrayHasKey('attribute_code', $aggregation);
243+
$aggregationAttributeCode[] = $aggregation['attribute_code'];
244+
}
245+
$this->assertTrue(in_array('category_uid', $aggregationAttributeCode));
246+
}
247+
248+
/**
249+
* Test the categories not in aggregation when Layered Navigation > Display Category Filter => No.
250+
*
251+
* @magentoConfigFixture catalog/layered_navigation/display_category 0
252+
* @magentoApiDataFixture Magento/Catalog/_files/categories.php
253+
* @throws \Exception
254+
*/
255+
public function testDontFetchCategoriesWhenDisplayCategoryDisabled(): void
256+
{
257+
$result = $this->aggregationWithDisplayCategorySetting();
258+
$aggregationAttributeCode = [];
259+
foreach ($result['products']['aggregations'] as $aggregation) {
260+
$this->assertArrayHasKey('attribute_code', $aggregation);
261+
$aggregationAttributeCode[] = $aggregation['attribute_code'];
262+
}
263+
$this->assertFalse(in_array('category_uid', $aggregationAttributeCode));
264+
}
265+
266+
/**
267+
* @return array
268+
* @throws \Exception
269+
*/
270+
private function aggregationWithDisplayCategorySetting(): array
271+
{
272+
$query = $this->getGraphQlQueryProductSearch();
273+
$result = $this->graphQlQuery($query);
274+
275+
$this->assertArrayNotHasKey('errors', $result);
276+
$this->assertArrayHasKey('aggregations', $result['products']);
277+
return $result;
278+
}
279+
280+
/**
281+
* Get graphQl query.
282+
*
283+
* @return string
284+
*/
285+
private function getGraphQlQueryProductSearch(): string
286+
{
287+
return <<<QUERY
288+
{
289+
products(
290+
search: "simple"
291+
pageSize: 20
292+
currentPage: 1
293+
sort: { }
294+
) {
295+
items {
296+
sku
297+
canonical_url
298+
categories{
299+
name
300+
path
301+
}
302+
}
303+
aggregations (filter: {category: {includeDirectChildrenOnly: true}}) {
304+
attribute_code
305+
count
306+
label
307+
options {
308+
label
309+
value
310+
}
311+
}
312+
}
313+
}
228314
QUERY;
229315
}
230316
}

0 commit comments

Comments
 (0)