1

I have file.php

<?php
namespace Smartwave\Megamenu\Block;

class Topmenu extends \Magento\Framework\View\Element\Template{

protected $_categoryHelper;
protected $_categoryFlatConfig;
protected $_topMenu;
protected $_categoryFactory;
protected $_helper;
protected $_filterProvider;
protected $_blockFactory;
protected $_megamenuConfig;
protected $_storeManager;

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Helper\Category $categoryHelper,
    \Smartwave\Megamenu\Helper\Data $helper,
    \Magento\Catalog\Model\Indexer\Category\Flat\State $categoryFlatState,
    \Magento\Catalog\Model\CategoryFactory $categoryFactory,
    \Magento\Theme\Block\Html\Topmenu $topMenu,
    \Magento\Cms\Model\Template\FilterProvider $filterProvider,
    \Magento\Cms\Model\BlockFactory $blockFactory
) {

    $this->_categoryHelper = $categoryHelper;
    $this->_categoryFlatConfig = $categoryFlatState;
    $this->_categoryFactory = $categoryFactory;
    $this->_topMenu = $topMenu;
    $this->_helper = $helper;
    $this->_filterProvider = $filterProvider;
    $this->_blockFactory = $blockFactory;
    $this->_storeManager = $context->getStoreManager();
    
    parent::__construct($context);
}

public function getCategoryHelper()
{
    return $this->_categoryHelper;
}

public function getCategoryModel($id)
{
    $_category = $this->_categoryFactory->create();
    $_category->load($id);
    
    return $_category;
}

public function getHtml($outermostClass = '', $childrenWrapClass = '', $limit = 0)
{
    return $this->_topMenu->getHtml($outermostClass, $childrenWrapClass, $limit);
}

public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true)
{
    return $this->_categoryHelper->getStoreCategories($sorted , $asCollection, $toLoad);
}

public function getChildCategories($category)
{
    if ($this->_categoryFlatConfig->isFlatEnabled() && $category->getUseFlatResource()) {
        $subcategories = (array)$category->getChildrenNodes();
    } else {
        $subcategories = $category->getChildren();
    }
    
    return $subcategories;
}

public function getActiveChildCategories($category)
{
    $children = [];
    if ($this->_categoryFlatConfig->isFlatEnabled() && $category->getUseFlatResource()) {
        $subcategories = (array)$category->getChildrenNodes();
    } else {
        $subcategories = $category->getChildren();
    }
    foreach($subcategories as $category) {
        if (!$category->getIsActive()) {
            continue;
        }
        $children[] = $category;
    }
    return $children;
}

public function getBlockContent($content = '') {
    if(!$this->_filterProvider)
        return $content;
    return $this->_filterProvider->getBlockFilter()->filter(trim($content));
}

