关灯
开启左侧

Discuz帖子列表页新回复帖自动提示机制分析

  [复制链接]
admin实名认证 发表于 2017-3-15 18:37:56 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
DiscuzX2 帖子列表页新回复帖自动提示机制分析


*************************************************

**    本教程基于版本:Discuz! X 2.0              **

*************************************************

x2 新添加了一个功能当用户查看一个版块帖子列表页,短时间内没有刷新操作,如果有其它用户在相同版块发帖时,一定时间后,查看该版未作刷新操作的用户的帖子列表页会一条有新回复主题的帖的提醒

154855ttytt007f5tws77k.jpg.thumb.jpg

具体实现我们可以了解一下如下:

当用户查看一个版块帖时,程序模板 ./template/default/forum/forumdisplay.htm
此文件在版块为非图片版模式 (empty($_G['forum']['picstyle']) ) 并且为按默认的最新回复排序看帖 ($_G['gp_orderby'] == 'lastpost')时,会在版块的帖子列表页底部加一段 js 代码
  • <script type="text/javascript">checkForumnew_handle = setTimeout(function () {checkForumnew($_G[fid], lasttime);}, checkForumtimeout);</script>


该 js 会使用 setTimeout 函数 根据 forum.js 里面设定的 checkForumtimeout 的值(程序默认为30000 即30秒)执行 checkForumnew() 函数,如下
  • function checkForumnew(fid, lasttime) {
  •         var timeout = checkForumtimeout;
  •         var x = new Ajax();
  •         x.get('forum.php?mod=ajax&action=forumchecknew&fid=' + fid + '&time=' + lasttime + '&inajax=yes', function(s){
  •                 if(s > 0) {
  •                         if($('separatorline')) {
  •                                 var table = $('separatorline').parentNode;
  •                         } else {
  •                                 var table = $('forum_' + fid);
  •                         }
  •                         if(!isUndefined(checkForumnew_handle)) {
  •                                 clearTimeout(checkForumnew_handle);
  •                         }
  •                         removetbodyrow(table, 'forumnewshow');
  •                         var colspan = table.getElementsByTagName('tbody')[0].rows[0].children.length;
  •                         var checknew = {'tid':'', 'thread':{'common':{'className':'', 'val':'<a href="javascript:void(0);">有新回复的主题,点击查看', 'colspan': colspan }}};
  •                         addtbodyrow(table, ['tbody'], ['forumnewshow'], 'separatorline', checknew);
  •                 } else {
  •                         if(checkForumcount < 50) {
  •                                 if(checkForumcount > 0) {
  •                                         var multiple =  Math.ceil(50 / checkForumcount);
  •                                         if(multiple < 5) {
  •                                                 timeout = checkForumtimeout * (5 - multiple + 1);
  •                                         }
  •                                 }
  •                                 checkForumnew_handle = setTimeout(function () {checkForumnew(fid, lasttime);}, timeout);
  •                         }
  •                 }
  •                 checkForumcount++;
  •         });
  • }


forum.js 中的 checkForumnew() 会 实例一个 Ajax对象
通过ajax 请求 forum.php?mod=ajax&action=forumchecknew&fid=' + fid + '&time=' + lasttime + '&inajax=yes

通过地址很容易看到请求的 ./source/module/forum/forum_ajax.php
该文件根据传过来版块fid的值 从 forum_forum 表查出该版块记录有最新回复的主题帖的 lastpost 的字段的值 ,并不是从 forum_post 表查的最新帖
然后判断 ajax 所请求的时间是否大于 此字段记录中所记录的最新帖子的时间 来返回是否存在最新帖
如果请求的时间小于最新帖时间 那表示有最新帖 则返回 1 否则返回 0

返回是否有新帖被传成 forum.js 中的 checkForumnew()  中 function(s) s值  
通过判断 s 值

如果 s 值为0 没有最新帖 forum.js 会根据一定算法把 慢慢延长 ajax 请求查询是否有新帖的周期 以防止过去频繁的查询

如果  s 值为1 有最新帖
forum.js 判断了checkForumnew_handle 来清除 setTimeout() 方法设置的 timeout 的值,以防止用户未点击查看新帖提示之前程序做重复的查询浪费资源,并且使用自定义函数 addtbodyrow 添加新帖提醒节点及获取新帖的ajax
  • onclick="ajaxget(\'forum.php?mod=ajax&action=forumchecknew&fid=' + fid+ '&time='+lasttime+'&uncheck=1&inajax=yes\', \'forumnew\');"


此时用户就会在帖子列表页看到上面图中所提示的现状 “有新回复的主题,点击查看”。

当用户点击 “有新回复的主题,点击查看”时, 程序会以ajax 请求 forum.php?mod=ajax&action=forumchecknew&fid=' + fid+ '&time='+lasttime+'&uncheck=1&inajax=yes  地址

同样 通过地址很容易看到请求 ./source/module/forum/forum_ajax.php 文件, 而地址多了一个 uncheck 参数,
根据uncheck进入查询具体新主题的判断,程序从 forum_thread 根据当前 ajax 请求的时间,查出最新的帖子返回,此时
  • include template('forum/ajax_threadlist');


包含一个  ./template/default/forum/ajax_threadlist.htm 模板文件 将最新回复的帖子标题等内容 输出展示在帖子列表

 

精彩评论1

倒序浏览
你懂的 发表于 2017-3-25 05:51:17 | 显示全部楼层
 
感谢楼主分享,祝愿吾爱尚玩越来越好!
 
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • 荣誉管理

    曾经为论坛做出突出贡献目前已离职的版主
  • 论坛元老

    为论坛做出突出贡献的会员

0关注

5粉丝

3421帖子

排行榜
作者专栏

QQ交流群&&微信订阅号

QQ交流群

微信订阅号

吾爱尚玩资源基地永久域名:

Www.523Play.Com

在线管理员QQ:1589479632

邮箱:Email@523play.com

QQ交流群:558936238

Copyright   ©2015-2116  吾爱尚玩资源基地|523play.comPowered by©523Pplay.Com技术支持:吾爱尚玩资源基地