我想在顶部菜单中显示子类别的图像。我使用了它,但没有显示它的子类别图像。
app/code/Vendor/NavigationMenu
中创建一个文件夹,其中“供应商”是您模块的命名空间。app / code / Vendor / NavigationMenu / etc / module.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Vendor_NavigationMenu" setup_version="0.0.1"/></config>
现在注册模块:
<?php
/**
* Registration file
*
* @category Vendor
* @package Vendor\NavigationMenu
* @author Your Name <your@name.com>
* @copyright 2017 Vendor
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Vendor_NavigationMenu',
__DIR__
);
Magento\Theme\Block\Html\TopMenu
。
创建di.xml
来声明对调用_getHtml()
方法的类的重写:app / code / Vendor / NavigationMenu / etc / di.xml:
<?xml version="1.0"?>
<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="Vendor\NavigationMenu\Rewrite\Block\Html\Topmenu" />
</config>
现在,您可以创建将重写该方法的类。现在要注意以下几点:
我们将向该类添加一个自定义事件和一个观察者。这样,我们可以轻松地将所需的任何东西插入菜单。
实际的图像添加将在观察者中完成。
由于_getHtml()
Magento本机功能不符合某些编码标准,因此我们不得不添加一些警告抑制措施
应用程序/代码/供应商/ NavigationMenu /重写/块/HTML/Topmenu.php:
<?php
/**
* Vendor Project
* Module Vendor/NavigationMenu
*
* @category Vendor
* @package Vendor\NavigationMenu
* @author Your Name <your.name@email.com>
* @copyright 2017 Vendor
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
namespace Vendor\NavigationMenu\Rewrite\Block\Html;
use Magento\Framework\Data\Tree\Node;
use Magento\Framework\DataObject;
use Magento\Framework\View\Element\Template;
/**
* Plugin NavigationMenu
*
* @author Your Name <your.name@email.com>
* @copyright 2017 Vendor
*/
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
/**
* Recursively generates top menu html from data that is specified in $menuTree
*
* @param Node $menuTree menu tree
* @param string $childrenWrapClass children wrap class
* @param int $limit limit
* @param array $colBrakes column brakes
* @return string
*
* @SuppressWarnings(PHPMD)
*/
protected function _getHtml(
Node $menuTree,
$childrenWrapClass,
$limit,
$colBrakes = []
) {
$html = parent::_getHtml($menuTree, $childrenWrapClass, $limit, $colBrakes = []);
$transportObject = new DataObject(['html' => $html, 'menu_tree' => $menuTree]);
$this->_eventManager->dispatch(
'vendor_topmenu_node_gethtml_after',
['menu' => $this->_menu, 'transport' => $transportObject]
);
$html = $transportObject->getHtml();
return $html;
}
}
events.xml
配置文件并分配用于处理事件的类:app / code / Vendor / NavigationMenu / etc / frontend / events.xml:
app /代码/供应商/NavigationMenu/Observer/AddContentToCategoryTopmenu.php:
<?php
/**
* Topmenu catalog observer to add custom additional elements
*
* @category Vendor
* @package Vendor\NavigationMenu
* @author Your Name <your.name@email.com>
* @copyright 2017 Vendor
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
namespace Vendor\NavigationMenu\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Catalog\Api\CategoryRepositoryInterface;
/**
* Class AddFirstCategoryImageToTopmenu
* @package Vendor\NavigationMenu
*/
class AddContentToCategoryTopmenu implements ObserverInterface
{
/**
* @var CategoryRepositoryInterface $categoryRepository
*/
protected $categoryRepository;
/**
* AddFirstCategoryImageToTopmenu constructor.
*
* @param CategoryRepositoryInterface $categoryRepository repository
*/
public function __construct(
CategoryRepositoryInterface $categoryRepository
) {
$this->categoryRepository = $categoryRepository;
}
/**
* @param Observer $observer Observer object
*/
public function execute(Observer $observer)
{
$transport = $observer->getTransport();
$html = $transport->getHtml();
$menuTree = $transport->getMenuTree();
$parentLevel = $menuTree->getLevel();
$childLevel = $parentLevel === null ? 0 : $parentLevel + 1;
$menuId = $menuTree->getId();
if ($childLevel == 1 && $this->isCategory($menuId)) {
$html .= '<li class="category_image" style=""><img src="'.$this->getCategoryImage($menuId).'"/></li>';
}
$transport->setHtml($html);
}
/**
* Retrieves the category image for the corresponding child
*
* @param string $categoryId Category composed ID
*
* @return string
*/
protected function getCategoryImage($categoryId)
{
$categoryIdElements = explode('-', $categoryId);
$category = $this->categoryRepository->get(end($categoryIdElements));
$categoryName = $category->getImageUrl();
return $categoryName;
}
/**
* Check if current menu element corresponds to a category
*
* @param string $menuId Menu element composed ID
*
* @return string
*/
protected function isCategory($menuId)
{
$menuId = explode('-', $menuId);
return 'category' == array_shift($menuId);
}
}