Magento 2 : Add “View All” Link after all sub categories
-
14-04-2021 - |
سؤال
How to display "View All" Link after all sub categories in Magento 2.
I used this blog. But, It's display main menu and sub menu. I want to add "View All" in all sub categories after 5 categories.
How to Add "View All" Link?
Any help would be appreciated.
Thanks.
المحلول
You can override block and apply this functionality using this below way :
Create di.xml for add preference :
app/code/RH/CustomLinkAdd/etc/frontend/di.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Theme\Block\Html\Topmenu" type="RH\CustomLinkAdd\Block\Html\Topmenu" />
</config>
Create Topmenu file on below path and paste below code :
app/code/RH/CustomLinkAdd/Block/Html/Topmenu.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace RH\CustomLinkAdd\Block\Html;
use Magento\Framework\Data\Tree\Node;
use Magento\Framework\Data\Tree\NodeFactory;
use Magento\Framework\Data\TreeFactory;
use Magento\Framework\View\Element\Template;
use Magento\Framework\Data\Tree\Node\Collection;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
/**
* Cache identities
*
* @var array
*/
protected $identities = [];
/**
* Top menu data tree
*
* @var Node
*/
protected $_menu;
/**
* @var NodeFactory
*/
private $nodeFactory;
/**
* @var TreeFactory
*/
private $treeFactory;
private $categoryFactory;
protected $isLastNode = "";
protected $indexCounter = 0;
/**
* @param Template\Context $context
* @param NodeFactory $nodeFactory
* @param TreeFactory $treeFactory
* @param array $data
*/
public function __construct(
Template\Context $context,
NodeFactory $nodeFactory,
TreeFactory $treeFactory,
\Magento\Catalog\Model\CategoryFactory $categoryFactory,
array $data = []
) {
parent::__construct($context, $nodeFactory, $treeFactory, $data);
$this->categoryFactory = $categoryFactory;
}
private function getChildLevel($parentLevel): int
{
return $parentLevel === null ? 0 : $parentLevel + 1;
}
private function removeChildrenWithoutActiveParent(Collection $children, int $childLevel): void
{
/** @var Node $child */
foreach ($children as $child) {
if ($childLevel === 0 && $child->getData('is_parent_active') === false) {
$children->delete($child);
}
}
}
private function setCurrentClass(Node $child, string $outermostClass): void
{
$currentClass = $child->getClass();
if (empty($currentClass)) {
$child->setClass($outermostClass);
} else {
$child->setClass($currentClass . ' ' . $outermostClass);
}
}
private function shouldAddNewColumn(array $colBrakes, int $counter): bool
{
return count($colBrakes) && $colBrakes[$counter]['colbrake'];
}
protected function _getRenderedMenuItemAttributes(Node $item)
{
$html = '';
foreach ($this->_getMenuItemAttributes($item) as $attributeName => $attributeValue) {
$html .= ' ' . $attributeName . '="' . str_replace('"', '\"', $attributeValue) . '"';
}
return $html;
}
/**
* Returns array of menu item's attributes
*
* @param Node $item
* @return array
*/
protected function _getMenuItemAttributes(Node $item)
{
return ['class' => implode(' ', $this->_getMenuItemClasses($item))];
}
/**
* Returns array of menu item's classes
*
* @param Node $item
* @return array
*/
protected function _getMenuItemClasses(Node $item)
{
$classes = [
'level' . $item->getLevel(),
$item->getPositionClass(),
];
if ($item->getIsCategory()) {
$classes[] = 'category-item';
$this->isLastNode = "";
}
if ($item->getIsFirst()) {
$classes[] = 'first';
$this->isLastNode = "";
}
if ($item->getIsActive()) {
$classes[] = 'active';
} elseif ($item->getHasActive()) {
$classes[] = 'has-active';
}
if ($item->getIsLast()) {
$classes[] = 'last';
$this->isLastNode = "last";
}
if ($item->getClass()) {
$classes[] = $item->getClass();
}
if ($item->hasChildren()) {
$classes[] = 'parent';
}
return $classes;
}
protected function _getHtml(
Node $menuTree,
$childrenWrapClass,
$limit,
array $colBrakes = []
) {
$html = '';
$children = $menuTree->getChildren();
$childLevel = $this->getChildLevel($menuTree->getLevel());
$this->removeChildrenWithoutActiveParent($children, $childLevel);
$counter = 1;
$childrenCount = $children->count();
$parentPositionClass = $menuTree->getPositionClass();
$itemPositionClassPrefix = $parentPositionClass ? $parentPositionClass . '-' : 'nav-';
/** @var Node $child */
foreach ($children as $child) {
$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 . '" ';
$this->setCurrentClass($child, $outermostClass);
}
if ($this->shouldAddNewColumn($colBrakes, $counter)) {
$html .= '</ul></li><li class="column"><ul>';
}
$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>';
$counter++;
}
if($childLevel > 0)
{
$positionArr = explode("-", $child->getPositionClass());
// Display after 5 subcategory
if(count($positionArr) > 5)
{
if(end($positionArr) > 3 && $this->isLastNode == "last")
{
$html .='<li class="level'. $childLevel .' view-all">';
$html .= '<a class="level'. $childLevel .'" href="'. $child->getParent()->getUrl() .'">';
$html .= 'View All';
$html .= '</a>';
$html .= '</li>';
}
}
}
if (is_array($colBrakes) && !empty($colBrakes) && $limit) {
$html = '<li class="column"><ul>' . $html . '</ul></li>';
}
return $html;
}
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
$html = '';
if (!$child->hasChildren()) {
return $html;
}
$colStops = [];
if ($childLevel == 0 && $limit) {
$colStops = $this->_columnBrake($child->getChildren(), $limit);
}
$html .= '<ul class="level' . $childLevel . ' ' . $childrenWrapClass . '">';
$html .= $this->_getHtml($child, $childrenWrapClass, $limit, $colStops);
$html .= '</ul>';
return $html;
}
}
Clean cache and check it.
لا تنتمي إلى magento.stackexchange