DiscuzNT改造系列之删除帖子后论坛版块列表同步更新

简介:

关于删除帖子后论坛版块列表中不更新的解决办法 
主要现象:当删除坛子中的帖子后对应的板块仍然显示最新已删除的帖子
解决办法:
1、未打开当前版块的回收站
打开系统中dnt_deletetopicbytidlist的存储过程
在“UPDATE [dnt_users] SET [posts] = [posts] - 1 WHERE [uid] = @tempPosterid”后插入
--更新forum开始

Declare @lasttid int
Declare @lastposterid int
Declare @lasttitle nvarchar(300)
Declare @lastpost datetime
Declare @lastposter nvarchar(100)

--更新lasttitle
SELECT TOP 2 @lasttid = [tid], @lastposterid = [posterid], @lasttitle = [title], @lastpost = [postdatetime], @lastposter = [poster] FROM [dnt_posts1] WHERE [tid] in (select tid from dnt_topics where fid = @tempFid and displayorder>-1) ORDER BY [pid] DESC
UPDATE [dnt_forums] SET lasttid=@lasttid,lastposterid=@lastposterid,lasttitle=@lasttitle,lastpost=@lastpost,lastposter=@lastposter where fid=@tempFid
--更新forum结束

2、当前版块已打开回收站,则把dnt_deletetopicbytidlist存储过程替换为
[code]set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
---解决了删除帖子forum不更新的问题
ALTER PROCEDURE [dbo].[dnt_deletetopicbytidlist]
@tidlist AS VARCHAR(2000),
@posttablename AS VARCHAR(20)
AS
DECLARE @postcount int
DECLARE @topiccount int
DECLARE @todaycount int
DECLARE @sqlstr nvarchar(4000)
DECLARE @fid varchar(2000)
DECLARE @posterid varchar(200)
Declare @tempTid int
DECLARE @tempFid int
DECLARE @tempPosterid int
DECLARE @tempLayer int
DECLARE @temppostdatetime datetime
DECLARE @tempfidlist AS VARCHAR(1000) 


SET @fid = ''
SET @posterid = ''
SET @postcount=0
SET @topiccount=0
SET @todaycount=0

SET @tempfidlist = '';

IF @tidlist<>''
  BEGIN
  --对于回收站中的帖子不做处理
  SET @sqlstr = 'DECLARE cu_dnt_posts CURSOR FOR SELECT [tid],[fid],[posterid],[layer],[postdatetime] FROM [' + @posttablename + '] WHERE [tid] IN (' + @tidlist + ')'
  EXEC (@sqlstr)
  OPEN cu_dnt_posts
  FETCH NEXT FROM cu_dnt_posts into @tempTid,@tempFid,@tempPosterid,@tempLayer,@temppostdatetime
  WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @postcount = @postcount + 1
    IF @tempLayer = 0
      BEGIN
      SET @topiccount = @topiccount + 1
      
      END
    IF DATEDIFF(d,@temppostdatetime,GETDATE()) = 0
      BEGIN
      SET @todaycount = @todaycount + 1
      END

    IF CHARINDEX(',' + LTRIM(STR(@tempFid)) + ',',@fid + ',') = 0
      BEGIN
      --SET @fid = @fid + ',' + LTRIM(STR(@tempFid)) 
      SELECT @tempfidlist = ISNULL([parentidlist],'') FROM [dnt_forums] WHERE [fid] = @tempFid
      IF RTRIM(@tempfidlist)<>''
        BEGIN
        SET @fid = RTRIM(@fid) + ',' +  RTRIM(@tempfidlist) + ',' + CAST(@tempFid AS VARCHAR(10))
        END
      ELSE
        BEGIN
        SET @fid =RTRIM(@fid) + ',' +  CAST(@tempFid AS VARCHAR(10))
        END
    
      END
    UPDATE [dnt_users] SET [posts] = [posts] - 1 WHERE [uid] = @tempPosterid
    
--更新forum开始 add by liudao 
    Declare @lasttid int
    Declare @lastposterid int
    Declare @lasttitle nvarchar(300)
    Declare @lastpost datetime
    Declare @lastposter nvarchar(100)
    
    --更新lasttitle
    SELECT TOP 1 @lasttid = [tid], @lastposterid = [posterid], @lasttitle = [title], @lastpost = [postdatetime], @lastposter = [poster] FROM [dnt_posts1] WHERE [tid] in (select tid from dnt_topics where fid = @tempFid and tid<>@tempTid and displayorder>-1) ORDER BY [pid] DESC
    UPDATE [dnt_forums] SET lasttid=@lasttid,lastposterid=@lastposterid,lasttitle=@lasttitle,lastpost=@lastpost,lastposter=@lastposter where fid=@tempFid
