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.

  • What will be the link for all categories? – Sukumar Gorai Jun 21 '18 at 9:36
  • It will be as the 5th subcategory and when I click on it, redirect to the up level category page. – OvidiuC Jun 21 '18 at 13:20
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, privacy policy and cookie policy

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