Discuz教程网

Discuz官方 相关帖子 功能分析

[复制链接]
authicon dly 发表于 2011-8-23 14:26:35 | 显示全部楼层 |阅读模式
功能开启位置:
后台->界面->界面设置->帖子内容页下,设置相关帖子条目数,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;中间是没有+号的,因为直接写为会解析成圆点,故做此处理,查询时注意去掉。

作者:dongdong0925




上一篇:DZz 云桌面 1.1 Beta2
下一篇:Discuz 附件列表不显示附件问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 18:43

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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