--更新forum结束 
    FETCH NEXT FROM cu_dnt_posts into @tempTid,@tempFid,@tempPosterid,@tempLayer,@temppostdatetime
    END
  CLOSE cu_dnt_posts
  DEALLOCATE cu_dnt_posts

  IF LEN(@fid)>0
    BEGIN 
  
    SET @fid = SUBSTRING(@fid,2,LEN(@fid)-1)
  
    UPDATE [dnt_statistics] SET [totaltopic]=[totaltopic] - @topiccount, [totalpost]=[totalpost] - @postcount
  
    SET @sqlstr = 'UPDATE [dnt_forums] SET [posts]=[posts] - ' +  cast(@postcount AS VARCHAR(10))  + 
        ', [topics]=[topics] - ' + cast(@topiccount AS VARCHAR(10)) + 
        ', [todayposts] = [todayposts] - ' + cast(@todaycount AS VARCHAR(10)) + 
      ' WHERE [fid] IN (' + @fid + ')'
    EXEC (@sqlstr)
    
  
    SET @sqlstr = 'DELETE FROM [dnt_favorites] WHERE [tid] IN (' + @tidlist + ')'
    EXEC (@sqlstr)
    
    SET @sqlstr = 'DELETE FROM [dnt_polls] WHERE [tid] IN (' + @tidlist + ')'
    EXEC (@sqlstr)
    SET @sqlstr = 'DELETE FROM [' + @posttablename + '] WHERE [tid] IN (' + @tidlist + ')'
    EXEC (@sqlstr)
    
    END
  SET @sqlstr = 'DELETE FROM [dnt_topics] WHERE [closed] IN (' + @tidlist + ') OR [tid] IN (' + @tidlist + ')'
  EXEC (@sqlstr)
  
  END



然后再把Forum.TopicAdminFactory的567行

return toDustbin == 0 ? DeleteTopics(topiclist) : SetTopicStatus(topiclist, &quot;displayorder&quot;, -1);



改为

  if(toDustbin != 0 )//放入回收站
            {
            SetTopicStatus(topiclist, &quot;displayorder&quot;, -1);
            }
            return DeleteTopics(topiclist);//利用存储过程删除



最后别忘了如果操作了第二步编译才生效
总之如果没有设置版块的回收站只需第一步修改存储过程即可,如果打开了回收站处理起来就比较麻烦一些了。

注意:修改任何文件前请做好数据备份,以免带来不必要的麻烦



本文转自 liudao 博客园博客,原文链接:http://www.cnblogs.com/liudao/archive/2007/12/10/989147.html,如需转载请自行联系原作者

相关文章
|
5天前
|
小程序 API Android开发
【社区每周】基础库更新;小游戏增加流量运营相关文档(11月第四期)
【社区每周】基础库更新;小游戏增加流量运营相关文档(11月第四期)
81 1
|
5天前
|
存储 SQL 前端开发
【个人博客系统网站】 所有人的博客列表页 · 分页功能实现
【个人博客系统网站】 所有人的博客列表页 · 分页功能实现
8 0
|
5天前
|
开发者
【公告】阿里云开发者社区“关注后查看全文”功能调整通知
12月8日阿里云开发者社区将关闭博主“关注后查看全文”功能
|
11月前
|
SQL XML 前端开发
怎么做社区网站的首页帖子展示?
要进行首页帖子展示,就必须学会分页,而在创建分页之前,我们得先认识到,为什么要进行分页?一个大型网站的数据库将容纳大量的数据,而我们进行展示某部分数据时,为了保证浏览速度,不可能一次性地将所有数据进行传输,更何况,不是全部传输过去的数据第一时间就能有效利用,所以,只要每次将需要的数据传输过去就好,即使是后续需要的数据,那也是后面时间点需要完成的工作,为了做到这一点,必须对一个数据整体进行划分,合理地传输并展示给用户,其中,划分出来的每一部分可被称为一页数据,完成划分工作的就是分页操作。而分页操作在 spingboot 及 mybatis 的环境下,可被分为以下几种分页情况:
93 0
怎么做社区网站的首页帖子展示?
新增闯关模式,邀请好朋友测试
计划为精致1010新增闯关模式,先把游戏原型做出来了,希望朋友们可以先行体验,并给予反馈和意见。
69 0
|
Web App开发 安全
【信仰充值中心】Firefox 97 后续更新一览
【信仰充值中心】Firefox 97 后续更新一览
75 0
|
JavaScript 开发者
get方式提交新闻防止新闻被覆盖掉(补充说明)|学习笔记
快速学习 get 方式提交新闻防止新闻被覆盖掉(补充说明)
92 0
get方式提交新闻防止新闻被覆盖掉(补充说明)|学习笔记
|
JSON JavaScript 小程序
HackerNews新闻列表功能描述|学习笔记
快速学习 HackerNews新闻列表功能描述
138 0
HackerNews新闻列表功能描述|学习笔记
|
前端开发
前端工作总结128-阅读账号里面的新增调用接口操作
前端工作总结128-阅读账号里面的新增调用接口操作
68 0
前端工作总结128-阅读账号里面的新增调用接口操作
|
数据库 开发者
【Discuz】主题浏览量实现原理和不更新的解决方案
【Discuz】主题浏览量实现原理和不更新的解决方案
228 0
【Discuz】主题浏览量实现原理和不更新的解决方案