Skip to content

Commit b777343

Browse files
committed
Change a way how categori tree is fetched. Current problem that all childs are always coming to last parent. Rewritte way of tree generation
1 parent 05c40e8 commit b777343

File tree

1 file changed

+59
-5
lines changed

1 file changed

+59
-5
lines changed

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

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,18 @@
1515
*/
1616
class ExtractDataFromCategoryTree
1717
{
18+
const START_CATEGORY_FETCH_LEVEL = 1;
19+
1820
/**
1921
* @var Hydrator
2022
*/
2123
private $categoryHydrator;
2224

25+
/**
26+
* @var CategoryInterface;
27+
*/
28+
private $iteratingCategory;
29+
2330
/**
2431
* @param Hydrator $categoryHydrator
2532
*/
@@ -42,14 +49,61 @@ public function execute(\Iterator $iterator): array
4249
/** @var CategoryInterface $category */
4350
$category = $iterator->current();
4451
$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);
52+
53+
$pathElements = explode("/", $category->getPath());
54+
$this->iteratingCategory = $category;
55+
56+
$currentLevelTree = $this->generateLevelTree($pathElements, self::START_CATEGORY_FETCH_LEVEL);
57+
if (empty($tree)) {
58+
$tree = $currentLevelTree;
5059
}
60+
$tree = $this->mergeCategoriesTrees($currentLevelTree, $tree);
5161
}
5262

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

0 commit comments

Comments
 (0)