Hi 您目前尚未登陆
请选择 进入手机版 | 继续访问电脑版

Admin

送给“上官雨伦”:做教师的人自己便当具有良好的教养,随人、随时、随地,都有适当的举止与礼貌。受过教育而无教养的人是一堆一文不值的垃圾。
演示站完全是自己仿的!所有帖子是胡乱发的,大家请无视!插件和模板都下载自垃圾的,没偷没抢!!!

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

2020-04-25 19:00:31 发布

Discuz /[教程] 48 0 0

adminWriter

来自中国,不是教师

47

主题

48

帖子

48

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
48
发表于 2020-4-25 19:00:31 | 显示全部楼层 |阅读模式
在网上看了很多的教程,大多都是来修改 discuz 系统程序文件 admincp_menu.php 来实现添加主导航。这样会对后续的更新升级带来不必要的麻烦。
那么今天来讲解一种办法,不会覆盖和修改任何的 discuz 系统程序文件。

    首先我们 研究一下 admincp_menu.php,会发现在下面有一段
  1. if(file_exists($menudir = DISCUZ_ROOT.'./source/admincp/menu')) {
  2.         $adminextend = $adminextendnew = array();
  3.         if(file_exists($adminextendfile = DISCUZ_ROOT.'./data/sysdata/cache_adminextend.php')) {
  4.                 @include $adminextendfile;
  5.         }
  6.         $menudirhandle = dir($menudir);
  7.         while($entry = $menudirhandle->read()) {
  8.                 if(!in_array($entry, array('.', '..')) && preg_match("/^menu_([w.]+)$/", $entry, $entryr) && substr($entry, -4) == '.php' && strlen($entry) < 30 && is_file($menudir.'/'.$entry)) {
  9.                         @include_once $menudir.'/'.$entry;
  10.                         $adminextendnew[] = $entryr[1];
  11.                 }
  12.         }
  13.         if($adminextend != $adminextendnew) {
  14.                 @unlink($adminextendfile);
  15.                 if($adminextendnew) {
  16.                         require_once libfile('function/cache');
  17.                         writetocache('adminextend', getcachevars(array('adminextend' => $adminextendnew)));
  18.                 }
  19.                 unset($_G['lang']['admincp']);
  20.         }
  21. }
复制代码

其中 if 里的 file_exists 这个函数的定义为:检查文件或目录是否存在。我们可以把这里理解为,如果检查到./source/admincp/menu 有文件,则显示。
接下来我们就来创建两种类型的导航。


第一种,创建自定义导航

第一步,就是在 admincp_menu.php 的同级,也就是./source/admincp/ 下建立个文件夹,命名:menu。
新建 menu_test.php。添加
  1. /**
  2. *      (C)2010-2011 New PHP Support Forum
  3. *      This is NOT a freeware, use is subject to license terms
  4. *
  5. *      $Id: menu_yulun.php 2020-03-24 上官雨伦 $
  6. */

  7. if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
  8.         exit('Access Denied');
  9. }

  10. ?>
复制代码

第二步,添加导航名称变量
  1. $yulun = diconv('雨伦博客', 'UTF-8', CHARSET);
复制代码

第三步,有了这个变量,我们就可以按照 admincp_menu.php 里的$topmenu创建导航
  1. $topmenu[$yulun] = '';
复制代码
这个时候,后台刷新,已经可以看到导航了。
152616xbjjotqoqrmtt5it.png
但地址栏中,action的值还是空,所以这个时候点击这个导航是没有任何反应的。我们先略过。先实现侧边导航的添加。
第四步,添加左侧分导航,
  1. $menu[$yulun] = array(  
  2.         array('更新缓存', 'tools_updatecache'),     
  3.         array('版块管理', 'forums'),
  4.         array('用户管理', 'members_search'),
  5. );
复制代码
这里是汇总了后台的页面,如图:
172514k2knmnr2zylr32yz.png
172516uv2gvval4cdcsccv.png
我们来分析一下 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[$yulun])){
  2.     unset($topmenu[$yulun] );
  3. }
复制代码

意思是:如果左侧导航不存在,则销毁(也就是不显示)主导航。


第二种,创建插件导航

第一步、第二步、第三步同上。
因为接下来我们是调取插件,安装过插件的站长都清楚,插件的命名分为:唯一表示_插件名称,比如我的所有插件都是以 yulun_ 开头,那么接下来我们就来单独的把所有的 yulun_ 的插件,加入到这个新的主导航内。
前三步,我们已经把框架做出来了。
第四步,先读取导航缓存
  1. loadcache('adminmenu');
复制代码

然后我们打印一下:$_G['cache']['adminmenu'] 看看输出结果
  1. echo print_r($_G['cache']['adminmenu']);
复制代码
这个时候在页头的地方就把所有安装的插件打印出来了
180125j0zxdmqyida77dxq.png
最后,我们只需要遍历这些带有 yulun 开头的插件,就可以实现后台自定义主导航显示插件列表的功能了。

重要:补坑

刚刚在上面说到,主导航(雨伦博客)的action还是为空,这样就产生了一个问题,当我们点击主导航时,会默认打开主导航下,第一个左侧导航。
那么如果我想在其中添加一个类似主引导页,则可以把第三步中的
  1. $topmenu[$yulun] = '';
复制代码

赋予一个参数,比如
  1. $topmenu[$yulun] = 'addons';
复制代码

接着,我们在admincp_menu.php 的同级,也就是./source/admincp/ 下建立个文件:admincp_addons.php
把这个主引导页的内容写在admincp_addons.php中即可。

0 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

当前话题还没有评论,来做第一个评论的人吧 ♪(^∇^*)