Skip to content
This repository has been archived by the owner on Dec 19, 2019. It is now read-only.

139: Show only active categories #164

Merged
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,17 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId): \Iterato

$collection->addFieldToFilter('level', ['gt' => $level]);
$collection->addFieldToFilter('level', ['lteq' => $level + $depth - self::DEPTH_OFFSET]);
$collection->addIsActiveFilter();
$collection->setOrder('level');
$collection->getSelect()->orWhere(
$this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField() . ' = ?',
$collection->getSelect()
->getConnection()
->quoteIdentifier(
'e.' . $this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField()
) . ' = ?',
$rootCategoryId
);

return $collection->getIterator();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,18 @@
*/
class ExtractDataFromCategoryTree
{
const START_CATEGORY_FETCH_LEVEL = 1;

/**
* @var Hydrator
*/
private $categoryHydrator;

/**
* @var CategoryInterface;
*/
private $iteratingCategory;

/**
* @param Hydrator $categoryHydrator
*/
Expand All @@ -42,14 +49,61 @@ public function execute(\Iterator $iterator): array
/** @var CategoryInterface $category */
$category = $iterator->current();
$iterator->next();
$nextCategory = $iterator->current();
$tree[$category->getId()] = $this->categoryHydrator->hydrateCategory($category);
$tree[$category->getId()]['model'] = $category;
if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) {
$tree[$category->getId()]['children'] = $this->execute($iterator);

$pathElements = explode("/", $category->getPath());
$this->iteratingCategory = $category;

$currentLevelTree = $this->explodePathToArray($pathElements, self::START_CATEGORY_FETCH_LEVEL);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@paliarush @nuzil
This changes will be broke current logic

Query:

{
  category(id: 334) {
   id
    name
  }
}

The result before changes:

{
  "data": {
    "category": {
      "id": 334,
      "name": "Cat-1"
    }
  }
}

The result after changes:

{
  "data": {
    "category": {
      "id": 2,
      "name": null
    }
  }
}

The root category has always been loaded first.

Looks like we need to change

const START_CATEGORY_FETCH_LEVEL = 1;

on

const START_CATEGORY_FETCH_LEVEL = 2;

if (empty($tree)) {
$tree = $currentLevelTree;
}
$tree = $this->mergeCategoriesTrees($currentLevelTree, $tree);
}

return $tree;
}

/**
* Merge together complex categories trees
*
* @param array $tree1
* @param array $tree2
* @return array
*/
private function mergeCategoriesTrees(array &$tree1, array &$tree2): array
{
$mergedTree = $tree1;
foreach ($tree2 as $currentKey => &$value) {
if (is_array($value) && isset($mergedTree[$currentKey]) && is_array($mergedTree[$currentKey])) {
$mergedTree[$currentKey] = $this->mergeCategoriesTrees($mergedTree[$currentKey], $value);
} else {
$mergedTree[$currentKey] = $value;
}
}
return $mergedTree;
}

/**
* Recursive method to generate tree for one category path
*
* @param $pathElements
* @param $index
* @return array
*/
private function explodePathToArray($pathElements, $index): array
{

$tree = [];
$tree[$pathElements[$index]]['id'] = $pathElements[$index];
if ($index === count($pathElements) - 1) {
$tree[$pathElements[$index]] = $this->categoryHydrator->hydrateCategory($this->iteratingCategory);
$tree[$pathElements[$index]]['model'] = $this->iteratingCategory;
}
$currentIndex = $index;
$index++;
if (isset($pathElements[$index])) {
$tree[$pathElements[$currentIndex]]['children'] = $this->explodePathToArray($pathElements, $index);
}
return $tree;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ public function testCategoriesTree()
$responseDataObject = new DataObject($response);
//Some sort of smoke testing
self::assertEquals(
'Ololo',
$responseDataObject->getData('category/children/7/children/1/description')
'Its a description of Test Category 1.2',
$responseDataObject->getData('category/children/0/children/1/description')
);
self::assertEquals(
'default-category',
Expand All @@ -99,16 +99,16 @@ public function testCategoriesTree()
$responseDataObject->getData('category/children/0/default_sort_by')
);
self::assertCount(
8,
7,
$responseDataObject->getData('category/children')
);
self::assertCount(
2,
$responseDataObject->getData('category/children/7/children')
$responseDataObject->getData('category/children/0/children')
);
self::assertEquals(
5,
$responseDataObject->getData('category/children/7/children/1/children/0/id')
13,
$responseDataObject->getData('category/children/0/children/1/id')
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@
->setParentId(3)
->setPath('1/2/3/13')
->setLevel(3)
->setDescription('Ololo')
->setDescription('Its a description of Test Category 1.2')
->setAvailableSortBy('name')
->setDefaultSortBy('name')
->setIsActive(true)
Expand Down