Skip to content

Commit 7580961

Browse files
author
Serhii Balko
committed
Merge remote-tracking branch 'origin/MC-41473' into 2.4-develop-pr55
2 parents d303d7c + 88b916c commit 7580961

File tree

4 files changed

+214
-1
lines changed

4 files changed

+214
-1
lines changed

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ public function execute(\Iterator $iterator): array
6767
$tree = $this->mergeCategoriesTrees($currentLevelTree, $tree);
6868
}
6969
}
70-
return $tree;
70+
71+
return $this->sortTree($tree);
7172
}
7273

7374
/**
@@ -141,4 +142,24 @@ private function explodePathToArray(array $pathElements, int $index): array
141142
}
142143
return $tree;
143144
}
145+
146+
/**
147+
* Recursive method to sort tree
148+
*
149+
* @param array $tree
150+
* @return array
151+
*/
152+
private function sortTree(array $tree): array
153+
{
154+
foreach ($tree as &$node) {
155+
if ($node['children']) {
156+
uasort($node['children'], function ($element1, $element2) {
157+
return $element1['position'] > $element2['position'];
158+
});
159+
$node['children'] = $this->sortTree($node['children']);
160+
}
161+
}
162+
163+
return $tree;
164+
}
144165
}

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,51 @@ public function testBreadCrumbsWithDisabledParentCategory()
689689
$this->assertEquals($expectedResponse, $response);
690690
}
691691