public function getCustomBlockHtml($type='after') {
    $html = '';
    
    $block_ids = $this->_megamenuConfig['custom_links']['staticblock_'.$type];
    
    if (!$block_ids) return '';
    
    $block_ids = preg_replace('/\s/', '', $block_ids);
    $ids = explode(',', $block_ids);
    $store_id = $this->_storeManager->getStore()->getId();
    
    foreach($ids as $block_id) {
        $block = $this->_blockFactory->create();
        $block->setStoreId($store_id)->load($block_id);
        
        if(!$block) continue;
        
        $block_content = $block->getContent();
        
        if(!$block_content) continue;
        
        $content = $this->_filterProvider->getBlockFilter()->setStoreId($store_id)->filter($block_content);
        if(substr($content, 0, 4) == '<ul>')
            $content = substr($content, 4);
        if(substr($content, strlen($content) - 5) == '</ul>')
            $content = substr($content, 0, -5);

        $html .= $content;
    }
   
    return $html;
}
public function getSubmenuItemsHtml($children, $level = 1, $max_level = 0, $column_width=12, $menu_type = 'fullwidth', $columns = null)
{
    $html = '';
    
    if(!$max_level || ($max_level && $max_level == 0) || ($max_level && $max_level > 0 && $max_level-1 >= $level)) {
        $column_class = "";
        if($level == 1 && $columns && ($menu_type == 'fullwidth' || $menu_type == 'staticwidth')) {
            $column_class = "col-md-".$column_width." ";
            $column_class .= "mega-columns columns".$columns;
        }
        $html = '<ul class="subchildmenu '.$column_class.'">';
        foreach($children as $child) {
            $cat_model = $this->getCategoryModel($child->getId());
            
            $sw_menu_hide_item = $cat_model->getData('sw_menu_hide_item');
            
            if (!$sw_menu_hide_item) {
                $sub_children = $this->getActiveChildCategories($child);
                
                $sw_menu_cat_label = $cat_model->getData('sw_menu_cat_label');
                $sw_menu_icon_img = $cat_model->getData('sw_menu_icon_img');
                $sw_menu_font_icon = $cat_model->getData('sw_menu_font_icon');

                $item_class = 'level'.$level.' ';
                if(count($sub_children) > 0)
                    $item_class .= 'parent ';
                $html .= '<li class="ui-menu-item '.$item_class.'">';
                if(count($sub_children) > 0) {
                    $html .= '<div class="open-children-toggle"></div>';
                }
                if($level == 1 && $sw_menu_icon_img) {
                    $html .= '<div class="menu-thumb-img"><a class="menu-thumb-link" href="'.$this->_categoryHelper->getCategoryUrl($child).'"><img src="' . $this->_helper->getBaseUrl().'catalog/category/' . $sw_menu_icon_img . '" alt="'.$child->getName().'"/></a></div>';
                }
                $html .= '<a href="'.$this->_categoryHelper->getCategoryUrl($child).'" title="'.$child->getName().'">';
                if ($level > 1 && $sw_menu_icon_img)
                    $html .= '<img class="menu-thumb-icon" src="' . $this->_helper->getBaseUrl().'catalog/category/' . $sw_menu_icon_img . '" alt="'.$child->getName().'"/>';
                elseif($sw_menu_font_icon)
                    $html .= '<em class="menu-thumb-icon '.$sw_menu_font_icon.'"></em>';
                $html .= '<span>'.$child->getName();
                if($sw_menu_cat_label)
                    $html .= '<span class="cat-label cat-label-'.$sw_menu_cat_label.'">'.$this->_megamenuConfig['cat_labels'][$sw_menu_cat_label].'</span>';
                $html .= '</span></a>';
                if(count($sub_children) > 0) {
                    $html .= $this->getSubmenuItemsHtml($sub_children, $level+1, $max_level, $column_width, $menu_type);
                }
                $html .= '</li>';
            }
        }
        $html .= '</ul>';
    }
    
    return $html;
}

