分类 代码分析 下的文章

重温一遍Discuz插件机制

这周开发QQ互联一个相关插件,又整个复习了一遍Discuz插件机制。
话说当年进康盛就是因为会写几个插件,当然还得感谢某人的引进。
这久没碰到插件,基本上忘的差不多了,看着别人的插件,参考这Discuz文档又复习了一遍。

通过这次复习,关于互联插件的分享实现方式也搞清楚了,之前一直有块疑问,哈哈。

QQ互联的分享:
点击帖子页的空间分享按钮,这里以Discuz官方为例说明。
链接地址为:

http://www.discuz.net/home.php?mod=spacecp&ac=plugin&id=qqconnect:spacecp&pluginop=share&sh_type=1&thread_id=帖子ID&后面参数省去

可以看到这里是通过家园的插件机制实现的,这里进入到下面的文件看家园的插件机制。
source\include\spacecp\spacecp_plugin.php

include pluginmodule($_G['gp_id'], $pluginkey);

pluginmodule函数在function_core.php文件定义,引入插件的PHP执行文件。

这里一直有个疑问,插件的模板是如何引入的呢?不要急,下面看spacecp_plugin.php自己的模板。
template\default\home\spacecp_plugin.htm


熟悉吧,这里就是引入插件的模板文件。

QQ互联的遗留问题是没在插件的PHP执行文件里找到输出,仅是定义code和message,但是前台提交分享后却出现了相应的提示,这里一直没搞明白。
最后看到插件的模板文件就一目了然了。
source\plugin\qqconnect\template\spacecp.htm




这次复习还是有收获的~

从数据库里导数据到文件的另一种方式

今天从数据库导数据,一般的方法就是用sql命令直接outfile到文件里,类似下面的命令:

select uid from cdb_members where uid > 10 into outfile "/data/1.log"

参考:http://www.taobaodba.com/html/558_loaddata.html

在mysql下执行类似上面的命令,提示没有权限建立文件。
杯具的,没办法,只好写脚本批量查询导出了。

后来,同事给了另外一种导出的方法:
进入服务器,执行类似下面的命令:

mysql -uroot -p -N 库名 -e 'select uid from cdb_members where uid > 10;' > /data/1.log

脚本跑完估计要半个小时,这个命令两分钟搞定。

通过array_merge函数重建数组索引

PHP文档里给出的定义和用法:

array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。

如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

我们可以通过array_merge函数快速的对数字索引的数组进行重建索引。

例子:

$a = array('2' => 3, '3' => 4);
print_r(array_merge($a));

输出:

Array ( [0] => 3 [1] => 4 )

修改Discuz的微博来源

Discuz新版本中增加了分享到微博的功能,分享到微博的时候可以设置自己的来源字段。

目前带有分享功能的Discuz版本一共有两类:

一种是Discuz! X2版本的云平台版,里面集成了QQ互联功能,带有分享到微博、Qzone和朋友社区的功能。
另外一种是QQ互联插件版的Discuz,主要是Discuz! X1.5和Discuz! 7.2两个版本。

修改前需要有AppKey,什么是AppKey呢?

这个可以在open.t.qq.com下的我的应用里查看你自己的应用,前提需要你自己申请一个应用,如图里的AppKey就是后面我们要用到的KEY。

下面针对不同的版本给出不同的修改方法:

1.针对于Discuz! X2云平台版:

进入站点后台->云平台->QQ互联下,点击开启Q-Share功能下的是,然后在腾讯微博开放平台AppKey里填写你申请的AppKey,如图。

2.针对于1.5插件版本:

找到source\plugin\qqconnect\connect.class.php文件
搜索代码

$_G['connect']['weibo_public_appkey'] = 'ce7fb946290e4109bdc9175108b6db3a';

将ce7fb946290e4109bdc9175108b6db3a改为你在腾讯微博开放平台(http://open.t.qq.com)下申请到的APPKEY。

3.针对于7.2插件版本:

找到plugins\qqconnect\connect.class.php文件
搜索代码

$connect_setting['weibo_public_appkey'] = 'ce7fb946290e4109bdc9175108b6db3a';

将ce7fb946290e4109bdc9175108b6db3a改为你在腾讯微博开放平台(http://open.t.qq.com)下申请到的APPKEY。

一个js的怪异问题排查经过

最近不知道怎么了,老是碰到各种怪异问题,查起来费半天劲,最后查出来其实不是代码的问题,囧...

今天又碰到个js的怪异问题,特地记录以免以后再走弯路。

页面的代码如下:


	

这段代码是Discuz!7.0的悬浮广告和对联广告的代码。
页面输出后的源码为:

在chrome的开发者工具下看到有如下的报错:

Uncaught ReferenceError: theFloaters is not defined

theFloaters这个是在include/js/floatadv.js文件里定义的,前面明明已经引入了此文件,怎么出现未定义这样的报错呢?
跟模板文件的代码比对后,发现在引入floatadv.js文件的js后面多了一段style样式代码,如下:

style="display: none; visibility: hidden; "

查过代码发现没有地方会有增加这段style的地方,而且在chrome开发者工具的script标签下居然也找不到floatadv.js这个文件,但是网络标签下明明加载了这个文件。

查了半天,突然想起来会不会是广告过滤扩展搞的鬼,因为这个js的文件名里带有ad。
禁用掉ABP扩展后再试,悬浮和对联广告全出来了,也没有了之前的报错。
内牛满面啊,扩展你丫太强大了也!!