扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
思考着不应用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种可能,另外的三个每个有两种可能,即加或者不加。而且我还真的是去这样做了,当然后面放弃了,开始以为分析两下就知道彻底的结果。
列出了上面十来种结果,我已经感觉太费时间了,但我似乎发现了什么,可能就是十进制转化成二进制的,但发现怎么也不对,因为颜色是10种情况(一个不选颜色,另外还有9种颜色),其他的我们用二进制来可以表示,0表示否,1表示是,这点大家经常用。而且因为我是DZ的开发者,去了Discuz开发者群里咨询了一些,结果还真是十进制转化成二进制。但是肯定不止是这么简单的。
而这样试解决问题就需要分析DZ自己是怎么做的,分析DZ的源代码。于是我开始寻找DZ在哪个地方处理高亮这个小模块的,结果很快被我分析加查找找到了。该函数位于source/function/function_forunlist.php中,核心代码部分
$_G['forum_colorarray'] = array('', '#EE1B2E', '#EE5023', '#996600', '#3C9D40', '#2897C5', '#2B65B7', '#8F2A90', '#EC1282'); foreach($recommendlist as $thread) { if($thread['highlight']) { $string = sprintf('%02d', $thread['highlight']); $stylestr = sprintf('%03b', $string[0]); $thread['highlight'] = ' style="'; $thread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : ''; $thread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : ''; $thread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : ''; $thread['highlight'] .= $string[1] ? 'color: '.$_G['forum_colorarray'][$string[1]] : ''; $thread['highlight'] .= '"'; } else { $thread['highlight'] = ''; }
其中关键的就是在于下面的两行,
$string = sprintf('%02d', $thread['highlight']); $stylestr = sprintf('%03b', $string[0]);
这两句话大家应该看得懂吧,第一个就相当于把数据初始为有效数字为2位数的十进制,第二句则是把其中的前面那个变量的十位数变成有效位数为3的二进制数字了。再看后面的代码就可以得出结论了:
把highlight的字段的个位数0-9作为是否有颜色的标示,0标示没有颜色,1-9分别标示9中颜色,而十位数转化成二进制后就是3位数字了,每一位依次代表是否加粗、是否倾斜、是否加下划线。
$thread['highlight']=46; $string = sprintf('%02d', $thread['highlight']); echo $string."<hr>"; $stylestr = sprintf('%03b', $string[0]); echo '是否加粗:'.$stylestr[0]."<hr>"; echo '是否倾斜:'.$stylestr[1]."<hr>"; echo '是否下划线:'.$stylestr[2]."<hr>"; echo '颜色:'.$string[1]."<hr>"; echo "1代表是,0代表不是";
上面是我们随便赋给字段一个具体的数值46(实际上这个时候是蓝色、加粗的高亮形式,也就是没有倾斜没有下划线),运行后的结果就是
有了这个我们就可以写出一个关于帖子高亮方法highlight()来了,当然下面的$gaoliang和$titlebg就是我们从数据库里面去取出来的数据了,同时在这个方法里我们把帖子的标题背景一起给写进去了。
function highlight(){ global $gaoliang,$titlebg; $_G['forum_colorarray'] = array('', '#EE1B2E', '#EE5023', '#996600', '#3C9D40', '#2897C5', '#2B65B7', '#8F2A90', '#EC1282'); if($gaoliang) { $string = sprintf('%02d', $gaoliang); $stylestr = sprintf('%03b', $string[0]); $highlight = ' style="'; $highlight .= $stylestr[0] ? 'font-weight: bold;' : ''; $highlight .= $stylestr[1] ? 'font-style: italic;' : ''; $highlight .= $stylestr[2] ? 'text-decoration: underline;' : ''; $highlight .= $titlebg ? 'background:'.$titlebg.';' : '';//添加背景颜色 $highlight .= $string[1] ? 'color: '.$_G['forum_colorarray'][$string[1]] : ''; $highlight .= '"'; } else { $highlight = ''; } echo $highlight; }
里面涉及的东西比较多,比如读取数据、数据转化、数组、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 – 十六进制数(大写字母)
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流