Skip to content

Commit c59a0cb

Browse files
ENGCOM-2965: 139: Show only active categories #164
- Merge Pull Request magento/graphql-ce#164 from comwrap/graphql-ce:139-show-only-active-categories - Merged commits: 1. ff64826 2. ea8ea88 3. 0d52d0d 4. ce63f2a 5. 05c40e8 6. b777343 7. e2c9ac0 8. dfcac0c 9. 8038f6e 10. cd8b01b 11. 1d622d4 12. 6ac61ae 13. 1495087 14. 258a2d1 15. 20306a4 16. 46ca622 17. 754e391
2 parents 1fd2493 + 754e391 commit c59a0cb

File tree

4 files changed

+120
-13
lines changed

4 files changed

+120
-13
lines changed

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,21 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId): \Iterato
101101

102102
$collection->addFieldToFilter('level', ['gt' => $level]);
103103
$collection->addFieldToFilter('level', ['lteq' => $level + $depth - self::DEPTH_OFFSET]);
104+
$collection->addIsActiveFilter();
104105
$collection->setOrder('level');
106+
$collection->setOrder(
107+
'position',
108+
$collection::SORT_ORDER_DESC
109+
);
105110
$collection->getSelect()->orWhere(
106-
$this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField() . ' = ?',
111+
$collection->getSelect()
112+
->getConnection()
113+
->quoteIdentifier(
114+
'e.' . $this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField()
115+
) . ' = ?',
107116
$rootCategoryId
108117
);
118+
109119
return $collection->getIterator();
110120
}
111121

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ class ExtractDataFromCategoryTree
2020
*/
2121
private $categoryHydrator;
2222

23+
/**
24+
* @var CategoryInterface;
25+
*/
26+
private $iteratingCategory;
27+
28+
/**
29+
* @var int
30+
*/
31+
private $startCategoryFetchLevel = 1;
32+
2333
/**
2434
* @param Hydrator $categoryHydrator
2535
*/
@@ -42,14 +52,63 @@ public function execute(\Iterator $iterator): array
4252
/** @var CategoryInterface $category */
4353
$category = $iterator->current();
4454
$iterator->next();
45-
$nextCategory = $iterator->current();
46-
$tree[$category->getId()] = $this->categoryHydrator->hydrateCategory($category);
47-
$tree[$category->getId()]['model'] = $category;
48-
if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) {
49-
$tree[$category->getId()]['children'] = $this->execute($iterator);
55+
56+
$pathElements = explode("/", $category->getPath());
57+
if (empty($tree)) {
58+
$this->startCategoryFetchLevel = count($pathElements) - 1;
5059
}
60+
61+
$this->iteratingCategory = $category;
62+
$currentLevelTree = $this->explodePathToArray($pathElements, $this->startCategoryFetchLevel);
63+
if (empty($tree)) {
64+
$tree = $currentLevelTree;
65+
}
66+
$tree = $this->mergeCategoriesTrees($currentLevelTree, $tree);
5167
}
5268

5369
return $tree;
5470
}
71+
72+
/**
73+
* Merge together complex categories trees
74+
*
75+
* @param array $tree1
76+
* @param array $tree2
77+
* @return array
78+
*/
79+
private function mergeCategoriesTrees(array &$tree1, array &$tree2): array
80+
{
81+
$mergedTree = $tree1;
82+
foreach ($tree2 as $currentKey => &$value) {
83+
if (is_array($value) && isset($mergedTree[$currentKey]) && is_array($mergedTree[$currentKey])) {
84+
$mergedTree[$currentKey] = $this->mergeCategoriesTrees($mergedTree[$currentKey], $value);
85+
} else {
86+
$mergedTree[$currentKey] = $value;
87+
}
88+
}
89+
return $mergedTree;
90+
}
91+
92+
/**
93+
* Recursive method to generate tree for one category path
94+
*
95+
* @param array $pathElements
96+
* @param int $index
97+
* @return array
98+
*/
99+
private function explodePathToArray(array $pathElements, int $index): array
100+
{
101+
$tree = [];
102+
$tree[$pathElements[$index]]['id'] = $pathElements[$index];
103+
if ($index === count($pathElements) - 1) {
104+
$tree[$pathElements[$index]] = $this->categoryHydrator->hydrateCategory($this->iteratingCategory);
105+
$tree[$pathElements[$index]]['model'] = $this->iteratingCategory;
106+
}
107+
$currentIndex = $index;
108+
$index++;
109+
if (isset($pathElements[$index])) {
110+
$tree[$pathElements[$currentIndex]]['children'] = $this->explodePathToArray($pathElements, $index);
111+
}
112+
return $tree;
113+
}
55114
}

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

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ public function testCategoriesTree()
8383
$responseDataObject = new DataObject($response);
8484
//Some sort of smoke testing
8585
self::assertEquals(
86-
'Ololo',
87-
$responseDataObject->getData('category/children/7/children/1/description')
86+
'Its a description of Test Category 1.2',
87+
$responseDataObject->getData('category/children/0/children/1/description')
8888
);
8989
self::assertEquals(
9090
'default-category',
@@ -99,16 +99,54 @@ public function testCategoriesTree()
9999
$responseDataObject->getData('category/children/0/default_sort_by')
100100
);
101101
self::assertCount(
102-
8,
102+
7,
103103
$responseDataObject->getData('category/children')
104104
);
105105
self::assertCount(
106106
2,
107-
$responseDataObject->getData('category/children/7/children')
107+
$responseDataObject->getData('category/children/0/children')
108108
);
109109
self::assertEquals(
110-
5,
111-
$responseDataObject->getData('category/children/7/children/1/children/0/id')
110+
13,
111+
$responseDataObject->getData('category/children/0/children/1/id')
112+
);
113+
}
114+
115+
/**
116+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
117+
* @magentoApiDataFixture Magento/Catalog/_files/categories.php
118+
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
119+
*/
120+
public function testGetCategoryById()
121+
{
122+
$rootCategoryId = 13;
123+
$query = <<<QUERY
124+
{
125+
category(id: {$rootCategoryId}) {
126+
id
127+
name
128+
}
129+
}
130+
QUERY;
131+
132+
// get customer ID token
133+
/** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */
134+
$customerTokenService = $this->objectManager->create(
135+
\Magento\Integration\Api\CustomerTokenServiceInterface::class
136+
);
137+
$customerToken = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password');
138+
139+
$headerMap = ['Authorization' => 'Bearer ' . $customerToken];
140+
$response = $this->graphQlQuery($query, [], '', $headerMap);
141+
$responseDataObject = new DataObject($response);
142+
//Some sort of smoke testing
143+
self::assertEquals(
144+
'Category 1.2',
145+
$responseDataObject->getData('category/name')
146+
);
147+
self::assertEquals(
148+
13,
149+
$responseDataObject->getData('category/id')
112150
);
113151
}
114152

dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@
178178
->setParentId(3)
179179
->setPath('1/2/3/13')
180180
->setLevel(3)
181-
->setDescription('Ololo')
181+
->setDescription('Its a description of Test Category 1.2')
182182
->setAvailableSortBy('name')
183183
->setDefaultSortBy('name')
184184
->setIsActive(true)

0 commit comments

Comments
 (0)