相关帖子功能分析
功能开启位置:
后台-> 界面-> 界面设置-> 帖子内容页下,设置相关帖子条目数,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[itemid]] == '') {
- $i++;
- }
- if($result['itemid']) {
- $relatearray[$result[itemid]] = $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[itemid]] == '') {
- $i++;
- }
- if($result['itemid']) {
- $relatearray[$result[itemid]] = $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[tid]"
title="$var[subject]"
target="_blank">$var[subject]</a></li> - <!--{/loop}-->
- </ul>
- </div>
- <!--{/if}-->
此段为显示相关帖子。其中的&+#8226; 中间是没有+号的,因为直接写为会解析成圆点,故做此处理,查询时注意去掉。