admin 发表于 2017-2-20 16:00:04

Discuz X相关帖子功能分析

相关帖子功能分析
功能开启位置:
后台->界面->界面设置->帖子内容页下,设置相关帖子条目数,0为不显示。功能分析:
在source/module/forum/forum_viewthread.php文件,537行附近可以找到如下代码if($post[‘tags’]) {
                              $post[‘relateitem’] = getrelateitem($post[‘tags’], $post[‘tid’]);
                        }此段代码为如果该帖子存在tag($post[‘tags’]),则执行getrelateitem($post[‘tags’], $post[‘tid’])操作(获取相关帖子)。在1099行附近找到getrelateitem函数,代码如下function getrelateitem($tagarray, $tid = 0, $type = ‘tid’) {
      global $_G;
      $tagidarray = $relatearray = $relateitem = array();
      $limit = $_G[‘setting’][‘relatenum’];
      $limitsum = 2 * $limit;
      if(!$limit) {
                return ”;
      }
      foreach($tagarray as $var) {
                $tagidarray[] = $var[‘0’];
      }
      if(!$tagidarray) {
                return ”;
      }
      $query = DB::query(“SELECT itemid FROM
“.DB::table(‘common_tagitem’).” WHERE tagid IN
(“.dimplode($tagidarray).”) AND idtype=’$type’ LIMIT $limitsum”);
      $i = 1;
      while($result = DB::fetch($query)) {
                if($result[‘itemid’] != $tid) {
                        if($i > $limit) {
                              break;
                        }
                        if($relatearray[$result] == ”) {
                              $i++;
                        }
                        if($result[‘itemid’]) {
                              $relatearray[$result] = $result[‘itemid’];
                        }
                }
      }
      if(!empty($relatearray)) {
                $query = DB::query(“SELECT tid,subject FROM
“.DB::table(‘forum_thread’).” WHERE tid IN
(“.dimplode($relatearray).”)”);
                while($result = DB::fetch($query)) {
                        $relateitem[] = $result;
                }
      }
      return $relateitem;
}下面分段进行分析$limit = $_G[‘setting’][‘relatenum’];
      $limitsum = 2 * $limit;
      if(!$limit) {
                return ”;
      }$_G[‘setting’][‘relatenum’]就是后台设置的相关帖子条目数,即帖子开头提到的设置。
$limitsum为后面要执行的sql查询的数量。
如果不存在$limit则直接返回空,即没有设置相关帖子条目数或者相关帖子条目数为0则直接返回空,不显示相关帖子。foreach($tagarray as $var) {
                $tagidarray[] = $var[‘0’];
      }
      if(!$tagidarray) {
                return ”;
      }$tagarray为该帖子的tag数组。
$tagidarray为存放该帖子tag的id的数组。
如果当前帖子不存在tag($tagidarray)则直接返回空,即如果帖子不存在tag则不显示相关帖子。$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的帖子记录。$i = 1;
      while($result = DB::fetch($query)) {
                if($result[‘itemid’] != $tid) {
                        if($i > $limit) {
                              break;
                        }
                        if($relatearray[$result] == ”) {
                              $i++;
                        }
                        if($result[‘itemid’]) {
                              $relatearray[$result] = $result[‘itemid’];
                        }
                }
      }将查询出的结果赋予$relatearray数组,此数组记录的是该帖子的相关帖子的tid。if(!empty($relatearray)) {
                $query = DB::query(“SELECT tid,subject FROM
“.DB::table(‘forum_thread’).” WHERE tid IN
(“.dimplode($relatearray).”)”);
                while($result = DB::fetch($query)) {
                        $relateitem[] = $result;
                }
      }如果$relatearray不为空,那么根据$relatearray中的tid在主题表(forum_thread)中查询相应帖子记录。
$relateitem为记录相关帖子的信息。在Discuz X模板目录下template/default/forum/viewthread_node.htm网页模板文件,277行附近,有如下代码<!–{if $post[‘relateitem’]}–>
                        <div >
                              <h3 >{lang related_thread}</h3>
                              <ul >
                                        <!–{loop $post[‘relateitem’] $var}–>
                                        <li>&+#8226;
<a href=”forum.php?mod=viewthread&tid=$var”
title=”$var”
target=”_blank”>$var</a></li>
                                        <!–{/loop}–>
                              </ul>
                        </div>
                <!–{/if}–>此段为显示相关帖子。其中的&+#8226;中间是没有+号的,因为直接写为会解析成圆点,故做此处理,查询时注意去掉。原始地址:http://doc.weixiaoduo.com/discuz/1446.html


页: [1]
查看完整版本: Discuz X相关帖子功能分析