掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
思考著不應(yīng)用Discuz的框架而去直接讀取數(shù)據(jù)庫(kù)的方式來(lái)實(shí)現(xiàn)小米論壇的風(fēng)格,可能會(huì)讓一部分為難的問(wèn)題就是怎么去獲取高亮的屬性。大家也許會(huì)認(rèn)為這不是什么問(wèn)題,因?yàn)樵蹅兛梢韵瘾@取其他諸如精華、是否被加分等屬性一樣直接獲取,而實(shí)際上DZ在這個(gè)地方使用了比較巧妙的方式去實(shí)現(xiàn),正式這個(gè)巧妙,給我們帶來(lái)了一些小小的問(wèn)題。
使用過(guò)DZ或者開(kāi)發(fā)過(guò)DZ的同學(xué)都知道,DZ主題高亮有幾個(gè)屬性,顏色、背景色、是否加粗、是否傾斜、是否加下劃線(xiàn)。如果初級(jí)的開(kāi)發(fā)者為這5個(gè)小屬性設(shè)計(jì)數(shù)據(jù)庫(kù)的話(huà),肯定是設(shè)計(jì)出5個(gè)字段來(lái)。而DZ卻不是,它巧妙地用兩個(gè)字段來(lái)解決問(wèn)題,一個(gè)是存儲(chǔ)背景顏色的色值,另外一個(gè)則是存儲(chǔ)另外的四個(gè)小屬性,這樣就大大提高了數(shù)據(jù)庫(kù)的性能。
通過(guò)分析DZ的數(shù)據(jù)庫(kù)詞典可以知道上面說(shuō)到的兩個(gè)字段就是pre_forum_thread主題表中的bgcolor和highlight。這時(shí)候可以操作某個(gè)帖子的高亮屬性,然后觀(guān)察數(shù)據(jù)表中這兩個(gè)字段的變化,bgcolor會(huì)變成形如#FFFFFF的顏色值,而highlight則是0-70多的一個(gè)具體的數(shù)字。那么這個(gè)時(shí)候怎么去處理呢,當(dāng)然主要時(shí)候hightlight字段的處理。
怎么去發(fā)現(xiàn)規(guī)律,如果是最笨的方法就是直接去試那么看來(lái)你今天一天就差不多了,因?yàn)橛?0*2*2*2=80種結(jié)果,為什么是80?我想大家都學(xué)過(guò)排列組合吧,顏色有10種可能,另外的三個(gè)每個(gè)有兩種可能,即加或者不加。而且我還真的是去這樣做了,當(dāng)然后面放棄了,開(kāi)始以為分析兩下就知道徹底的結(jié)果。
列出了上面十來(lái)種結(jié)果,我已經(jīng)感覺(jué)太費(fèi)時(shí)間了,但我似乎發(fā)現(xiàn)了什么,可能就是十進(jìn)制轉(zhuǎn)化成二進(jìn)制的,但發(fā)現(xiàn)怎么也不對(duì),因?yàn)轭伾?0種情況(一個(gè)不選顏色,另外還有9種顏色),其他的我們用二進(jìn)制來(lái)可以表示,0表示否,1表示是,這點(diǎn)大家經(jīng)常用。而且因?yàn)槲沂荄Z的開(kāi)發(fā)者,去了Discuz開(kāi)發(fā)者群里咨詢(xún)了一些,結(jié)果還真是十進(jìn)制轉(zhuǎn)化成二進(jìn)制。但是肯定不止是這么簡(jiǎn)單的。
而這樣試解決問(wèn)題就需要分析DZ自己是怎么做的,分析DZ的源代碼。于是我開(kāi)始尋找DZ在哪個(gè)地方處理高亮這個(gè)小模塊的,結(jié)果很快被我分析加查找找到了。該函數(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'] = ''; }
其中關(guān)鍵的就是在于下面的兩行,
$string = sprintf('%02d', $thread['highlight']); $stylestr = sprintf('%03b', $string[0]);
這兩句話(huà)大家應(yīng)該看得懂吧,第一個(gè)就相當(dāng)于把數(shù)據(jù)初始為有效數(shù)字為2位數(shù)的十進(jìn)制,第二句則是把其中的前面那個(gè)變量的十位數(shù)變成有效位數(shù)為3的二進(jìn)制數(shù)字了。再看后面的代碼就可以得出結(jié)論了:
把highlight的字段的個(gè)位數(shù)0-9作為是否有顏色的標(biāo)示,0標(biāo)示沒(méi)有顏色,1-9分別標(biāo)示9中顏色,而十位數(shù)轉(zhuǎn)化成二進(jìn)制后就是3位數(shù)字了,每一位依次代表是否加粗、是否傾斜、是否加下劃線(xiàn)。
$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?'是否下劃線(xiàn):'.$stylestr[2]."<hr>"; echo?'顏色:'.$string[1]."<hr>"; echo?"1代表是,0代表不是";
上面是我們隨便賦給字段一個(gè)具體的數(shù)值46(實(shí)際上這個(gè)時(shí)候是藍(lán)色、加粗的高亮形式,也就是沒(méi)有傾斜沒(méi)有下劃線(xiàn)),運(yùn)行后的結(jié)果就是
有了這個(gè)我們就可以寫(xiě)出一個(gè)關(guān)于帖子高亮方法highlight()來(lái)了,當(dāng)然下面的$gaoliang和$titlebg就是我們從數(shù)據(jù)庫(kù)里面去取出來(lái)的數(shù)據(jù)了,同時(shí)在這個(gè)方法里我們把帖子的標(biāo)題背景一起給寫(xiě)進(jìn)去了。
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ù)轉(zhuǎn)化、數(shù)組、if語(yǔ)句、三目運(yùn)算。而這里面最最關(guān)鍵的就是其中的用一個(gè)字段做四個(gè)選項(xiàng)的標(biāo)示了,這里非常巧妙,當(dāng)然是二進(jìn)制的功勞。
最后就給大家溫習(xí)下進(jìn)制轉(zhuǎn)化sprintf的使用吧。
語(yǔ)法
sprintf(format,arg1,arg2,arg++)
format 必需。轉(zhuǎn)換格式。
arg1 必需。規(guī)定插到 format 字符串中第一個(gè) % 符號(hào)處的參數(shù)。
arg2 可選。規(guī)定插到 format 字符串中第二個(gè) % 符號(hào)處的參數(shù)。
arg++ 可選。規(guī)定插到 format 字符串中第三、四等等 % 符號(hào)處的參數(shù)。
使用說(shuō)明
%% – 返回百分比符號(hào)
%b – 二進(jìn)制數(shù)
%c – 依照 ASCII 值的字符
%d – 帶符號(hào)十進(jìn)制數(shù)
%e – 可續(xù)計(jì)數(shù)法(比如 1.5e+3)
%u – 無(wú)符號(hào)十進(jìn)制數(shù)
%f – 浮點(diǎn)數(shù)(local settings aware)
%F – 浮點(diǎn)數(shù)(not local settings aware)
%o – 八進(jìn)制數(shù)
%s – 字符串
%x – 十六進(jìn)制數(shù)(小寫(xiě)字母)
%X – 十六進(jìn)制數(shù)(大寫(xiě)字母)
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流