692+
/**
693+
* Test sorting of categories tree
694+
*
695+
* @magentoApiDataFixture Magento/Catalog/_files/categories_sorted.php
696+
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
697+
*/
698+
public function testCategoriesTreeSorting()
699+
{
700+
$rootCategoryId = 2;
701+
$query = <<<QUERY
702+
{
703+
category(id: {$rootCategoryId}) {
704+
children {
705+
name
706+
children {
707+
name
708+
}
709+
}
710+
}
711+
}
712+
QUERY;
713+
$response = $this->graphQlQuery($query);
714+
$responseDataObject = new DataObject($response);
715+
self::assertEquals(
716+
'Category 12',
717+
$responseDataObject->getData('category/children/0/name')
718+
);
719+
self::assertEquals(
720+
'Category 1',
721+
$responseDataObject->getData('category/children/1/name')
722+
);
723+
self::assertEquals(
724+
'Category 2',
725+
$responseDataObject->getData('category/children/2/name')
726+
);
727+
self::assertEquals(
728+
'Category 1.2',
729+
$responseDataObject->getData('category/children/1/children/0/name')
730+
);
731+
self::assertEquals(
732+
'Category 1.1',
733+
$responseDataObject->getData('category/children/1/children/1/name')
734+
);
735+
}
736+
692737
/**
693738
* @return array
694739
*/
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
use Magento\Catalog\Api\CategoryLinkManagementInterface;
8+
use Magento\Catalog\Api\CategoryLinkRepositoryInterface;
9+
use Magento\Catalog\Api\Data\CategoryInterfaceFactory;
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Catalog\Model\Product;
12+
use Magento\Eav\Model\Config;
13+
use Magento\Store\Api\WebsiteRepositoryInterface;
14+
use Magento\Store\Model\StoreManagerInterface;
15+
use Magento\TestFramework\Helper\Bootstrap;
16+
17+
$objectManager = Bootstrap::getObjectManager();
18+
19+
/** @var WebsiteRepositoryInterface $websiteRepository */
20+
$websiteRepository = $objectManager->get(WebsiteRepositoryInterface::class);
21+
$baseWebsite = $websiteRepository->get('base');
22+
$rootCategoryId = $baseWebsite->getDefaultStore()->getRootCategoryId();
23+
24+
/** @var StoreManagerInterface $storeManager */
25+
$storeManager = $objectManager->get(StoreManagerInterface::class);
26+
27+
$defaultAttributeSet = $objectManager->get(Config::class)->getEntityType(Product::ENTITY)->getDefaultAttributeSetId();
28+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
29+
$categoryFactory = $objectManager->get(CategoryInterfaceFactory::class);
30+
31+
$categoryLinkRepository = $objectManager->create(
32+
CategoryLinkRepositoryInterface::class,
33+
[
34+
'productRepository' => $productRepository,
35+
]
36+
);
37+
38+
/** @var Magento\Catalog\Api\CategoryLinkManagementInterface $categoryLinkManagement */
39+
$categoryLinkManagement = $objectManager->get(CategoryLinkManagementInterface::class);
40+
$reflectionClass = new \ReflectionClass(get_class($categoryLinkManagement));
41+
$properties = [
42+
'productRepository' => $productRepository,
43+
'categoryLinkRepository' => $categoryLinkRepository,
44+
];
45+
foreach ($properties as $key => $value) {
46+
if ($reflectionClass->hasProperty($key)) {
47+
$reflectionProperty = $reflectionClass->getProperty($key);
48+
$reflectionProperty->setAccessible(true);
49+
$reflectionProperty->setValue($categoryLinkManagement, $value);
50+
}
51+
}
52+
53+
/**
54+
* After installation system has two categories: root one with ID:1 and Default category with ID:2
55+
*/
56+
/** @var $category \Magento\Catalog\Model\Category */
57+
$category = $categoryFactory->create();
58+
$category->isObjectNew(true);
59+
$category->setId(3)
60+
->setName('Category 1')
61+
->setParentId(2)
62+
->setPath('1/2/3')
63+
->setLevel(2)
64+
->setAvailableSortBy('name')
65+
->setDefaultSortBy('name')
66+
->setIsActive(true)
67+
->setPosition(2)
68+
->save();
69+
70+
$category = $categoryFactory->create();
71+
$category->isObjectNew(true);
72+
$category->setId(4)
73+
->setName('Category 1.1')
74+
->setParentId(3)
75+
->setPath('1/2/3/4')
76+
->setLevel(3)
77+
->setAvailableSortBy('name')
78+
->setDefaultSortBy('name')
79+
->setIsActive(true)
80+
->setIsAnchor(true)
81+
->setPosition(2)
82+
->setDescription('Category 1.1 description.')
83+
->save();
84+
85+
$category = $categoryFactory->create();
86+
$category->isObjectNew(true);
87+
$category->setId(6)
88+
->setName('Category 2')
89+
->setParentId(2)
90+
->setPath('1/2/6')
91+
->setLevel(2)
92+
->setAvailableSortBy('name')
93+
->setDefaultSortBy('name')
94+
->setIsActive(true)
95+
->setPosition(3)
96+
->save();
97+
98+
$category = $categoryFactory->create();
99+
$category->isObjectNew(true);
100+
$category->setId(12)
101+
->setName('Category 12')
102+
->setParentId(2)
103+
->setPath('1/2/12')
104+
->setLevel(2)
105+
->setAvailableSortBy('name')
106+
->setDefaultSortBy('name')
107+
->setIsActive(true)
108+
->setPosition(1)
109+
->save();
110+
111+
$category = $categoryFactory->create();
112+
$category->isObjectNew(true);
113+
$category->setId(13)
114+
->setName('Category 1.2')
115+
->setParentId(3)
116+
->setPath('1/2/3/13')
117+
->setLevel(3)
118+
->setDescription('Its a description of Test Category 1.2')
119+
->setAvailableSortBy('name')
120+
->setDefaultSortBy('name')
121+
->setIsActive(true)
122+
->setIsAnchor(true)
123+
->setPosition(1)
124+
->save();
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
8+
/** @var \Magento\Framework\Registry $registry */
9+
$registry = $objectManager->get(\Magento\Framework\Registry::class);
10+
11+
$registry->unregister('isSecureArea');
12+
$registry->register('isSecureArea', true);
13+
14+
//Remove categories
15+
/** @var Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
16+
$collection = $objectManager->create(\Magento\Catalog\Model\ResourceModel\Category\Collection::class);
17+
foreach ($collection->addAttributeToFilter('level', ['in' => [2, 3, 4, 6, 12, 13]]) as $category) {
18+
/** @var \Magento\Catalog\Model\Category $category */
19+
$category->delete();
20+
}
21+
22+
$registry->unregister('isSecureArea');
23+
$registry->register('isSecureArea', false);

0 commit comments

Comments
 (0)