0

I am trying to add all categories in Layered Navigation after clicking on one to the categories.

Now I can see all in the first page, after clicking I can't see any categories in Layered Navigation.

Please check here below the pic.

categories in Layered Navigation

No categories in Layered Navigation

1 Answer 1

0

You Need to Override Following Model Class :

Magento\CatalogSearch\Model\Layer\Filter\Category

Override by creating new Module and in di.xml file by following way :

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

This is my overrided Model :

<?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();
    }
    }
1
  • Dear Divyesh, thank you for your super fast response. Can you please tell me how can I do this in steps? You said: "Override by creating new Module and in di.xml file by following way" Where can I find it? here: Magento\CatalogSearch\Model\Layer\Filter\Category ?If yes, I don't have this path. I am using Magento 2.2.3 with Porto 3.0.4. Thank you in advance
    – Greay
    Commented May 6, 2018 at 17:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.