Magento 2: Как отобразить все активные категории в многоуровневой навигации с ее подкатегориями?


Это список категорий в admin:

Admin Categories List

Категории, отображаемые в многоуровневой навигации на странице категорий Запчасти для магазинов:

Categories in Layered Navigation

Теперь вы можете видеть, что отображаются только первые дочерние категории категории запчастей для магазинов, и я хочу показать их, а также все дочерние категории этих категорий.

Как я могу реализовать эту функциональность?

Author: Rafael Corrêa Gomes, 2017-05-24

1 answers

Необходимо переопределить следующую модель:

Magento\CatalogSearch\Model\Layer\Filter\Category

Переопределите, создав новый модуль и в di.xml файл следующим образом:

<preference for="Magento\CatalogSearch\Model\Layer\Filter\Category" type="Vendor\Module\Model\Layer\Filter\Category" />

Ниже приведена моя переопределенная модель:

ПРИМЕЧАНИЕ: Следующий код предназначен для 6-уровневых категорий, если у вас меньше или больше категорий уровней, то используйте цикл foreach в качестве требования (я упоминаю уровень в каждом цикле for)

<?php

 namespace Vendor\Module\Model\Layer\Filter;

  use Magento\Catalog\Model\Layer\Filter\AbstractFilter;
  use Magento\Catalog\Model\Layer\Filter\DataProvider\Category as     CategoryDataProvider;

 class Category extends AbstractFilter
 {
/**
 * @var \Magento\Framework\Escaper
 */
private $escaper;

/**
 * @var CategoryDataProvider
 */
private $dataProvider;
protected $_logger;
/**
 * @param \Magento\Catalog\Model\Layer\Filter\ItemFactory $filterItemFactory
 * @param \Magento\Store\Model\StoreManagerInterface $storeManager
 * @param \Magento\Catalog\Model\Layer $layer
 * @param \Magento\Catalog\Model\Layer\Filter\Item\DataBuilder $itemDataBuilder
 * @param \Magento\Catalog\Model\CategoryFactory $categoryFactory
 * @param \Magento\Framework\Escaper $escaper
 * @param CategoryManagerFactory $categoryManager
 * @param array $data
 */
public function __construct(   
    \Magento\Catalog\Model\Layer\Filter\ItemFactory $filterItemFactory,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Catalog\Model\Layer $layer,
    \Magento\Catalog\Model\Layer\Filter\Item\DataBuilder $itemDataBuilder,
    \Magento\Framework\Escaper $escaper,
    \Magento\Catalog\Model\Layer\Filter\DataProvider\CategoryFactory $categoryDataProviderFactory,
    \Psr\Log\LoggerInterface $logger, //log injection

    array $data = []
) {
    parent::__construct(
        $filterItemFactory,
        $storeManager,
        $layer,
        $itemDataBuilder,
        $data
    );
    $this->escaper = $escaper;
    $this->_requestVar = 'cat';
    $this->dataProvider = $categoryDataProviderFactory->create(['layer' => $this->getLayer()]);
    $this->_logger = $logger;
}

/**
 * Apply category filter to product collection
 *
 * @param   \Magento\Framework\App\RequestInterface $request
 * @return  $this
 */
public function apply(\Magento\Framework\App\RequestInterface $request)
{
    $categoryId = $request->getParam($this->_requestVar) ?: $request->getParam('id');
    if (empty($categoryId)) {
        return $this;
    }

    $this->dataProvider->setCategoryId($categoryId);

    $category = $this->dataProvider->getCategory();

    $this->getLayer()->getProductCollection()->addCategoryFilter($category);

    if ($request->getParam('id') != $category->getId() && $this->dataProvider->isValid()) {
        $this->getLayer()->getState()->addFilter($this->_createItem($category->getName(), $categoryId));
    }
    return $this;
}

/**
 * Get filter value for reset current filter state
 *
 * @return mixed|null
 */
public function getResetValue()
{
    return $this->dataProvider->getResetValue();
}

/**
 * Get filter name
 *
 * @return \Magento\Framework\Phrase
 */
public function getName()
{
    return __('Category');
}

/**
 * Get data array for building category filter items
 *
 * @return array
 */
protected function _getItemsData()
{
    $_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $productCollection = $this->getLayer()->getProductCollection();

    $category = $this->dataProvider->getCategory();

    $optionsFacetedData = $productCollection->getFacetedData('category');
    $categories = $category->getChildrenCategories();
    $collectionSize = $productCollection->getSize();

    if ($category->getIsActive()) {
        foreach ($categories as $category) {
            if ($category->getIsActive()
                && isset($optionsFacetedData[$category->getId()])
                && $this->isOptionReducesResults($optionsFacetedData[$category->getId()]['count'], $collectionSize)
            ) {
                $this->itemDataBuilder->addItemData(
                    $this->escaper->escapeHtml($category->getName().'%level-1%'.$category->getParentId()),
                    $category->getId(),
                    $optionsFacetedData[$category->getId()]['count']
                );
            }
                $cat = $_objectManager->create('Magento\Catalog\Model\Category')->load($category->getId());
                $sub_category = $cat->getChildrenCategories();

                foreach ($sub_category as $category) {
                    if ($category->getIsActive()
                            && isset($optionsFacetedData[$category->getId()])
                            && $this->isOptionReducesResults($optionsFacetedData[$category->getId()]['count'], $collectionSize)
                        ) 
                    {
                        $this->itemDataBuilder->addItemData(
                            $this->escaper->escapeHtml($category->getName().'%level-2%'.$category->getParentId()),
                            $category->getId(),
                            $optionsFacetedData[$category->getId()]['count']
                        );
                    }
                    $cat = $_objectManager->create('Magento\Catalog\Model\Category')->load($category->getId());
                    $sub_category = $cat->getChildrenCategories();

                    foreach ($sub_category as $category) {
                        if ($category->getIsActive()
                                && isset($optionsFacetedData[$category->getId()])
                                && $this->isOptionReducesResults($optionsFacetedData[$category->getId()]['count'], $collectionSize)
                            ) 
                        {
                            $this->itemDataBuilder->addItemData(
                                $this->escaper->escapeHtml($category->getName().'%level-3%'.$category->getParentId()),
                                $category->getId(),
                                $optionsFacetedData[$category->getId()]['count']
                            );
                        }

                        $cat = $_objectManager->create('Magento\Catalog\Model\Category')->load($category->getId());
                        $sub_category = $cat->getChildrenCategories();

                        foreach ($sub_category as $category) {
                            if ($category->getIsActive()
                                    && isset($optionsFacetedData[$category->getId()])
                                    && $this->isOptionReducesResults($optionsFacetedData[$category->getId()]['count'], $collectionSize)
                                ) 
                            {
                                $this->itemDataBuilder->addItemData(
                                    $this->escaper->escapeHtml($category->getName().'%level-4%'.$category->getParentId()),
                                    $category->getId(),
                                    $optionsFacetedData[$category->getId()]['count']
                                );
                            }

                            $cat = $_objectManager->create('Magento\Catalog\Model\Category')->load($category->getId());
                            $sub_category = $cat->getChildrenCategories();

                            foreach ($sub_category as $category) {
                                if ($category->getIsActive()
                                        && isset($optionsFacetedData[$category->getId()])
                                        && $this->isOptionReducesResults($optionsFacetedData[$category->getId()]['count'], $collectionSize)
                                    ) 
                                {
                                    $this->itemDataBuilder->addItemData(
                                        $this->escaper->escapeHtml($category->getName().'%level-5%'.$category->getParentId()),
                                        $category->getId(),
                                        $optionsFacetedData[$category->getId()]['count']
                                    );
                                }

                                        $cat = $_objectManager->create('Magento\Catalog\Model\Category')->load($category->getId());
                                        $sub_category = $cat->getChildrenCategories();

                                        foreach ($sub_category as $category) {
                                            if ($category->getIsActive()
                                                    && isset($optionsFacetedData[$category->getId()])
                                                    && $this->isOptionReducesResults($optionsFacetedData[$category->getId()]['count'], $collectionSize)
                                                ) 
                                            {
                                                $this->itemDataBuilder->addItemData(
                                                    $this->escaper->escapeHtml($category->getName().'%level-6%'.$category->getParentId()),
                                                    $category->getId(),
                                                    $optionsFacetedData[$category->getId()]['count']
                                                );
                                            }
                                        }
                            }
                        }
                    }
                }
        }
    }
    return $this->itemDataBuilder->build();
}
}
 6
Author: Nitesh, 2017-10-29 12:58:48