【即将关站通知●已关闭注册功能】,倒计时剩余:计算中...

[discuz建站技术] Discuz 高级教程 - 后台添加主导航

[复制链接]
魔趣吧站长魔趣吧官方成员 实名认证 发表于 2020-4-17 21:13:20 | 显示全部楼层 |阅读模式
在网上看了很多的教程,大多都是来修改 discuz 系统程序文件 admincp_menu.php 来实现添加主导航。这样会对后续的更新升级带来不必要的麻烦。
" X3 i2 j1 C2 Q, R% ?  ?/ _那么今天来讲解一种办法,不会覆盖和修改任何的 discuz 系统程序文件。
. K( {/ M: z; `( z! T: M$ h$ \# Q' \; z' C+ o
    首先我们 研究一下 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 有文件,则显示。# f# Y  g$ ^3 Y& e
接下来我们就来创建两种类型的导航。
# l9 \  R& @" Y" A$ X6 |$ L. M$ `: G4 M: D  i
( T& [; x' E/ R+ d+ M
第一种,创建自定义导航
. ?6 K7 Y. q" r) _7 ?. c$ d8 {
- V+ u, H! m5 X1 x
第一步,就是在 admincp_menu.php 的同级,也就是./source/admincp/ 下建立个文件夹,命名:menu。* `& n4 J: l9 T8 d, g
新建 menu_test.php。添加
  1. <?php
  2. /**
  3. *      (C)2010-2011 New PHP Support Forum
  4. *      This is NOT a freeware, use is subject to license terms
  5. *
  6. *      $Id: menu_moqu8.php 2020-03-24 魔趣吧 $
  7. */
  8. if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
  9.         exit('Access Denied');
  10. }
  11. ?>
复制代码
第二步,添加导航名称变量+ i# |4 {7 A! p: Z6 o( Q/ u
  1. $moqu8 = diconv('魔趣吧', 'UTF-8', CHARSET);
复制代码
第三步,有了这个变量,我们就可以按照 admincp_menu.php 里的$topmenu创建导航
  1. $topmenu[$moqu8] = '';
复制代码

5 {6 ]. l; o% b+ p, i! z; a& i1 \这个时候,后台刷新,已经可以看到导航了。: H4 [7 ?+ n' r' f" x8 D/ _

4 W  k9 R2 S7 G2 o但地址栏中,action的值还是空,所以这个时候点击这个导航是没有任何反应的。我们先略过。先实现侧边导航的添加。: r: z2 Y# M$ g6 j! n) o
第四步,添加左侧分导航,
  1. $menu[$yulun] = array(
  2.         array('更新缓存', 'tools_updatecache'),
  3.         array('版块管理', 'forums'),
  4.         array('用户管理', 'members_search'),
  5. );
复制代码
这里是汇总了后台的页面,如图:( G# U( @7 ^7 ~( \/ Q9 A

$ m: y# Z1 f9 K9 E/ a& p
% K( u# E& X' z- T; Q- P我们来分析一下 array('更新缓存', 'tools_updatecache'),     3 q9 p$ Q( N( `' T
首先,array数组中,第一个参数为列表名称。着重解释下第二个参数 tools_updatecache,
0 X' Q' M% g7 R3 p( F) q4 I: [    tools:为后台导航地址中action的值,2 v! B$ T$ f# E# M, g% m/ j/ `: X' M
    updatecache:为后台导航栏地址中operation的值,
, {+ K, Q2 Z1 I9 v: \换句话来说,比如后台的
. L7 K! ]1 ^  }& r, ?% u# |2 y* [更新缓存的实际地址是:admin.php?action=tools&operation=updatecache,那么第二个参数则为:tools_updatecache;* o( ~6 E7 _6 T1 G6 r7 q
用户管理的实际地址是:admin.php?action=members&operation=search,那么第二个参数则为:members_search;8 y) @" {1 Q, h3 n( H
导航管理的实际地址是:admin.php?action=nav,那么第二个参数只需要填写nav即可。) z3 F% D- Q$ e$ ^; U
当然,第二个参数也可以是一个带有http协议的绝对地址。
6 }, Y! O, T! }5 Q' g. Q0 d8 R. D$ P: p: E& W% {* j, g4 a
最后,可以加上一段
  1. if(empty($menu[$moqu8])){
  2.     unset($topmenu[$moqu8] );
  3. }
