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

Disucz直接讀取數據庫獲取帖子高亮屬性怎么辦?

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

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

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

通過分析DZ的數據庫詞典可以知道上面說到的兩個字段就是pre_forum_thread主題表中的bgcolor和highlight。這時候可以操作某個帖子的高亮屬性,然后觀察數據表中這兩個字段的變化,bgcolor會變成形如#FFFFFF的顏色值,而highlight則是0-70多的一個具體的數字。那么這個時候怎么去處理呢,當然主要時候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在哪個地方處理高亮這個小模塊的,結果很快被我分析加查找找到了。該函數位于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 必需。規(guī)定插到 format 字符串中第一個 % 符號處的參數。
arg2 可選。規(guī)定插到 format 字符串中第二個 % 符號處的參數。
arg++ 可選。規(guī)定插到 format 字符串中第三、四等等 % 符號處的參數。

使用說明

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

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

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

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

轉載請注明出處:Disucz直接讀取數據庫獲取帖子高亮屬性怎么辦? - 微構網絡
分享:
鱼台县| 股票| 东海县| 志丹县| 南通市| 三都| 林口县| 永新县| 恩平市| 上高县| 晋城| 灵台县| 慈溪市| 炉霍县| 泽普县| 永和县| 新巴尔虎右旗| 彭山县| 黑山县| 武平县| 政和县| 剑阁县| 靖边县| 攀枝花市| 阜新市| 时尚| 元谋县| 色达县| 新野县| 上饶县| 大同县| 正蓝旗| 平昌县| 隆化县| 达日县| 新昌县| 汉川市| 屏东市| 泰和县| 清丰县| 台湾省|