ag游戏客服|官方二次开发

?找回密码
?立即注册
搜索
热搜: 活动 交友 discuz
查看: 1588|回复: 1
打印 上一主题 下一主题

ag游戏客服|官方后台管理菜单函数执行流程分析

[复制链接]

1046

主题

1109

帖子

5334

积分

超级版主

Rank: 8Rank: 8

金币
256
贡献
3959
跳转到指定楼层
楼主
发表于 2015-5-21 12:22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
? ?在教程“ag游戏客服|官方后台管理菜单函数执行流程分析”我们已经分析了“ag游戏客服|官方后台左侧菜单右侧栏目菜单项”生成的代码。今天我们分析这个菜单如何通过函数GetMenus($userrank,$topos='main')来生成的。

??打开文件inc_menu_func.php,这个文件里只有这个函数,所以,我就不截取这个函数的代码图了,大家可以打开这个文件,一边看着本教程,一边看代码。

??要生成如下图所示内容。


??通过这个GetMenus()这个函数是如何实现的呢?通过上图我们知道,这个红色框(我把红色框内的内容称作右侧菜单)内是由不同块组成的,一个是“常用操作”块,一个是“内容管理”块,一个是“附件管理”块等几块组成,每一块下面都有对应的栏目,也就是说“右侧菜单”要想调用出内容来,必须,先把每一块内顶级栏目,例如,“常用操作”,“附件管理”等遍历出来,然后,再把每块里面的内容遍历出来。

??这样我们就把这个函数,分成了二个遍历,一个遍历里面套着另一个遍历,这个函数里面正是通过foreach遍历来实现的。

??你是为什么这样分析,你是如何看出来的?有二个方法,一是通过“右侧菜单”,二是通过文件inc_menu.php里面的代码,我们取出其中一段代码进行分析备用。例如,我们把“常用操作”这段代码合出来作为案例。



??
??
??
??
??


target='main' />



??我们对这个段代码分析一下,我们仔细比对一下,发现这不正是“右侧菜单”项,“常用操作”对应的内容吗?是的,正是它。我们看一下这段代码,发现,它实际上是一块,一块内又分不同的栏目。

??把上面代码简化一下就是:



? ?
? ?
? ?
? ?
? ?



??我们要想要把这些内容全部显示出来,必须先遍历外面的标记为top(现在只是取出“常用操作”这个例子,但右侧菜单有好几块)的,然后,再遍历里面标记为item。

??我们要遍历这个“左侧菜单”就要用到ag游戏客服|官方模板类,因为,这些代码都是在文件inc_menu.php以字符串显示的,所以,我们要用到ag游戏客服|官方静态模板类,即通过如下代码

??$dtp = new DedeTagParse();
? ? $dtp->SetNameSpace('m','<','>');
? ? $dtp->LoadSource($menus);
? ? $dtp2 = new DedeTagParse();
? ? $dtp2->SetName;

??通过上面代码来取inc_menu.php里面的内容。分析到这里我们就知道了,函数GetMenu()写的代码就是把文件inc_menu.php里同的内容,通过二个遍历,用ag游戏客服|官方模板类代码,把文件inc_menu.php里面的内容取出来,显示在ag游戏客服|官方后台菜单,便成了我们看到的“右侧菜单”了。

??当然,今天分析的是以“核心”里面的菜单作为例子,对于其它的菜单,例如,“生成”、“模块”、“采集”、“会员”等,都同样用到这个函数。只要把我们其中一个分析透彻,其它,都完全一样。

??
函数源代码分析:

??1.通过global定义了几个全局变量,这里要特别说的是在外部虽然,定义了$headTemplet等变量,但是在函数中只有重新用关键词global定义一下,才能在函数中用到外部的变量,这是php基本常识,但是,我们会经常忘记的,如果您过代码就知道,经常犯错误,特别是对于新手来说,更是如此。

??2.通过二个条件判断,来判断是主菜单,还是模块菜单,主菜单是指除了“模块”和“插件”以外的菜单。在这二个条件中我们都用了一个超全数组$GLOBALS['menusMain']$GLOBALS['menusModel']来定义了我们从文件inc_menu.php里面得到的字符串,为什么要定义成超全局数组中的单元?因为,我们下面要进行遍历循环,这是必须的。