复制代码
意思是:如果左侧导航不存在,则销毁(也就是不显示)主导航。3 V- K! u8 e: l( x
# p& h+ s1 |) m+ M3 y0 k

/ |0 W8 I0 T; r) B$ o' _
第二种,创建插件导航

" u; d( e" Z. w1 L# q" A- k/ M1 D7 c6 U8 V
第一步、第二步、第三步同上。
( q, ?% L0 i# j0 K2 K/ y/ ]因为接下来我们是调取插件,安装过插件的站长都清楚,插件的命名分为:唯一表示_插件名称,比如我的所有插件都是以 moqu8_ 开头,那么接下来我们就来单独的把所有的 moqu8_ 的插件,加入到这个新的主导航内。; \/ c/ R. S3 u5 {4 k
前三步,我们已经把框架做出来了。
( O) m7 V: `7 G7 {5 @# u9 L第四步,先读取导航缓存
  1. loadcache('adminmenu');
复制代码
然后我们打印一下:$_G['cache']['adminmenu'] 看看输出结果
  1. echo print_r($_G['cache']['adminmenu']);
复制代码
这个时候在页头的地方就把所有安装的插件打印出来了/ B9 R* Q$ Q: y8 V3 Z

( x+ `2 K+ Q2 C6 U( B) \最后,我们只需要遍历这些带有 moqu8 开头的插件,就可以实现后台自定义主导航显示插件列表的功能了。! l& v8 g9 n- p3 q, j  B2 X3 ~0 q
2 D9 b: a4 `4 N' ^7 x# B
9 m7 s( R5 ~+ s

. n$ e( Q) Y: M' u4 w: [3 e
重要:补坑
+ I1 K+ u( x% I
4 y3 k# D  R) V8 h, s- L5 z
刚刚在上面说到,主导航(魔趣吧)的action还是为空,这样就产生了一个问题,当我们点击主导航时,会默认打开主导航下,第一个左侧导航。( t( J* V" j& v) P
那么如果我想在其中添加一个类似主引导页,则可以把第三步中的
  1. $topmenu[$moqu8] = '';
复制代码
赋予一个参数,比如
  1. $topmenu[$moqu8] = 'addons';
复制代码
接着,我们在admincp_menu.php 的同级,也就是./source/admincp/ 下建立个文件:admincp_addons.php& k5 C* o2 g" y
把这个主引导页的内容写在admincp_addons.php中即可。
4 @. K* `* ]3 A! r

% t( ]2 ~4 h. o4 l7 G4 V
  I8 P& P, }' |+ B+ v
" D, I/ [  b0 Y5 H& u' ]

魔趣吧版权声明1,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2,本文内容仅代表作者本人观点,不代表本网站立场,作者文责自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3,本文内容,包括但不限于源码、文字、图片等,仅供参考使用,本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容
4,如您认为本文内容侵犯了您的权益,请与我们联系!我们将在5个工作日内做出处理!本站保留全部修改、解释、更新本声明的权利魔趣吧

回复

使用道具 举报

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

本版积分规则

在线支持
关闭
欢迎来到魔趣吧
如果你有建站技术问题、仿站需求、模板插件修改需求,请联系我们的技术支持!高效率,低价格的帮你搞定!
请认准魔趣吧唯一官网:www.moqu8.com,谨防假冒网站!

一般问题请到【求助区】发帖咨询(免费)!

邮箱咨询:
winkill2012@qq.com

邮箱咨询需注明:资源地址+本站用户名+具体问题,三者缺一不做处理。非本站资源不处理!
在线支持
快速回复 返回列表

关于魔趣吧|魔趣建站

魔趣吧,志在打造全国最大的建站资源共享平台。 本站提供海量免费的建站资源,包括WordPress模板、Discuz精仿模板、PHPWind模板、phpcms模板、Discuz精仿插件、帝国cms模板、织梦模板等上万精品模板!同时,提供各种建站素材、JS特效、整站程序源码!
服务中文站长,传播分享精神!建站,就来魔趣吧!!
2015-2024 魔趣吧 ( 豫ICP备2021024354号 )   豫公网安备41030402000182号 百度统计
HTTPS安全认证
|网站地图 | 已运行:天 
温馨提示:本站所有资源、教程、源码,不得用于非法站点及用途,否则,本站将终止提供任何服务! Powered by Discuz! Licensed