说到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中创建基本模块,请看我们的Magento2 创建基础模块。
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不会指向任何地方,因为应该创建模块的控制器。
这是最后的样子: