相關帖子功能分析
功能開啓位置:
後台-> 界面-> 界面設置-> 帖子內容頁下,設置相關帖子條目數,0 為不顯示。

功能分析:
在 source/module/forum/forum_viewthread.php 文件,537 行附近可以找到如下代碼

  1. if($post['tags']) {
  2.                                 $post['relateitem'] = getrelateitem($post['tags'], $post['tid']);
  3.                         }

 

此段代碼為如果該帖子存在 tag($post['tags']),則執行 getrelateitem($post['tags'], $post['tid']) 操作 (獲取相關帖子) 。

在 1099 行附近找到 getrelateitem 函數,代碼如下

  1. function getrelateitem($tagarray, $tid = 0, $type = 'tid') {
  2.         global $_G;
  3.         $tagidarray = $relatearray = $relateitem = array();
  4.         $limit = $_G['setting']['relatenum'];
  5.         $limitsum = 2 * $limit;
  6.         if(!$limit) {
  7.                 return '';
  8.         }
  9.         foreach($tagarray as $var) {
  10.                 $tagidarray[] = $var['0'];
  11.         }
  12.         if(!$tagidarray) {
  13.                 return '';
  14.         }
  15.         $query = DB::query("SELECT itemid FROM
    ".DB::table('common_tagitem')." WHERE tagid IN
    (".dimplode($tagidarray).") AND idtype='$type' LIMIT $limitsum");
  16.         $i = 1;
  17.         while($result = DB::fetch($query)) {
  18.                 if($result['itemid'] != $tid) {
  19.                         if($i > $limit) {
  20.                                 break;
  21.                         }
  22.                         if($relatearray[$result[itemid]] == '') {
  23.                                 $i++;
  24.                         }
  25.                         if($result['itemid']) {
  26.                                 $relatearray[$result[itemid]] = $result['itemid'];
  27.                         }
  28.                 }
  29.         }
  30.         if(!empty($relatearray)) {
  31.                 $query = DB::query("SELECT tid,subject FROM
    ".DB::table('forum_thread')." WHERE tid IN
    (".dimplode($relatearray).")");
  32.                 while($result = DB::fetch($query)) {
  33.                         $relateitem[] = $result;
  34.                 }
  35.         }
  36.         return $relateitem;
  37. }

下面分段進行分析

  1. $limit = $_G['setting']['relatenum'];
  2.         $limitsum = 2 * $limit;
  3.         if(!$limit) {
  4.                 return '';
  5.         }

$_G['setting']['relatenum'] 就是後台設置的相關帖子條目數,即帖子開頭提到的設置。
$limitsum 為後面要執行的 sql 查詢的數量。
如果不存在 $limit 則直接返回空,即沒有設置相關帖子條目數或者相關帖子條目數為 0 則直接返回空,不顯示相關帖子。

  1. foreach($tagarray as $var) {
  2.                 $tagidarray[] = $var['0'];
  3.         }
  4.         if(!$tagidarray) {
  5.                 return '';
  6.         }

$tagarray 為該帖子的 tag 數組。
$tagidarray 為存放該帖子 tag 的 id 的數組。
如果當前帖子不存在 tag($tagidarray) 則直接返回空,即如果帖子不存在 tag 則不顯示相關帖子。

  1. $query
    = DB::query("SELECT itemid FROM ".DB::table('common_tagitem')." WHERE
    tagid IN (".dimplode($tagidarray).") AND idtype='$type' LIMIT
    $limitsum");

在 tag 表 (common_tagitem) 中根據 tagid 和 idtype 查詢有同樣 tag 的帖子記錄。

  1. $i = 1;
  2.         while($result = DB::fetch($query)) {
  3.                 if($result['itemid'] != $tid) {
  4.                         if($i > $limit) {
  5.                                 break;
  6.                         }
  7.                         if($relatearray[$result[itemid]] == '') {
  8.                                 $i++;
  9.                         }
  10.                         if($result['itemid']) {
  11.                                 $relatearray[$result[itemid]] = $result['itemid'];
  12.                         }
  13.                 }
  14.         }

將查詢出的結果賦予 $relatearray 數組,此數組記錄的是該帖子的相關帖子的 tid 。

  1. if(!empty($relatearray)) {
  2.                 $query = DB::query("SELECT tid,subject FROM
    ".DB::table('forum_thread')." WHERE tid IN
    (".dimplode($relatearray).")");
  3.                 while($result = DB::fetch($query)) {
  4.                         $relateitem[] = $result;
  5.                 }
  6.         }

如果 $relatearray 不為空,那麼根據 $relatearray 中的 tid 在主題表 (forum_thread) 中查詢相應帖子記錄。
$relateitem 為記錄相關帖子的信息。

在 Discuz X 模板目錄下 template/default/forum/viewthread_node.htm 網頁模板文件,277 行附近,有如下代碼

  1. <!--{if $post['relateitem']}-->
  2.                         <div >
  3.                                 <h3 >{lang related_thread}</h3>
  4.                                 <ul >
  5.                                         <!--{loop $post['relateitem'] $var}-->
  6.                                         <li>&+#8226;
    <a href="forum.php?mod=viewthread&tid=$var%5Btid%5D"
    title="$var[subject]"
    target="_blank">$var[subject]</a></li>
  7.                                         <!--{/loop}-->
  8.                                 </ul>
  9.                         </div>
  10.                 <!--{/if}-->

此段為顯示相關帖子。其中的&+#8226; 中間是沒有+號的,因為直接寫為會解析成圓點,故做此處理,查詢時注意去掉。