·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

Discuz 高级教程 - 后台添加主导航

518 2
发表于 2020-7-6 13:33:02 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在网上看了很多的教程,大多都是来修改 discuz 系统程序文件 admincp_menu.php 来实现添加主导航。这样会对后续的更新升级带来不必要的麻烦。
那么今天来讲解一种办法,不会覆盖和修改任何的 discuz 系统程序文件。

    首先我们 研究一下 admincp_menu.php,会发现在下面有一段
  1. if(file_exists($menudir = DISCUZ_ROOT.'./source/admincp/menu')) {        $adminextend = $adminextendnew = array();        if(file_exists($adminextendfile = DISCUZ_ROOT.'./data/sysdata/cache_adminextend.php')) {                @include $adminextendfile;        }        $menudirhandle = dir($menudir);        while($entry = $menudirhandle->read()) {                if(!in_array($entry, array('.', '..')) && preg_match("/^menu\_([\w\.]+)$/", $entry, $entryr) && substr($entry, -4) == '.php' && strlen($entry) < 30 && is_file($menudir.'/'.$entry)) {                        @include_once $menudir.'/'.$entry;                        $adminextendnew[] = $entryr[1];                }        }        if($adminextend != $adminextendnew) {                @unlink($adminextendfile);                if($adminextendnew) {                        require_once libfile('function/cache');                        writetocache('adminextend', getcachevars(array('adminextend' => $adminextendnew)));                }                unset($_G['lang']['admincp']);        }}
复制代码
其中 if 里的 file_exists 这个函数的定义为:检查文件或目录是否存在。我们可以把这里理解为,如果检查到./source/admincp/menu 有文件,则显示。
接下来我们就来创建两种类型的导航。


第一种,创建自定义导航


第一步,就是在 admincp_menu.php 的同级,也就是./source/admincp/ 下建立个文件夹,命名:menu。
新建 menu_test.php。添加
  1. <?php/***      (C)2010-2011 New PHP Support Forum*      This is NOT a freeware, use is subject to license terms**      $Id: menu_moqu8.php 2020-03-24 DZ插件网 $*/if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {        exit('Access Denied');}?>
复制代码
第二步,添加导航名称变量
  1. $moqu8 = diconv('DZ插件网', 'UTF-8', CHARSET);
复制代码
第三步,有了这个变量,我们就可以按照 admincp_menu.php 里的$topmenu创建导航
  1. $topmenu[$moqu8] = '';
复制代码
这个时候,后台刷新,已经可以看到导航了。

但地址栏中,action的值还是空,所以这个时候点击这个导航是没有任何反应的。我们先略过。先实现侧边导航的添加。
第四步,添加左侧分导航,
  1. $menu[$yulun] = array(        array('更新缓存', 'tools_updatecache'),        array('版块管理', 'forums'),        array('用户管理', 'members_search'),);
复制代码
这里是汇总了后台的页面,如图:


我们来分析一下 array('更新缓存', 'tools_updatecache'),     
首先,array数组中,第一个参数为列表名称。着重解释下第二个参数 tools_updatecache,
    tools:为后台导航地址中action的值,
    updatecache:为后台导航栏地址中operation的值,
换句话来说,比如后台的
更新缓存的实际地址是:admin.php?action=tools&operation=updatecache,那么第二个参数则为:tools_updatecache;
用户管理的实际地址是:admin.php?action=members&operation=search,那么第二个参数则为:members_search;
导航管理的实际地址是:admin.php?action=nav,那么第二个参数只需要填写nav即可。
当然,第二个参数也可以是一个带有http协议的绝对地址。

最后,可以加上一段
  1. if(empty($menu[$moqu8])){    unset($topmenu[$moqu8] );}
复制代码
意思是:如果左侧导航不存在,则销毁(也就是不显示)主导航。


第二种,创建插件导航


第一步、第二步、第三步同上。
因为接下来我们是调取插件,安装过插件的站长都清楚,插件的命名分为:唯一表示_插件名称,比如我的所有插件都是以 moqu8_ 开头,那么接下来我们就来单独的把所有的 moqu8_ 的插件,加入到这个新的主导航内。
前三步,我们已经把框架做出来了。
第四步,先读取导航缓存
  1. loadcache('adminmenu');
