阿里云服务器免费领卷啦。

捡代码论坛-最全的游戏源码下载技术网站!

 找回密码
 立 即 注 册

QQ登录

只需一步,快速开始

搜索
关于源码区的附件失效或欺骗帖, 处理办法
查看: 2302|回复: 0

Discuz X相关帖子功能分析

[复制链接]

4208

主题

210

回帖

12万

积分

管理员

管理员

Rank: 9Rank: 9Rank: 9

积分
126084
QQ
发表于 2017-2-20 16:00:04 | 显示全部楼层 |阅读模式

相关帖子功能分析
功能开启位置:
后台->界面->界面设置->帖子内容页下,设置相关帖子条目数,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
  16. “.DB::table(‘common_tagitem’).” WHERE tagid IN
  17. (“.dimplode($tagidarray).”) AND idtype=’$type’ LIMIT $limitsum”);
  18.         $i = 1;
  19.         while($result = DB::fetch($query)) {
  20.                 if($result[‘itemid’] != $tid) {
  21.                         if($i > $limit) {
  22.                                 break;
  23.                         }
  24.                         if($relatearray[$result[itemid]] == ”) {
  25.                                 $i++;
  26.                         }
  27.                         if($result[‘itemid’]) {
  28.                                 $relatearray[$result[itemid]] = $result[‘itemid’];
  29.                         }
  30.                 }
  31.         }
  32.         if(!empty($relatearray)) {
  33.                 $query = DB::query(“SELECT tid,subject FROM
  34. “.DB::table(‘forum_thread’).” WHERE tid IN
  35. (“.dimplode($relatearray).”)”);
  36.                 while($result = DB::fetch($query)) {
  37.                         $relateitem[] = $result;
  38.                 }
  39.         }
  40.         return $relateitem;
  41. }
复制代码

下面分段进行分析

  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
  2. = DB::query(“SELECT itemid FROM “.DB::table(‘common_tagitem’).” WHERE
  3. tagid IN (“.dimplode($tagidarray).”) AND idtype=’$type’ LIMIT
  4. $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
  3. “.DB::table(‘forum_thread’).” WHERE tid IN
  4. (“.dimplode($relatearray).”)”);
  5.                 while($result = DB::fetch($query)) {
  6.                         $relateitem[] = $result;
  7.                 }
  8.         }
复制代码

如果$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;
  7. <a href=”forum.php?mod=viewthread&tid=$var[tid]”
  8. title=”$var[subject]”
  9. target=”_blank”>$var[subject]</a></li>
  10.                                         <!–{/loop}–>
  11.                                 </ul>
  12.                         </div>
  13.                 <!–{/if}–>
复制代码
  1. 此段为显示相关帖子。其中的&+#8226;中间是没有+号的,因为直接写为会解析成圆点,故做此处理,查询时注意去掉。
复制代码
原始地址:
  1. http://doc.weixiaoduo.com/discuz/1446.html
复制代码




捡代码论坛-最全的游戏源码下载技术网站! - 论坛版权郑重声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与捡代码论坛-最全的游戏源码下载技术网站!享有帖子相关版权
3、捡代码论坛版权,详细了解请点击。
4、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
5、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
6、如无法链接失效或侵犯版权,请给我们来信:jiandaima@foxmail.com

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立 即 注 册

本版积分规则

技术支持
在线咨询
QQ咨询
3351529868

QQ|手机版|小黑屋|捡代码论坛-专业源码分享下载 ( 陕ICP备15015195号-1|网站地图

GMT+8, 2024-3-29 19:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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