当涉及到 Magento 定制时,有时需要一个自定义配置选项,需要放置在管理菜单的某个地方。Magento2带有组织良好的管理菜单,但是如果新创建的配置选项不适合任何地方呢,在这种情况下,可以创建一个新的菜单项来容纳该选项。这里有一个关于如何在 Magento2中做到这一点的教程。
与 Magento 1不同,Magento 2的管理菜单位于屏幕的左侧。这样做的原因是为了简化从平板电脑或智能手机访问菜单的过程。
什么是菜单项?
基本上,菜单项是指向另一个管理配置页面的链接。一个例子是这样的:
我们从事前端工作已有很长时间了。 让我们也为管理员实施类似的功能。 在此博客中,我们将创建一个管理菜单和控制器。
Route
回想一下,当我们为前端创建控制器时。 我们创建的第一件事是routes.xml。 对于管理员,我们需要在etc / adminhtml / routes.xml中创建路由文件.
<?xml version="1.0" encoding="UTF-8" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="blogmanager" frantName ="blog">
<module name="Yshuq_BlogManager" />
</route>
</router>
</config>
如您所见,它与前端非常相似。 我们在此更改的唯一一件事就是路由器ID。与前端不同,在管理员中,我们不能直接在浏览器中输入网址,因为默认情况下,管理员网址是由magento通过密钥保护的。

Admin Menu
因此,我们需要首先创建一个菜单。 要创建菜单,我们需要将menu.xml创建为etc / adminhtml / menu.xml。
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
<menu>
<add id="Yshuq_BlogManager::blogmanager" translate="title" title="Blog Management" module="Yshuq_BlogManager" sortOrder="10" resource="Yshuq_BlogManager::blogmanager"/>
<add id="Yshuq_BlogManager::manage" translate="title" title="Manage" module="Yshuq_BlogManager" sortOrder="10" resource="Yshuq_BlogManager::manage" parent="Yshuq_BlogManager::blogmanager" action="blog/manage/index"/>
</menu>
</config>
在这里,
- 我们用add 标签在菜单(menu)标签下添加了菜单。
- 第一个”title”为“Blog Management”的菜单是父菜单,在父菜单中我们添加了一个title为“manage”的子菜单。
- Id 属性是为菜单提供唯一的标识。
- translate 属性中,我们提到要翻译标题。
- title 属性,我们可以管理菜单的标签。
- module 属性,我们提到了与此菜单相关的模块名称。
- sortOrder 属性定位菜单,较低的值将显示在菜单顶部。
- action:该菜单链接到的页面的 url。
- resource:属性用于定义 ACL 规则,管理员用户必须具有该规则才能查看和访问此菜单。
资源属性与访问控制列表(ACL)相关。当我们创建不同的管理角色时,这是必需的。我们将在本系列后面的部分中详细了解 ACL。
顶部菜单层的图标。你可以在0级菜单标题上面看到它们。这个图标是由 Magento 的“管理图标”字体生成。
如果菜单是某些菜单的子菜单,那么我们需要在 parent 属性中提到父菜单的 id。使用 action 属性,我们可以在单击此菜单时提供我们想要浏览的 url。它应该是 frontName/controllerName/actionName 格式。
如果你检入管理面,你会看到我们的菜单如下:

Controller:控制器
现在让我们创建控制器文件。对于所有与 admin 相关的控制器文件,我们需要在 Controller 文件夹下创建一个 Adminhtml 文件夹。要创建Index操作,我们需要创建 Controller/Adminhtml/Manage/Index.php 文件,
<?php
namespace Yshuq\BlogManager\Controller\Adminhtml\Manage;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class Index extends Action
{
public $context;
public $resultPageFactory;
public function __construct(
Context $context,
PageFactory $resultPageFactory
) {
parent::__construct($context);
$this->resultPageFactory = $resultPageFactory;
}
public function execute()
{
$resultPage = $this->resultPageFactory->create();
$resultPage->setActiveMenu('Yshuq_BlogManager::manage');
$resultPage->getConfig()->getTitle()->prepend(__('Manage Blog'));
return $resultPage;
}
public function _isAllowed()
{
return $this->_authorization->isAllowed('Yshuq_BlogManager::manage');
}
}
所有的actions在管理员将扩展 Magento\Backend\App\Action class 类。Execute 函数的内容非常简单。通过在 setActiveMenu 函数中提供 id,我们已经将菜单设置为 active。我们还设置了页面标题。
isAllowed()方法用于ACL。 在这里,我们在isAllowed函数中传递资源ID。
文件夹结构如下:

本文参考:
- https://bsscommerce.com/blog/create-admin-menu-in-magento-2/
- https://webkul.com/blog/create-admin-menu-and-controller-in-magento2/
- https://www.mageplaza.com/magento-2-module-development/create-admin-menu-magento-2.html
- https://devdocs.magento.com/guides/v2.3/ext-best-practices/extension-coding/example-module-adminpage.html
- https://inchoo.net/magento-2/admin-menu-item-magento-2/
- https://www.cloudways.com/blog/admin-menu-magento-2/
- https://www.truecodex.com/course/magento-2-module-development/create-admin-menu-in-magento-2
- https://www.devlineagency.com/blog/creating-admin-and-frontend-controllers-in-magento-2.html