说到Magento定制,有时会需要一个自定义配置选项,该选项需要放在后台菜单的某个位置。Magento 2提供了组织良好的后台菜单,但如果新创建的配置选项放在哪里都不适合呢?

在这种情况下,可以创建一个新的菜单项以适应该选项。本篇博客介绍了如何在Magento 2中执行此操作。

与Magento 1不同,Magento 2中的后台菜单位于屏幕左侧,原因是为了简化从平板电脑或智能手机访问菜单的流程。

 

什么是菜单项?

基本上,菜单项是指向另一个后台配置页面的链接,如下:

href="http://m2.loc/admin/sales/order/index/key/9f8n6825d41694450594r4efc3c779f6df8a8191ffca03f2113ece65436h076e/"

此URL的一部分是sales/order/index它由三个部分组成,需要在菜单项XML配置中定义。

Front Name:		sales
Controller Name:	order
Action Name:		index

链接中还有一个关键变量,用于防止跨站点脚本的攻击。这实际上是菜单项以“Magento方式”创建的真正原因,任何没有此变量的后端请求都将无效,其他链接部分由Magento自动创建。

 

创建新的基本模块

为了演示如何创建菜单项,需要一个新的基本模块结构。如果您还不知道如何在Magento 2中创建基本模块,请看我们的这篇博客

Magease/MenuItem/registration.php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Magease_MenuItem',
    __DIR__
);

Magease/MenuItem/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="Magease_MenuItem" setup_version="1.0.0" />
</config>

 

创建新菜单项

菜单由文件menu.xml配置,该文件位于模块的etc / adminhtml文件夹中。它由配置菜单节点以及添加指令组成,菜单节点可能包含多个添加指令。

Magease/MenuItem/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="Magease_MenuItem::first_level_demo"
             title="Magease First Level"
             module="Magease_MenuItem"
             sortOrder="9999"
             resource="Magento_Backend::content" />
    </menu>
</config>

从menu.xml结构可以看出,新菜单项通常使用带有参数的add指令添加,它包含在菜单标签中。

指令的属性说明如下:

  • id - 唯一节点标识符,应遵循以下格式:Vendor_Module :: menu_item_description
  • title - 菜单中显示的文本
  • module - 当前模块
  • sortOrder - 放置菜单项的位置
  • resource - 定义admin用户必须具有的ACL规则才能查看和访问此菜单,它在acl.xml中定义。否则,将不会呈现菜单项。为简单起见,使用了Magento_Backend :: content。

运行Magento的CLI命令cache:clean,应该可以看到新的菜单项。但就目前而言,它没有任何意义,也不是一个链接。第一级菜单项通常不是链接,而只是第二级或第三级菜单项的容器。

菜单项成为实际链接所需要的只是一个action属性,例如,对于位于第二级的菜单项,还必须使用父属性。它定义了它所依赖的第一级,它可以是当前模块或菜单中的任何其他模块(例如,系统模块Magento_Backend ::system)。同样的逻辑也适用于第三级菜单项。

额外的属性:

  • action - 如上所述,告诉Magento生成指向某个后端控制器的链接
  • parent - 定义菜单项所依赖的第一级

带有action的第二级菜单项的示例:

<?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="Magease_MenuItem::first_level_demo"
             title="Magease First Level Item"
             module="Magease_MenuItem"
             sortOrder="9999"
             resource="Magento_Backend::content" />
 
        <add id="Magease_MenuItem::second_level_demo"
             title="Magease Second Level Item"
             module="Magease_MenuItem"
             sortOrder="0"
             action="menuitem/index/index"
             parent="Magease_MenuItem::first_level_demo"
             resource="Magento_Backend::content" />
    </menu>
</config>

 

刷新magento缓存

定义完所有内容后,应使用以下CLI命令清除magento缓存:

php -f bin/magento cache:clean

 

结果

而已。现在,菜单项应该在管理菜单中的最后一级“Magease First Level Item”下可见,它应该导致定义的操作。在此示例中,为简单起见,操作无处可去,因为应该创建模块的控制器。

 

就是这样。菜单项现在应该可以在管理菜单中看到,在一级菜单最后的“Magease First Level Item”下,并且它应该指向一个自定义的action。在本例中,为了简单起见,action不会指向任何地方,因为应该创建模块的控制器。

这是最后的样子: