Discuz!开发之主题高亮字段highlight解析

本文介绍Discuz!论坛系统中主题高亮字段(highlight)的设计与实现原理,该字段通过二进制编码高效地存储了主题的字体样式信息,包括字体颜色、背景颜色、加粗、斜体及下划线等属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Discuz!开发之主题高亮字段highlight解析

相关数据表pre_forum_thread,我们可以看到主题高亮信息存储于字段highlight,且为一个整型数据,那么discuz!如何将这个整型数解析为高亮(包括:字体颜色、背景颜色、加粗、下划线、斜体),我们可以参考一下discuz!的高亮设置和解析的代码逻辑:

一、设置高亮

\source\include\topicadmin\topicadmin_moderate.php

$highlight_style = $_GET['highlight_style'];
$highlight_color = $_GET['highlight_color'];
$highlight_bgcolor = $_GET['highlight_bgcolor'];
$expiration = checkexpiration($_GET['expirationhighlight'], $operation);
$stylebin = '';
for($i = 1; $i <= 3; $i++) {
	$stylebin .= empty($highlight_style[$i]) ? '0' : '1';
}
$highlight_style = bindec($stylebin);
if($highlight_style < 0 || $highlight_style > 7 || $highlight_color < 0 || $highlight_color > 8) {
	showmessage('parameters_error ');
}
$bgcolor = dhtmlspecialchars(preg_replace("/[^\[A-Za-z0-9#]/", '', $_GET['highlight_bgcolor']));


C::t('forum_thread')->update($tidsarr, array('highlight'=>$highlight_style.$highlight_color, 'moderated'=>1, 'bgcolor' => $bgcolor), true);
C::t('forum_forumrecommend')->update($tidsarr, array('highlight' => $highlight_style.$highlight_color));
C::t('forum_threadhidelog')->delete_by_tid($tidsarr);
Discuz!主题高亮有5个属性:颜色、背景色、是否加粗、是否倾斜、是否加下划线。

如果这5个属性设计数据库用5个字段的话,效率就太低了。而discuz!只用了两个字段bgcolor和highlight存储,一个是存储背景颜色的色值,另外一个则是存储另外的四个小属性,这样就大大提高了数据库的性能。

下面我们就来看看hightlight字段的解析:

二、解析高亮

\source\module\forum\forum_forumdisplay.php

相关代码

$_G['forum_colorarray'] = array('', '#EE1B2E', '#EE5023', '#996600', '#3C9D40', '#2897C5', '#2B65B7', '#8F2A90', '#EC1282');


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]].';' : '';//10进制数的第二位
	if($thread['bgcolor']) {
		$thread['highlight'] .= "background-color: $thread[bgcolor];";
	}
	$thread['highlight'] .= '"';
} else {
	$thread['highlight'] = '';
}

hightlight字段先转为10进制的两位数,十位数是:是否加粗、是否倾斜、是否加下划线三个信息,个位数是:0-9表示10中颜色(0为没有颜色),因此我们注意到hightlight字段有2*2*2*10=80种可能的值;

//解析举例
$thread['highlight']=77;
$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代表不是";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值