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

Discuz門戶文章8個標簽屬性的數據庫存儲分析及使用

2015-11-29 16:34 欄目:技術開發(fā) 查看(16960)

Discuz不用多說,大家應該很多人都了解,國內知名社區(qū)論壇程序,為騰訊旗下康盛公司開發(fā)(被騰訊收購的),已經有十多年的發(fā)展,確實是一款優(yōu)秀的產品。雖然它的主要賣點是論壇功能,但同時還有sns功能、門戶功能。

隨著很多中小企業(yè)也開始做互聯(lián)網,也想著用自己的東西來做一個自己客戶的互動平臺,因此現在他們有很多使用Discuz的機會,而很多甚至就還利用門戶功能,搭建自己所屬行業(yè)的細分門戶網站。而這里我們要講的就是跟門戶模塊有關的一個細節(jié)——Discuz門戶文章8個標簽屬性的數據庫存儲分析。

用過Discuz門戶功能的人也知道,一篇文章有8個標簽,分別是原創(chuàng)、熱點、組圖 、爆料、 頭條、幻燈、滾動、推薦。那么當我們進行二次開發(fā)的時候,如果要利用這8個標簽進行篩選文章的時候該怎么辦呢?這個時候我們就得先知道這幾個標簽是怎么被保存的。比如下面是我們項目中的實例:可以通過標簽來篩選數據,同時在每個文章下面顯示他所屬的標簽。

444

通過查閱數據詞典我們發(fā)現,這8個標簽在文章表中只有一個字段,也就是一個字段保存了標簽的信息,首先我們來看下DZ的數據詞典的這部分:

4344

那么這一個字段是怎么保存這8個標簽信息的,我們可以聯(lián)想到論壇帖子的高亮屬性,也同樣的是多個屬性保存在一個字段中,那是通過進制轉化來的;那么這又是什么呢?我們查看這些字段的值,也許能發(fā)現一些規(guī)律,但要我們得出一個規(guī)則那實在太難了。于是我們還是去分析源代碼來倒推吧。

我們可以在source/function/function_portalcp.php中找到兩個方法?article_parse_tags和article_make_tag:

function article_parse_tags($tag) {
	$tag = intval($tag);
	$article_tags = array();
	for($i=1; $i<=8; $i++) {
		$k = pow(2, $i-1);
		$article_tags[$i] = ($tag & $k) ? 1 : 0;
	}
	return $article_tags;
}

function article_make_tag($tags) {
	$tags = (array)$tags;
	$tag = 0;
	for($i=1; $i<=8; $i++) {
		if(!empty($tags[$i])) {
			$tag += pow(2, $i-1);
		}
	}
	return $tag;
}

其實這兩個可以理解為一組方法,前者是把數據庫讀取到值傳送進去,依次判斷,然后得到返回一個數組,而這個數組就有八個鍵值,每個鍵值即代表一個標簽屬性。而下面一個方法就是把編寫文章的時候表單的值傳送給這個方法,然后依次執(zhí)行,進行2的n次方累加,得到一個十進制的值然后返回$tag,這個$tag的值最終就是保存在數據庫中的。

其實以上實際上可以完成我上面提到那個例子的一部分,也就是通過取得的值然后把對應的標簽顯示在文章下面,當然上面的第二個方法實際上為了解釋整個原理附帶來的。那么還有一部分,也就是怎么通過標簽來篩選呢?

這個時候我們可以參考Discuz的源代碼中source/class/block/portal/block_article.php中的block_article類,這個大概就是我們進行門戶文章DIY調用的一個類,我們可以知道在DIY調用中我們是可以通過標簽來進行數據過濾的,那么里面就一定有現成的方法來做到這點了。在里面有這么一段代碼:

if(is_array($tag)) {
	$article_tags = array();
	foreach($tag as $k) {
		$article_tags[$k] = 1;
	}
	include_once libfile('function/portalcp');
	$v=article_make_tag($article_tags);
	if($v > 0) {
		$wheres[] = "(at.tag & $v) = $v";
	}
}

上面的參數$tag就是我們要篩選的目標標簽數組,比如里面同樣是八個鍵,每個鍵值可能為0或1(也就是勾選了或者沒有勾選),然后一次判斷,得到SQL查詢語句中where條件約束的數組$where,這樣就實現了對數據的篩選或者說過濾。以上就是我們查看Discuz源代碼獲取的一些信息,也就是我們知道了其中的原理,其實大概就是用2的n次方,然后&位運算來進行判斷(PHP文檔)。

============================華麗的分割線============================

好了,上面進擺出了幾段代碼實際上已經闡述了原理,那么我們以一個實際的例子來說明。比如說一篇文章已經選中了原創(chuàng)和推薦兩個標簽,也就是第一個和最后一個:

353

也就是這個對應的article_make_tag方法中

$tags=array(0=>1,1=>0,2=>0,3=>0,4=>0,5=>0,6=>0,7=>1);

通過該方法返回的值$tag=2^(1-1)+2^(8-1)=2^0+2^7+1+128=129,我們可以在數據庫中查看portal_article_title表中的tag字段的值是129。

再比如我們通過查詢到的129這個值傳入article_parse_tags作為參數可以返回$article_tags

$article_tags=array(0=>1,1=>0,2=>0,3=>0,4=>0,5=>0,6=>0,7=>1);

反過來就是我們最開始提到例子中需要做的,也就是說已經知道了某個篩選條件,比如說是要原創(chuàng)的,那么對應的數組會是

$tag=array(0=>1,1=>0,2=>0,3=>0,4=>0,5=>0,6=>0,7=>0);

同樣的我們可以得到相應的約束條件。

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

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

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

轉載請注明出處:Discuz門戶文章8個標簽屬性的數據庫存儲分析及使用 - 微構網絡
分享:
正安县| 北票市| 吉木萨尔县| 梨树县| 垣曲县| 方正县| 晴隆县| 德化县| 峨眉山市| 安乡县| 宝坻区| 茂名市| 大埔县| 丰都县| 哈巴河县| 若羌县| 象山县| 陇川县| 二连浩特市| 德昌县| 新乡县| 鹤峰县| 高青县| 柘城县| 舒城县| 孝义市| 清水县| 揭阳市| 阳春市| 阜阳市| 西贡区| 桃江县| 正蓝旗| 阿瓦提县| 福泉市| 安岳县| 鸡西市| 福贡县| 无锡市| 罗定市| 广元市|