2024国产成人精品免费视频|日本免费一区二区三区毛片|久久97超碰色中文字幕|亚洲天堂a中文字幕

Disucz直接讀取數(shù)據(jù)庫獲取帖子高亮屬性怎么辦?

2014-11-03 16:12 欄目:技術開發(fā) 查看(15786)

思考著不應用Discuz的框架而去直接讀取數(shù)據(jù)庫的方式來實現(xiàn)小米論壇的風格,可能會讓一部分為難的問題就是怎么去獲取高亮的屬性。大家也許會認為這不是什么問題,因為咱們可以像獲取其他諸如精華、是否被加分等屬性一樣直接獲取,而實際上DZ在這個地方使用了比較巧妙的方式去實現(xiàn),正式這個巧妙,給我們帶來了一些小小的問題。

使用過DZ或者開發(fā)過DZ的同學都知道,DZ主題高亮有幾個屬性,顏色、背景色、是否加粗、是否傾斜、是否加下劃線。如果初級的開發(fā)者為這5個小屬性設計數(shù)據(jù)庫的話,肯定是設計出5個字段來。而DZ卻不是,它巧妙地用兩個字段來解決問題,一個是存儲背景顏色的色值,另外一個則是存儲另外的四個小屬性,這樣就大大提高了數(shù)據(jù)庫的性能。

通過分析DZ的數(shù)據(jù)庫詞典可以知道上面說到的兩個字段就是pre_forum_thread主題表中的bgcolor和highlight。這時候可以操作某個帖子的高亮屬性,然后觀察數(shù)據(jù)表中這兩個字段的變化,bgcolor會變成形如#FFFFFF的顏色值,而highlight則是0-70多的一個具體的數(shù)字。那么這個時候怎么去處理呢,當然主要時候hightlight字段的處理。

怎么去發(fā)現(xiàn)規(guī)律,如果是最笨的方法就是直接去試那么看來你今天一天就差不多了,因為有10*2*2*2=80種結果,為什么是80?我想大家都學過排列組合吧,顏色有10種可能,另外的三個每個有兩種可能,即加或者不加。而且我還真的是去這樣做了,當然后面放棄了,開始以為分析兩下就知道徹底的結果。

122

列出了上面十來種結果,我已經感覺太費時間了,但我似乎發(fā)現(xiàn)了什么,可能就是十進制轉化成二進制的,但發(fā)現(xiàn)怎么也不對,因為顏色是10種情況(一個不選顏色,另外還有9種顏色),其他的我們用二進制來可以表示,0表示否,1表示是,這點大家經常用。而且因為我是DZ的開發(fā)者,去了Discuz開發(fā)者群里咨詢了一些,結果還真是十進制轉化成二進制。但是肯定不止是這么簡單的。

而這樣試解決問題就需要分析DZ自己是怎么做的,分析DZ的源代碼。于是我開始尋找DZ在哪個地方處理高亮這個小模塊的,結果很快被我分析加查找找到了。該函數(shù)位于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]);

這兩句話大家應該看得懂吧,第一個就相當于把數(shù)據(jù)初始為有效數(shù)字為2位數(shù)的十進制,第二句則是把其中的前面那個變量的十位數(shù)變成有效位數(shù)為3的二進制數(shù)字了。再看后面的代碼就可以得出結論了:
把highlight的字段的個位數(shù)0-9作為是否有顏色的標示,0標示沒有顏色,1-9分別標示9中顏色,而十位數(shù)轉化成二進制后就是3位數(shù)字了,每一位依次代表是否加粗、是否傾斜、是否加下劃線。

$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代表不是";

上面是我們隨便賦給字段一個具體的數(shù)值46(實際上這個時候是藍色、加粗的高亮形式,也就是沒有傾斜沒有下劃線),運行后的結果就是
222

有了這個我們就可以寫出一個關于帖子高亮方法highlight()來了,當然下面的$gaoliang和$titlebg就是我們從數(shù)據(jù)庫里面去取出來的數(shù)據(jù)了,同時在這個方法里我們把帖子的標題背景一起給寫進去了。

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;
}

里面涉及的東西比較多,比如讀取數(shù)據(jù)、數(shù)據(jù)轉化、數(shù)組、if語句、三目運算。而這里面最最關鍵的就是其中的用一個字段做四個選項的標示了,這里非常巧妙,當然是二進制的功勞。
最后就給大家溫習下進制轉化sprintf的使用吧。
語法

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

format 必需。轉換格式。
arg1 必需。規(guī)定插到 format 字符串中第一個 % 符號處的參數(shù)。
arg2 可選。規(guī)定插到 format 字符串中第二個 % 符號處的參數(shù)。
arg++ 可選。規(guī)定插到 format 字符串中第三、四等等 % 符號處的參數(shù)。

使用說明

%% – 返回百分比符號
%b – 二進制數(shù)
%c – 依照 ASCII 值的字符
%d – 帶符號十進制數(shù)
%e – 可續(xù)計數(shù)法(比如 1.5e+3)
%u – 無符號十進制數(shù)
%f – 浮點數(shù)(local settings aware)
%F – 浮點數(shù)(not local settings aware)
%o – 八進制數(shù)
%s – 字符串
%x – 十六進制數(shù)(小寫字母)
%X – 十六進制數(shù)(大寫字母)

與我們的項目經理聯(lián)系
掃二維碼與項目經理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流

轉載請注明出處:Disucz直接讀取數(shù)據(jù)庫獲取帖子高亮屬性怎么辦? - 微構網絡
分享:
宁明县| 驻马店市| 东方市| 怀安县| 张北县| 永嘉县| 莆田市| 黄大仙区| 三门峡市| 临湘市| 葵青区| 武功县| 晋江市| 肃南| 镇江市| 墨脱县| 高雄市| 常熟市| 新安县| 德格县| 西宁市| 琼结县| 长寿区| 南部县| 城口县| 茌平县| 大邑县| 安远县| 崇阳县| 鹰潭市| 玉屏| 噶尔县| 汤阴县| 汤原县| 三都| 遵义市| 睢宁县| 同德县| 桐城市| 凯里市| 塘沽区|