Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

X2如何判断当前页面的动作

[复制链接]
xooass 发表于 2011-3-14 10:09:26 | 显示全部楼层 |阅读模式
*************************************************
** 本教程基于版本:Discuz! X 2.0                                         **
*************************************************



在制作插件,或者想自己修改一些功能的时候,经常会遇到一个情况,就是需要获取到当前页面在进行一个什么动作,比如是在看帖,还是在看主题列表,或者是在搜索,还是在后台操作。然后根据相关动作进行判断执行什么代码,比如在后台操作,就自动记录一些相关LOG,或者搜索的时候,把数据库切换到从库去。


X2在每个页面都做了标记,很好的解决了这个问题。

随便打开一个文件,就能看到类似
  1. define('CURSCRIPT', 'forum');
复制代码

或者

  1. define('CURSCRIPT', 'admin');
复制代码

这样的语句,这就是入口文件标记。

通过判断入口文件标记,能实现判断现在在论坛还是家园,门户,群组,后台管理,杂项等。

下面是入口文件标记列表:

列表整理中....

通过判断入口文件标记,已经能知道当前是在哪个大类下操作了。还可以通过判断当前模块,来实现更详细的判断,比如详细到看帖,还是在列表页。

下面是模块标记列表:

列表整理中...

知道了怎么判断当前页面动作后,可以灵活的通过这个小技巧来自定义一些功能。下面是一个例子:

X2有读写分离功能,但是只要设置了读写分离,所有的读取操作都到从库去了。希望能灵活控制查询从库的动作。

在source/class/class_mysql_slave.php 文件下  有个 function query函数,可以在里面添加各种判断进行控制。

例如
  1. if($this->slaveid && !$this->slaveexcept && strtoupper(substr($sql, 0 , 6)) == 'SELECT' && in_array(CURSCRIPT, array('search','misc','admin'))) {
复制代码



那么就是只有“搜索”“统计和排行榜”“管理后台”  才会进行读取从库,其他操作还是在主库上进行。

再例如
  1. if($this->slaveid && !$this->slaveexcept && strtoupper(substr($sql, 0 , 6)) == 'SELECT' && in_array(CURSCRIPT, array('forum')) && in_array(CURMODULE, array('forumdisplay', 'viewthread'))) {
复制代码


那么就是只有论坛的“列表页”“看帖页”才会读取从库,其他的操作全部还是读取主库的。

这只是其中一个灵活运用的例子,更多的还要根据自己的需要来进行修改,有了这些详细的标记,那么判断起来就随心应手了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-16 16:01 , Processed in 0.023626 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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