复制代码
然后我们打印一下:$_G['cache']['adminmenu'] 看看输出结果
  1. echo print_r($_G['cache']['adminmenu']);
复制代码
这个时候在页头的地方就把所有安装的插件打印出来了

最后,我们只需要遍历这些带有 moqu8 开头的插件,就可以实现后台自定义主导航显示插件列表的功能了。



重要:补坑


刚刚在上面说到,主导航(DZ插件网)的action还是为空,这样就产生了一个问题,当我们点击主导航时,会默认打开主导航下,第一个左侧导航。
那么如果我想在其中添加一个类似主引导页,则可以把第三步中的
  1. $topmenu[$moqu8] = '';
复制代码
赋予一个参数,比如
  1. $topmenu[$moqu8] = 'addons';
复制代码
接着,我们在admincp_menu.php 的同级,也就是./source/admincp/ 下建立个文件:admincp_addons.php
把这个主引导页的内容写在admincp_addons.php中即可。
我要说一句 收起回复

评论2

Discuz智能体Lv.8 发表于 2025-3-18 01:46:03 | 查看全部
在Discuz中,后台添加主导航是一个常见的需求,尤其是在需要扩展后台功能或集成插件时。你提到的通过创建自定义文件和目录来添加导航,而不是直接修改系统文件,确实是一个更为安全和可维护的方法。以下是对你提供的内容的进一步解释和补充:

### 1. 创建自定义导航

#### 第一步:创建 `menu` 目录
在 `./source/admincp/` 目录下创建一个名为 `menu` 的文件夹。这个文件夹将用于存放自定义的导航文件。

#### 第二步:创建导航文件
在 `menu` 文件夹中创建一个新的 PHP 文件,例如 `menu_test.php`。在这个文件中,你可以定义导航的名称和结构。

  1. <?php
  2. $moqu8 = diconv('DZ插件网', 'UTF-8', CHARSET);
复制代码


#### 第三步:定义主导航
在 `menu_test.php` 中,你可以定义主导航的变量 `$topmenu`。这个变量将用于显示在后台的顶部导航栏中。

  1. $topmenu = 'addons'; // 这里可以定义导航的 action 值
复制代码


#### 第四步:定义侧边导航
在 `menu_test.php` 中,你可以定义侧边导航的菜单项。每个菜单项都是一个数组,包含显示名称和对应的操作。

  1. $menu = array(
  2.     array('更新缓存', 'tools_updatecache'),
  3.     array('版块管理', 'forums'),
  4.     array('用户管理', 'members_search'),
  5. );
复制代码


#### 第五步:处理空菜单
如果侧边导航为空,你可以选择不显示主导航。

  1. if(empty($menu)) {
  2.     unset($topmenu);
  3. }
复制代码


### 2. 创建插件导航

#### 第一步:读取插件缓存
在 `menu_test.php` 中,你可以通过 `loadcache('adminmenu')` 来加载插件的缓存信息。

  1. loadcache('adminmenu');
复制代码


#### 第二步:遍历插件
你可以遍历 `$_G['cache']['adminmenu']` 来获取所有已安装的插件,并筛选出你想要的插件。

  1. foreach ($_G['cache']['adminmenu'] as $plugin) {
  2.     if (strpos($plugin['identifier'], 'moqu8_') === 0) {
  3.         // 添加插件到导航
  4.         $menu[] = array($plugin['name'], $plugin['identifier']);
  5.     }
  6. }
复制代码


### 3. 补坑:处理主导航的 action

如果你希望主导航点击后跳转到一个特定的页面,而不是默认打开第一个侧边导航,你可以在 `$topmenu` 中指定一个 action 值,并创建一个对应的处理文件。

#### 第一步:定义主导航的 action
在 `menu_test.php` 中,定义 `$topmenu` 的 action 值。

  1. $topmenu = 'addons';
复制代码


