想要在magento2框架基础上添加一个自己的菜单项,主要有3步:
1、创建你要新增的菜单项;
2、创建菜单项要链接的模块的后台路由(URL路径);
3、创建模块的控制器和视图
一、创建新增菜单项
可以参考上一节新增菜单项的内容,这里将上节三级子菜单 Third Level Example的<action>属性修改为Controller下要链接的功能(route文件中起的前名/控制器名/控制器下的php类名),本例为"adminer/index/index"。
二、管理模块路由(URL)的ect目录
一般来说,etc中需要包含两个文件夹,frontend(前端路由文件夹)和 adminhtml(后台管理路由文件夹),分别在这两个文件夹中创建路由文件routes.xml,用来管理每个模块(前端和后台)。目录结构如下:
routes.xml文件中,由<router id>属性决定是路由到前端还是后台,standard为前端,admin为后台。
<route id>属性决定URL的第一段内容,也可以理解为这个模块的简称,frontname与其一致。
三、创建模块的控制器和视图
1、控制器(Controller目录)
Magento 前端控制器使用 [Package]\[Module]\Controller\[Controller Segment]\[Action Segment] 命名约定。 后端控制器使用[Package]\[Module]\Controller\Adminhtml\[Controller Segment]\[Action Segment],多了一个Adminhtml段。
Controller的Index.php文件
<?php
namespace Bcn\ToDoCrud\Controller\Adminhtml\Index;
class Index extends \Magento\Backend\App\Action
{
protected \Magento\Framework\View\Result\PageFactory $result_PageFactory;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $resultPageFactory)
{
$this->result_PageFactory = $resultPageFactory;
return parent::__construct($context);
}
public function execute()
{
return $this->result_PageFactory->create();
}
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bcn_ToDoCrud::top_level_example');
}
}
注意事项:
(1)所有Magento后端控制器类都需要继承\Magento\Backend\App\Action\Action类。 不这样做可能会导致系统不稳定,并造成意外的隐私和安全漏洞;
(2)__construct 方法。 虽然您的控制器中不需要 __construct 方法,但如果您使用该方法,则需要包含一个后端上下文对象参数\Magento\Backend\App\Action\Context $context;
public function __construct(Context $context)
{
parent::__construct($context);
}
(3)后端管理控制器的 _isAllowed 方法(超级用户不受限)。如果 _isAllowed 返回 true,允许该用户访问;如果没有,他们将看到访问被拒绝的屏幕。例子中何被分配了 Pulsestorm_HelloAdminBackend::menu_1 权限的用户(通过system -> permissions)都将能够访问此控制器端点。
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bcn_ToDoCrud::top_level_example');
}
2、创建视图文件(view目录放页面展示,Block目录放操作)
view下的前后台子目录(frontend和adminhtml)中都包含layout和templates目录,layout目录下放布局的xml文件,templates目录下放Block的phtml模板。
本部分包含三个部分,布局的xml文件、Block视图文件和Block的 phtml 模板。
(1)创建布局xml文件
Bcn/ToDoCrud/view/adminhtml/layout/admin_backend_index_index.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<referenceBlock name="content">
<block template="content.phtml"
class="Bcn\ToDoCrud\Block\Adminhtml\Main"
name="bcn_todocrud_adminbackend_block_main" />
</referenceBlock>
</page>
其中template属性为对应phtml模板的名称; class属性为对应Block块中的类(视图文件)。
(2)创建Block的phtml模板
Bcn/ToDoCrud/view/adminhtml/templates/content.phtml
<h1>This is my template, there are many like it, but this one is mine.</h1>
(3)创建Block块的类
Bcn/ToDoCrud/Block/Adminhtml/Main.php
<?php
namespace Bcn\ToDoCrud\Block\Adminhtml;
class Main extends \Magento\Backend\Block\Template
{
function _prepareLayout(){
}
}
完成后点击Third Level Example,如下,展示了template中的phtml