??3.程序执行到foreach($dtp->CTags as $i=>$ctag)里面,我们细细的分析一下。

? ?if($ctag->GetName()=='top' && ($ctag->GetAtt('rank')=='' || TestPurview($ctag->GetAtt('rank')) ))
? ?这个判断是用来判断:如果是顶级栏目(例如,“常用操作”)并且这个栏目权限为空或允许显示这个栏目,则向下执行代码,否则,退出,为什么要做这个判断?显示在“右侧菜单”各栏目,首先得有顶级栏目,例如,“常用操作”如下图所示。



??有了项极栏目“常用操作”,才有下面的绿色框内的各栏目项,如是没有顶级栏目,下面是不能直接显示绿色框内的内容的,这个条件判断,正是为了排除没有顶级栏目而显示里面的内容,言外之意就是必须有顶级栏目,才能显示这个栏目下面的内容。

??接着,又来了一个判断:if($openitem!=999 && !preg_match("#".$openitem.'_'."#", $ctag->GetAtt('item')) && $openitem!=100) continue,这个判断告诉程序,只要基本一项是真,就向下执行代码,否则,返回到第一次遍历处,接着遍历。

??4.接着代码执行到echo "\r\n";从这句代码开始,就开始组装“右侧菜单”内容,即,对$headTemplet,$footTemplet和$itemTemplet里面的内容替换操作。通过str_replace("~channelname~",$ctag->GetAtt("name"),$headTemplet);把$headTemplet里面的~channelname~东西,替换成$ctag->GetAtt("name")的值,即标签里同的name="常用操作",也就是$ctag->GetAtt("name")=常用操作。此时,

??$headTemplet = "
常用操作


    \r\n";

    ??5.又是一个条件判断。

    ? ?? ?? ?? ?if(empty($openitem) || $openitem==100)
    ? ?? ?? ?? ?{
    ? ?? ?? ?? ?? ? if($ctag->GetAtt('notshowall')=='1') continue;
    ? ?? ?? ?? ?? ? $htmp = str_replace('~display~',$ctag->GetAtt('display'),$htmp);
    ? ?? ?? ?? ?}
    ? ?? ?? ?? ?else
    ? ?? ?? ?? ?{
    ? ?? ?? ?? ?? ? if($openitem==$ctag->GetAtt('item') || preg_match("#".$openitem.'_'."#", $ctag->GetAtt('item')) || $openitem=='-1')
    ? ?? ?? ?? ?? ?? ???$htmp = str_replace('~display~','block',$htmp);
    ? ?? ?? ?? ?? ? else
    ? ?? ?? ?? ?? ?? ???$htmp = str_replace('~display~','none',$htmp);
    ? ?? ?? ?? ?}

    ??首先,判断是不是“模块”或是$openitem不存在,若是其中之一,则再判断是不是“HTML更新”或“自动任务”,若是则,退出,回到第一次执行的代码,否则,把display替换掉。否则,若$openitem与$ctag->GetAtt('item')值相等,即,打开的是当前菜单,例如打开的是“核心”这块,就把显示方式显示为“block”也就是显示,否则,隐藏掉。若匹配类似1_成功或$openitem='-1'也要显示,总之这三个中其中有一个成立,就把display设为block即显示。

    ??通过以上执行代码,我们把$headTemplet里面的~cc~、~display~、~channelname~全部替换掉了。从上面源码分析来看,其实,代码的执行的过程就是替换的过程。

    ??6.代码执行到$dtp2->LoadSource($ctag->InnerText);这行,这代码是获取中间的内容,即多个。言外之意就是接下来要遍历标记了。
    游客,如果您要查看本帖隐藏内容请回复

0

主题

2

帖子

21

积分

vip用户

Rank: 5Rank: 5

金币
0
贡献
19
沙发
发表于 2018-11-9 18:46:34 | 只看该作者
很想继续看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|ag游戏客服|官方二次开发

GMT+8, 2019-11-13 19:56 , Processed in 0.681463 second(s), 22 queries .

Powered by Discuz! X3.2

? 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表