public function getMegamenuHtml()
{
    $html = '';
    
    $categories = $this->getStoreCategories(true,false,true);
    
    $this->_megamenuConfig = $this->_helper->getConfig('sw_megamenu');
    
    $max_level = $this->_megamenuConfig['general']['max_level'];
    $html .= $this->getCustomBlockHtml('before');
    foreach($categories as $category) {
        if (!$category->getIsActive()) {
            continue;
        }
        
        $cat_model = $this->getCategoryModel($category->getId());
        
        $sw_menu_hide_item = $cat_model->getData('sw_menu_hide_item');
        
        if(!$sw_menu_hide_item) {
            $children = $this->getActiveChildCategories($category);
            $sw_menu_cat_label = $cat_model->getData('sw_menu_cat_label');
            $sw_menu_icon_img = $cat_model->getData('sw_menu_icon_img');
            $sw_menu_font_icon = $cat_model->getData('sw_menu_font_icon');
            $sw_menu_cat_columns = $cat_model->getData('sw_menu_cat_columns');
            $sw_menu_float_type = $cat_model->getData('sw_menu_float_type');
            
            if(!$sw_menu_cat_columns){
                $sw_menu_cat_columns = 4;
            }
            
            $menu_type = $cat_model->getData('sw_menu_type');
            if(!$menu_type)
                $menu_type = $this->_megamenuConfig['general']['menu_type'];
                
            $custom_style = '';
            if($menu_type=="staticwidth")
                $custom_style = ' style="width: 500px;"';

            $sw_menu_static_width = $cat_model->getData('sw_menu_static_width');
            if($menu_type=="staticwidth" && $sw_menu_static_width)
                $custom_style = ' style="width: '.$sw_menu_static_width.';"';
                
            $item_class = 'level0 ';
            $item_class .= $menu_type.' ';
            
            $menu_top_content = $cat_model->getData('sw_menu_block_top_content');
            $menu_left_content = $cat_model->getData('sw_menu_block_left_content');
            $menu_left_width = $cat_model->getData('sw_menu_block_left_width');
            if(!$menu_left_content || !$menu_left_width)
                $menu_left_width = 0;
            $menu_right_content = $cat_model->getData('sw_menu_block_right_content');
            $menu_right_width = $cat_model->getData('sw_menu_block_right_width');
            if(!$menu_right_content || !$menu_right_width)
                $menu_right_width = 0;
            $menu_bottom_content = $cat_model->getData('sw_menu_block_bottom_content');
            if($sw_menu_float_type)
                $sw_menu_float_type = 'fl-'.$sw_menu_float_type.' ';
            if(count($children) > 0 || (($menu_type=="fullwidth" || $menu_type=="staticwidth") && ($menu_top_content || $menu_left_content || $menu_right_content || $menu_bottom_content)))
                $item_class .= 'parent ';
            $html .= '<li class="ui-menu-item '.$item_class.$sw_menu_float_type.'">';
            if(count($children) > 0) {
                $html .= '<div class="open-children-toggle"></div>';
            }
            $html .= '<a href="'.$this->_categoryHelper->getCategoryUrl($category).'" class="level-top" title="'.$category->getName().'">';
            if ($sw_menu_icon_img)
                $html .= '<img class="menu-thumb-icon" src="' . $this->_helper->getBaseUrl().'catalog/category/' . $sw_menu_icon_img . '" alt="'.$category->getName().'"/>';
            elseif($sw_menu_font_icon)
                $html .= '<em class="menu-thumb-icon '.$sw_menu_font_icon.'"></em>';
            $html .= '<span>'.$category->getName().'</span>';
            if($sw_menu_cat_label)
                $html .= '<span class="cat-label cat-label-'.$sw_menu_cat_label.'">'.$this->_megamenuConfig['cat_labels'][$sw_menu_cat_label].'</span>';
            $html .= '</a>';
            if(count($children) > 0 || (($menu_type=="fullwidth" || $menu_type=="staticwidth") && ($menu_top_content || $menu_left_content || $menu_right_content || $menu_bottom_content))) {
                $html .= '<div class="level0 submenu"'.$custom_style.'>';
                if(($menu_type=="fullwidth" || $menu_type=="staticwidth")) {
                    $html .= '<div class="container">';
                }
                if(($menu_type=="fullwidth" || $menu_type=="staticwidth") && $menu_top_content) {
                    $html .= '<div class="menu-top-block">'.$this->getBlockContent($menu_top_content).'</div>';
                }
                if(count($children) > 0 || (($menu_type=="fullwidth" || $menu_type=="staticwidth") && ($menu_left_content || $menu_right_content))) {
                    $html .= '<div class="row">';
                    if(($menu_type=="fullwidth" || $menu_type=="staticwidth") && $menu_left_content && $menu_left_width > 0) {
                        $html .= '<div class="menu-left-block col-md-'.$menu_left_width.'">'.$this->getBlockContent($menu_left_content).'</div>';
                    }
                    $html .= $this->getSubmenuItemsHtml($children, 1, $max_level, 12-$menu_left_width-$menu_right_width, $menu_type, $sw_menu_cat_columns);
                    if(($menu_type=="fullwidth" || $menu_type=="staticwidth") && $menu_right_content && $menu_right_width > 0) {
                        $html .= '<div class="menu-right-block col-md-'.$menu_right_width.'">'.$this->getBlockContent($menu_right_content).'</div>';
                    }
                    $html .= '</div>';
                }
                if(($menu_type=="fullwidth" || $menu_type=="staticwidth") && $menu_bottom_content) {
                    $html .= '<div class="menu-bottom-block">'.$this->getBlockContent($menu_bottom_content).'</div>';
                }
                if(($menu_type=="fullwidth" || $menu_type=="staticwidth")) {
                    $html .= '</div>';
                }
                $html .= '</div>';
            }
            $html .= '</li>';
        }
    }
    $html .= $this->getCustomBlockHtml('after');
    
    return $html;
}
protected function _getMenuItemClasses(\Magento\Framework\Data\Tree\Node $item)
{
    $classes = [];

    $classes[] = 'level' . $item->getLevel();
    $classes[] = $item->getPositionClass();

    if ($item->getIsCategory()) {
        $classes[] = 'category-item';
    }

    if ($item->getIsFirst()) {
        $classes[] = 'first';
    }

    if ($item->getIsActive()) {
        $classes[] = 'active';
    } elseif ($item->getHasActive()) {
        $classes[] = 'has-active';
    }

    if ($item->getIsLast()) {
        $classes[] = 'last';
    }

    if ($item->getClass()) {
        $classes[] = $item->getClass();
    }

    if ($item->hasChildren()) {
        $classes[] = 'parent';
    }

    $classes[] = $this->_getClassNameFromCategoryName($item);

    return $classes;
}

