Disucz直接读取数据库获取帖子高亮属性怎么办?

2014-11-03 16:12 栏目:技术开发 查看(14474)

思考着不应用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

列出了上面十来种结果,我已经感觉太费时间了,但我似乎发现了什么,可能就是十进制转化成二进制的,但发现怎么也不对,因为颜色是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(实际上这个时候是蓝色、加粗的高亮形式,也就是没有倾斜没有下划线),运行后的结果就是
222

有了这个我们就可以写出一个关于帖子高亮方法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小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

转载请注明出处:Disucz直接读取数据库获取帖子高亮属性怎么办? - 微构网络
分享: