0

I have a top menu like Parent > Category > Subcategories.

I need to count the subcategories of category and if > 4, to show All categories as a link to the Category level. I have to mention that I am a newbie on Magento. Thanks for any help.

2
  • What will be the link for all categories? Commented Jun 21, 2018 at 9:36
  • It will be as the 5th subcategory and when I click on it, redirect to the up level category page.
    – OvidiuC
    Commented Jun 21, 2018 at 13:20

1 Answer 1

2

you have to create preference to override Topmenu Block file on custom modules like i have use Topmenu_module /Topmenu/etc/frontend/di.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<preference for="Magento\Theme\Block\Html\Topmenu" type=" <your_namespace>\Topmenu\Block\Html\Topmenu" />
</config>

\Topmenu\Block\Html\Topmenu.php

<?php
namespace <your_namespace>\Topmenu\Block\Html;

use Magento\Framework\Data\Tree\Node;
use Magento\Framework\Data\Tree\NodeFactory;
use Magento\Framework\Data\TreeFactory;
use Magento\Framework\DataObject\IdentityInterface;
use Magento\Framework\View\Element\Template;


class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{

protected function _getHtml(
    \Magento\Framework\Data\Tree\Node $menuTree,
    $childrenWrapClass,
    $limit,
    $colBrakes = []
) {
    $html = '';

    $children = $menuTree->getChildren();
    $parentLevel = $menuTree->getLevel();
    $childLevel = $parentLevel === null ? 0 : $parentLevel + 1;

    $counter = 1;
    $itemPosition = 1;
    $childrenCount = $children->count();

    $parentPositionClass = $menuTree->getPositionClass();
    $itemPositionClassPrefix = $parentPositionClass ? 
    $parentPositionClass . '-' : 'nav-';

    /** @var \Magento\Framework\Data\Tree\Node $child */
    foreach ($children as $child) {
        if ($childLevel === 0 && $child->getData('is_parent_active') === false) {
            continue;
        }
        $child->setLevel($childLevel);
        $child->setIsFirst($counter == 1);
        $child->setIsLast($counter == $childrenCount);
        $child->setPositionClass($itemPositionClassPrefix . $counter);

        $outermostClassCode = '';
        $outermostClass = $menuTree->getOutermostClass();

        if ($childLevel == 0 && $outermostClass) {
            $outermostClassCode = ' class="' . $outermostClass . '" ';
            $currentClass = $child->getClass();

            if (empty($currentClass)) {
                $child->setClass($outermostClass);
            } else {
                $child->setClass($currentClass . ' ' . $outermostClass);
            }
        }

        if (count($colBrakes) && $colBrakes[$counter]['colbrake']) {
            $html .= '</ul></li><li class="column"><ul>';
        }
        if (!( $childLevel == 1 && $counter >= 5 )) {

        $html .= '<li ' . $this->_getRenderedMenuItemAttributes($child) . '>';
        $html .= '<a href="' . $child->getUrl() . '" ' . $outermostClassCode . '><span>' . $this->escapeHtml(
            $child->getName()
        ) . '</span></a>' . $this->_addSubMenu(
            $child,
            $childLevel,
            $childrenWrapClass,
            $limit
        ) . '</li>';

        } else {

        $html .= '<li ' . $this->_getRenderedMenuItemAttributes($child) . '>';
        $html .= '<a href="' . $child->getParent()->getUrl() . '" ' . $parentPositionClass . '><span>show more</span></a>' . $this->_addSubMenu(
            $child,
            $childLevel,
            $childrenWrapClass,
            $limit
        ) . '</li>'; 
        break;  

        }
        $itemPosition++;
        $counter++;
    }

    if (count($colBrakes) && $limit) {
        $html = '<li class="column"><ul>' . $html . '</ul></li>';
    }

    return $html;
}
}    

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.