protected function _getClassNameFromCategoryName($category)
{
    $name = $category->getName();
    $name = preg_replace('/-{2,}/', '-', preg_replace('/[^a-z-]/', '-', strtolower($name)));
    $name = trim($name, '-');
    return $name;
}
}

And file phtml

<?php

?>
<?php
/**
 * Top menu for store
*
 * @see \Smartwave\Megamenu\Block\Topmenu
 */
?>
<?php
$_helper = $this->helper('Smartwave\Megamenu\Helper\Data');
$_config = $_helper->getConfig('sw_megamenu');
$columnsLimit = 0;
$header_type = $_helper->getConfig('porto_settings/header/header_type');

if($_config['general']['enable']) {
?>
<?php $_menu = $block->getMegamenuHtml(); ?>

<nav class="navigation sw-megamenu <?php if($header_type == 8 || $header_type == 10): ?>side-megamenu<?php endif; ?>" role="navigation">
<ul>
    <?php echo $_menu; ?>
</ul>
</nav>

<script type="text/javascript">
require([
    'jquery',
    'Smartwave_Megamenu/js/sw_megamenu'
], function ($) {
    $(".sw-megamenu").swMegamenu();
});
</script>
<?php
} else {
?>
<?php $_menu = $block->getHtml('level-top', 'submenu', $columnsLimit); ?>

<nav class="navigation sw-megamenu" role="navigation">
<ul data-mage-init='{"menu":{"responsive":true, "expanded":true, "position":{"my":"left top","at":"left bottom"}}}'>
    <?php /* @escapeNotVerified */ echo $_menu; ?>
</ul>
 </nav>

<?php
}
?>

And file xml

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
    <referenceBlock name="catalog.topnav" remove="true"/>
    <referenceContainer name="page.top">
        <block class="Smartwave\Megamenu\Block\Topmenu" name="sw.topnav" template="Smartwave_Megamenu::topmenu.phtml" before="-"/>
    </referenceContainer>
    <referenceContainer name="after.body.start">
        <block class="Smartwave\Porto\Block\Template" name="category_list_on_left" template="Smartwave_Megamenu::onepagecategory/category_list.phtml" after="-"/>
    </referenceContainer>
</body>
</page>

But when i clicked menu i echo exit in function getMegamenuHtml() it received. But when echo exit _getMenuItemClasses not working. And not received class 'active'. Please help me!

0

Same question here for porto in order to add a class on the first level for the selected category.

If someone can help me ... thanks a lot

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.