请选择 进入手机版 | 继续访问电脑版

木泉论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 11610|回复: 0

[Discuz] 微构网络:详解Discuz会员认证信息的数据库保存及获取

[复制链接]
发表于 2014-11-17 11:17:06 | 显示全部楼层 |阅读模式

思考着不应用Discuz的框架而去直接读取数据库的方式来实现小米论坛的风格,可能会让一部分为难的问题就是怎么去获取高亮的属性。大家也许会认为这不是什么问题,因为咱们可以像获取其他诸如精华、是否被加分等属性一样直接获取,而实际上DZ在这个地方使用了比较巧妙的方式去实现,正式这个巧妙,给我们带来了一些小小的问题。


使用过DZ或者开发过DZ的同学都知道,DZ主题高亮有几个属性,颜色、背景色、是否加粗、是否倾斜、是否加下划线。如果初级的开发者为这5个小属性设计数据库的话,肯定是设计出5个字段来。而DZ却不是,它巧妙地用两个字段来解决问题,一个是存储背景颜色的色值,另外一个则是存储另外的四个小属性,这样就大大提高了数据库的性能。


通过分析DZ的数据库词典可以知道上面说到的两个字段就是pre_forum_thread主题表中的bgcolor和highlight。这时候可以操作某个帖子的高亮属性,然后观察数据表中这两个字段的变化,bgcolor会变成形如#FFFFFF的颜色值,而highlight则是0-70多的一个具体的数字。那么这个时候怎么去处理呢,当然主要时候hightlight字段的处理。


怎么去发现规律,如果是最笨的方法就是直接去试那么看来你今天一天就差不多了,因为有10*2*2*2=80种结果,为什么是80?我想大家都学过排列组合吧,颜色有10种可能,另外的三个每个有两种可能,即加或者不加。而且我还真的是去这样做了,当然后面放弃了,开始以为分析两下就知道彻底的结果。

122.jpg

列出了上面十来种结果,我已经感觉太费时间了,但我似乎发现了什么,可能就是十进制转化成二进制的,但发现怎么也不对,因为颜色是10种情况(一个不选颜色,另外还有9种颜色),其他的我们用二进制来可以表示,0表示否,1表示是,这点大家经常用。而且因为我是DZ的开发者,去了Discuz开发者群里咨询了一些,结果还真是十进制转化成二进制。但是肯定不止是这么简单的。

而这样试解决问题就需要分析DZ自己是怎么做的,分析DZ的源代码。于是我开始寻找DZ在哪个地方处理高亮这个小模块的,结果很快被我分析加查找找到了。该函数位于source/function/function_forunlist.php中,核心代码部分

  1. <span style="background-color: white;"><font color="#000000">$_G['forum_colorarray'] = array('', '#EE1B2E', '#EE5023', '#996600', '#3C9D40', '#2897C5', '#2B65B7', '#8F2A90', '#EC1282');
  2. foreach($recommendlist as $thread) {
  3. if($thread['highlight']) {
  4. $string = sprintf('%02d', $thread['highlight']);
  5. $stylestr = sprintf('%03b', $string[0]);
  6. $thread['highlight'] = ' style="';
  7. $thread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : '';
  8. $thread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : '';
  9. $thread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : '';
  10. $thread['highlight'] .= $string[1] ? 'color: '.$_G['forum_colorarray'][$string[1]] : '';
  11. $thread['highlight'] .= '"';
  12. } else {
  13. $thread['highlight'] = '';
  14. }</font></span>
复制代码

其中关键的就是在于下面的两行,


  1. $string = sprintf('%02d', $thread['highlight']);
  2. $stylestr = sprintf('%03b', $string[0]);
复制代码

这两句话大家应该看得懂吧,第一个就相当于把数据初始为有效数字为2位数的十进制,第二句则是把其中的前面那个变量的十位数变成有效位数为3的二进制数字了。再看后面的代码就可以得出结论了:
把highlight的字段的个位数0-9作为是否有颜色的标示,0标示没有颜色,1-9分别标示9中颜色,而十位数转化成二进制后就是3位数字了,每一位依次代表是否加粗、是否倾斜、是否加下划线。


  1. $thread['highlight']=46;
  2. $string = sprintf('%02d', $thread['highlight']);
  3. echo $string."
  4. ";
  5. $stylestr = sprintf('%03b', $string[0]);
  6. echo '是否加粗:'.$stylestr[0]."
  7. ";
  8. echo '是否倾斜:'.$stylestr[1]."
  9. ";
  10. echo '是否下划线:'.$stylestr[2]."
  11. ";
  12. echo '颜色:'.$string[1]."
  13. ";
  14. echo "1代表是,0代表不是";
复制代码

上面是我们随便赋给字段一个具体的数值46(实际上这个时候是蓝色、加粗的高亮形式,也就是没有倾斜没有下划线),运行后的结果就是
222.jpg
有了这个我们就可以写出一个关于帖子高亮方法highlight()来了,当然下面的$gaoliang和$titlebg就是我们从数据库里面去取出来的数据了,同时在这个方法里我们把帖子的标题背景一起给写进去了。


  1. <span style="background-color: white;"><font color="#000000">function highlight(){
  2. global $gaoliang,$titlebg;
  3. $_G['forum_colorarray'] = array('', '#EE1B2E', '#EE5023', '#996600', '#3C9D40', '#2897C5', '#2B65B7', '#8F2A90', '#EC1282');
  4. if($gaoliang) {
  5. $string = sprintf('%02d', $gaoliang);
  6. $stylestr = sprintf('%03b', $string[0]);
  7. $highlight = ' style="';
  8. $highlight .= $stylestr[0] ? 'font-weight: bold;' : '';
  9. $highlight .= $stylestr[1] ? 'font-style: italic;' : '';
  10. $highlight .= $stylestr[2] ? 'text-decoration: underline;' : '';
  11. $highlight .= $titlebg ? 'background:'.$titlebg.';' : '';//添加背景颜色
  12. $highlight .= $string[1] ? 'color: '.$_G['forum_colorarray'][$string[1]] : '';
  13. $highlight .= '"';
  14. } else {
  15. $highlight = '';
  16. }
  17. echo $highlight;
  18. }</font></span>
复制代码


里面涉及的东西比较多,比如读取数据、数据转化、数组、if语句、三目运算。而这里面最最关键的就是其中的用一个字段做四个选项的标示了,这里非常巧妙,当然是二进制的功劳。
最后就给大家温习下进制转化sprintf的使用吧。
语法


sprintf(format,arg1,arg2,arg++)



format 必需。转换格式。
arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
arg2 可选。规定插到 format 字符串中第二个 % 符号处的参数。
arg++ 可选。规定插到 format 字符串中第三、四等等 % 符号处的参数。

使用说明

%% – 返回百分比符号
%b – 二进制数
%c – 依照 ASCII 值的字符
%d – 带符号十进制数
%e – 可续计数法(比如 1.5e+3)
%u – 无符号十进制数
%f – 浮点数(local settings aware)
%F – 浮点数(not local settings aware)
%o – 八进制数
%s – 字符串
%x – 十六进制数(小写字母)
%X – 十六进制数(大写字母)


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

QQ|Archiver|手机版|小黑屋|木泉网 湘ICP备12004155号  

GMT+8, 2019-9-19 07:50 , Processed in 0.067278 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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