Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

相关帖子功能分析

[复制链接]
dongdong0925 发表于 2011-7-25 09:27:21 | 显示全部楼层 |阅读模式
本帖最后由 dongdong0925 于 2011-7-25 09:27 编辑

功能开启位置:
后台->界面->界面设置->帖子内容页下,设置相关帖子条目数,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为记录相关帖子的信息。

在template\default\forum\viewthread_node.htm模板文件,277行附近,有如下代码
  1. <!--{if $post['relateitem']}-->
  2.                         <div class="mtw mbw">
  3.                                 <h3 class="pbm mbm bbda">{lang related_thread}</h3>
  4.                                 <ul class="xl xl2 cl">
  5.                                         <!--{loop $post['relateitem'] $var}-->
  6.                                         <li>&+#8226; <a href="forum.php?mod=viewthread&tid=$var[tid]" title="$var[subject]" target="_blank">$var[subject]</a></li>
  7.                                         <!--{/loop}-->
  8.                                 </ul>
  9.                         </div>
  10.                 <!--{/if}-->
复制代码
此段为显示相关帖子。其中的&+#8226;中间是没有+号的,因为直接写为会解析成圆点,故做此处理,查询时注意去掉。


ARCHY` 发表于 2011-7-29 21:25:33 | 显示全部楼层
学习了
回复

使用道具 举报

独木成林 发表于 2011-8-2 10:56:54 | 显示全部楼层
本帖最后由 独木成林 于 2011-8-2 10:57 编辑

越搞越复杂,老版本的相关帖子简单好用。都没什么人关注!
回复

使用道具 举报

mxl1983413 发表于 2011-8-2 11:48:38 | 显示全部楼层
我说怎么突然冒出这个功能。
回复

使用道具 举报

疤痕 发表于 2011-8-2 23:05:17 | 显示全部楼层
我的设置了也不显示啊。
回复

使用道具 举报

wdblog 发表于 2011-8-6 13:30:53 | 显示全部楼层
这个是官方的相关帖子修改吗 www.7cov.com
回复

使用道具 举报

ycr518 发表于 2011-8-6 16:07:03 | 显示全部楼层
我的也不显示
回复

使用道具 举报

glxsf 发表于 2011-8-19 16:08:34 | 显示全部楼层
不显示,安装新0817版的,不用设置就显示,以前版本的升级了,设置了,还不显示
回复

使用道具 举报

eswnman 发表于 2011-8-21 22:54:36 | 显示全部楼层
有没有补丁?
回复

使用道具 举报

逝水 发表于 2011-8-22 13:28:54 | 显示全部楼层
可以不根据标签 只根据标题显示相关帖子吗???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-4-27 23:47 , Processed in 0.100941 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表