#### 第二步:创建处理文件
在 `./source/admincp/` 目录下创建一个名为 `admincp_addons.php` 的文件,用于处理主导航的请求。

  1. <?php
  2. if(!defined('IN_DISCUZ')) {
  3.     exit('Access Denied');
  4. }

  5. // 这里可以编写你的处理逻辑
  6. echo '欢迎来到 DZ插件网 主导航页面';
复制代码


### 总结

通过这种方式,你可以在不修改 Discuz 核心文件的情况下,灵活地添加和管理后台导航。这种方法不仅避免了升级时的冲突,还使得导航的维护更加方便。如果你有更多关于 Discuz 开发的问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-20 13:03:34 | 查看全部
在Discuz中,后台添加主导航是一个常见的需求,尤其是在需要为插件或自定义功能添加管理入口时。为了避免直接修改系统文件(如`admincp_menu.php`),我们可以通过扩展的方式来实现这一需求。以下是详细的步骤和解释:

### 1. 创建自定义导航

#### 第一步:创建`menu`文件夹
在`./source/admincp/`目录下创建一个名为`menu`的文件夹。这个文件夹将用于存放自定义的导航文件。

#### 第二步:创建导航文件
在`menu`文件夹中创建一个新的PHP文件,例如`menu_test.php`。在这个文件中,我们将定义导航的名称和结构。

  1. <?php
  2. // 定义导航名称
  3. $moqu8 = diconv('DZ插件网', 'UTF-8', CHARSET);

  4. // 定义主导航
  5. $topmenu = 'addons'; // 这里定义主导航的action值

  6. // 定义左侧导航
  7. $menu = array(
  8.     array('更新缓存', 'tools_updatecache'),
  9.     array('版块管理', 'forums'),
  10.     array('用户管理', 'members_search'),
  11. );

  12. // 如果左侧导航为空,则不显示主导航
  13. if(empty($menu)) {
  14.     unset($topmenu);
  15. }
  16. ?>
复制代码


#### 第三步:刷新后台
刷新Discuz后台,你应该能够看到新添加的导航项。此时,点击导航项可能会跳转到默认的第一个左侧导航项。

### 2. 创建插件导航

如果你希望将插件的管理入口添加到主导航中,可以按照以下步骤操作:

#### 第一步:读取插件缓存
在`menu_test.php`文件中,首先读取插件的缓存信息:

  1. loadcache('adminmenu');
复制代码


#### 第二步:遍历插件
遍历所有已安装的插件,并将符合特定命名规则的插件添加到导航中:

  1. if (!empty($_G['cache']['adminmenu'])) {
  2.     foreach ($_G['cache']['adminmenu'] as $plugin) {
  3.         if (strpos($plugin['identifier'], 'moqu8_') === 0) {
  4.             $menu[] = array($plugin['name'], $plugin['identifier']);
  5.         }
  6.     }
  7. }
复制代码


#### 第三步:刷新后台
刷新后台后,你应该能够看到所有以`moqu8_`开头的插件被添加到主导航的左侧导航中。

### 3. 补坑:为主导航添加默认页面

如果你希望点击主导航时跳转到一个特定的页面(而不是默认的第一个左侧导航项),可以在`menu_test.php`中定义`$topmenu`的值,并创建一个对应的处理文件。

#### 第一步:定义`$topmenu`
在`menu_test.php`中,将`$topmenu`设置为一个特定的值,例如`addons`:

  1. $topmenu = 'addons';
复制代码


#### 第二步:创建处理文件
在`./source/admincp/`目录下创建一个名为`admincp_addons.php`的文件,用于处理主导航的默认页面:

  1. <?php
  2. if(!defined('IN_DISCUZ')) {
  3.     exit('Access Denied');
  4. }

  5. // 这里可以编写你的主引导页内容
  6. echo '欢迎来到DZ插件网管理页面';
  7. ?>
复制代码


### 总结

通过以上步骤,你可以在不修改Discuz系统文件的情况下,为后台添加自定义的主导航和插件导航。这种方法不仅避免了系统升级时的冲突,还使得导航的管理更加灵活和可维护。

如果你有更多关于Discuz开发的问题,欢迎随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.14.252.26,GMT+8, 2025-3-28 23:25 , Processed in 0.647742 second(s), 77 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表