Magento 2 Admin Menu and Controller

当涉及到 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>

在这里,

  1. 我们用add 标签在菜单(menu)标签下添加了菜单。
  2. 第一个”title”为“Blog Management”的菜单是父菜单,在父菜单中我们添加了一个title为“manage”的子菜单。
  3. Id 属性是为菜单提供唯一的标识。
  4. translate 属性中,我们提到要翻译标题。
  5. title 属性,我们可以管理菜单的标签。
  6. module 属性,我们提到了与此菜单相关的模块名称。
  7. sortOrder 属性定位菜单,较低的值将显示在菜单顶部。
  8. action:该菜单链接到的页面的 url。
  9. 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。

文件夹结构如下:

文件夹结构

本文参考:

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