/// <summary> /// 移动主题到指定版块 /// </summary> /// <param name="topiclist">要移动的主题列表</param> /// <param name="fid">转到的版块ID</param> /// <param name="savelink">是否在原版块保留连接</param> /// <returns>更新记录数</returns> public static int MoveTopics(string topiclist, int fid, int oldfid, bool savelink, int topicType) { if (!Utils.IsNumericList(topiclist)) { return(-1); } string tidList = ""; DataTable dt = Topics.GetTopicList(topiclist); foreach (DataRow dr in dt.Rows) { if (TypeConverter.ObjectToInt(dr["closed"]) <= 1 || TypeConverter.ObjectToInt(dr["fid"]) != oldfid) { tidList += dr["tid"].ToString() + ","; } } tidList = tidList.TrimEnd(','); if (string.IsNullOrEmpty(tidList)) { return(-1); } Discuz.Data.TopicAdmins.DeleteClosedTopics(fid, tidList); //转移帖子 MoveTopics(tidList, fid, oldfid, topicType); //如果保存链接则复制一条记录到原版块 if (savelink) { if (Discuz.Data.TopicAdmins.CopyTopicLink(oldfid, tidList) <= 0) { return(-2); } AdminForumStats.ReSetFourmTopicAPost(oldfid); Forums.SetRealCurrentTopics(oldfid); } return(1); }
/// <summary> /// 根据参数信息选择相应的模板 /// </summary> /// <param name="strTemplateid">默认的模板ID</param> /// <param name="pagename">请求的页面名称</param> /// <param name="newUrl">请求参数</param> /// <returns>返回相应的模板ID</returns> public string SelectTemplate(string strTemplateid, string pagename, string newUrl) { string pagenamelist = "showforum,showtopic,showdebate,showbonus,posttopic,postreply,showtree,editpost,delpost,topicadmin"; int forumid = 0; //要截取的字段串的开始位置 int startindex = pagename.LastIndexOf("/") + 1; //如果是指定的页面则进行模板查询 int length = pagename.LastIndexOf(".") - startindex; if (length > 0 && Utils.InArray(pagename.Substring(startindex, length), pagenamelist)) { foreach (string urlvalue in newUrl.Split('&')) { if ((urlvalue.IndexOf("forumid=") >= 0) && (urlvalue.Split('=')[1] != "")) { forumid = Utils.StrToInt(urlvalue.Split('=')[1], 0); } else { if ((urlvalue.IndexOf("topicid=") >= 0) && (urlvalue.Split('=')[1] != "")) { Discuz.Entity.TopicInfo topicinfo = Topics.GetTopicInfo(Utils.StrToInt(urlvalue.Split('=')[1], 0)); //主题存在时 if (topicinfo != null) { forumid = topicinfo.Fid; } } else { forumid = DNTRequest.GetInt("forumid", 0); } } if (forumid > 0) { Entity.ForumInfo forumInfo = Forums.GetForumInfo(forumid); int templateid = forumInfo == null ? 0 : forumInfo.Templateid; //当前版块未指定模板时(使用用户选择的模版或系统默认模板) if (templateid <= 0) { //从cookie中获取用户选择的模板 if (Utils.InArray(Utils.GetCookie(Utils.GetTemplateCookieName()), Templates.GetValidTemplateIDList())) { templateid = Utils.StrToInt(Utils.GetCookie(Utils.GetTemplateCookieName()), GeneralConfigs.GetConfig().Templateid); } //使用系统默认模板 if (templateid == 0) { templateid = GeneralConfigs.GetConfig().Templateid; } } strTemplateid = templateid.ToString(); break; } } } return(strTemplateid); }
/// <summary> /// 分割主题 /// </summary> /// <param name="postidlist">帖子id列表</param> /// <param name="subject">主题</param> /// <param name="topicId">主题id列表</param> /// <returns>更新记录数</returns> public static int SplitTopics(string postidlist, string subject, string topicId) { //验证要分割的帖子是否为有效PID号 string[] postIdArray = postidlist.Split(','); if (Utils.StrIsNullOrEmpty(postidlist) || !Utils.IsNumericArray(postIdArray)) { return(-1); } int tid = 0; int lastPostId = TypeConverter.StrToInt(postIdArray[postIdArray.Length - 1]); //将要被分割主题的tid TopicInfo originalTopicInfo = Topics.GetTopicInfo(TypeConverter.StrToInt(topicId)); //原主题信息 TopicInfo newTopicInfo = new TopicInfo(); //新主题信息 PostInfo lastPostInfo = Posts.GetPostInfo(originalTopicInfo.Tid, lastPostId); PostInfo firstPostInfo = Posts.GetPostInfo(originalTopicInfo.Tid, TypeConverter.StrToInt(postIdArray[0])); newTopicInfo.Poster = firstPostInfo.Poster; newTopicInfo.Posterid = firstPostInfo.Posterid; newTopicInfo.Postdatetime = Utils.GetDateTime(); newTopicInfo.Displayorder = 0; newTopicInfo.Highlight = ""; newTopicInfo.Digest = 0; newTopicInfo.Rate = 0; newTopicInfo.Hide = 0; newTopicInfo.Special = 0; newTopicInfo.Attachment = 0; newTopicInfo.Moderated = 0; newTopicInfo.Closed = 0; newTopicInfo.Views = 0; newTopicInfo.Fid = originalTopicInfo.Fid; newTopicInfo.Forumname = originalTopicInfo.Forumname; newTopicInfo.Iconid = originalTopicInfo.Iconid; newTopicInfo.Typeid = originalTopicInfo.Typeid; newTopicInfo.Replies = postIdArray.Length - 1; newTopicInfo.Title = Utils.HtmlEncode(subject); newTopicInfo.Lastposterid = lastPostInfo.Posterid; newTopicInfo.Lastpost = lastPostInfo.Postdatetime; newTopicInfo.Lastposter = lastPostInfo.Poster; tid = Topics.CreateTopic(newTopicInfo); DatabaseProvider.GetInstance().UpdatePostTid(postidlist, tid, Data.PostTables.GetPostTableId(tid)); DatabaseProvider.GetInstance().SetPrimaryPost(subject, tid, postIdArray, Discuz.Data.PostTables.GetPostTableId(tid)); newTopicInfo.Tid = tid; newTopicInfo.Lastpostid = lastPostId; if (originalTopicInfo.Lastpostid == lastPostId)//当需要将原主题的最后一个发帖分割走时(即分割列表中有和原主题Lastpostid相同的值) { newTopicInfo.Lastposterid = originalTopicInfo.Posterid; newTopicInfo.Lastpost = originalTopicInfo.Lastpost; newTopicInfo.Lastposter = originalTopicInfo.Poster; DataTable dt = DatabaseProvider.GetInstance().GetLastPostNotInPidList(postidlist, originalTopicInfo.Tid, int.Parse(Posts.GetPostTableId())); originalTopicInfo.Lastpostid = TypeConverter.ObjectToInt(dt.Rows[0]["pid"]); originalTopicInfo.Lastposterid = TypeConverter.ObjectToInt(dt.Rows[0]["Posterid"].ToString()); originalTopicInfo.Lastpost = dt.Rows[0]["Postdatetime"].ToString(); originalTopicInfo.Lastposter = dt.Rows[0]["Poster"].ToString(); } originalTopicInfo.Replies = originalTopicInfo.Replies - postIdArray.Length; Topics.UpdateTopic(originalTopicInfo);//更新原主题的信息 Topics.UpdateTopicReplyCount(originalTopicInfo.Tid); Topics.UpdateTopic(newTopicInfo);//由于数据库中对lastpostid有list约束,所以不能有重复值,则必须在原主题的lastpostid修改之后再次修改才能将数据最终修正完毕 Topics.UpdateTopicReplyCount(tid); return(tid); }
/// <summary> /// 在数据库中删除指定主题 /// </summary> /// <param name="topiclist">主题列表</param> /// <param name="subtractCredits">是否减少用户积分(0不减少,1减少)</param> /// <returns>删除个数</returns> public static int DeleteTopics(string topicList, int subTractCredits, bool reserveAttach) { if (!Utils.IsNumericList(topicList)) { return(-1); } GeneralConfigInfo configinfo = GeneralConfigs.GetConfig(); DataTable dt = Topics.GetTopicList(topicList); if (dt == null) { return(-1); } foreach (DataRow dr in dt.Rows) { if (TypeConverter.ObjectToInt(dr["digest"]) > 0) { UserCredits.UpdateUserExtCredits(TypeConverter.ObjectToInt(dr["posterid"]), -1, CreditsOperationType.Digest, 1, true); UserCredits.UpdateUserCredits(TypeConverter.ObjectToInt(dr["posterid"])); } } dt = Posts.GetPostList(topicList); if (dt != null) { Hashtable attUidCount = new Hashtable(); foreach (DataRow dr in dt.Rows) { //后台设置的项为多少天外的老帖删除不减积分,而不是多少天内删帖可以不减分 if (configinfo.Losslessdel == 0 || Utils.StrDateDiffHours(dr["postdatetime"].ToString(), configinfo.Losslessdel * 24) < 0) { CreditsOperationType creditsOperationType = TypeConverter.ObjectToInt(dr["layer"]) == 0 ? CreditsOperationType.PostTopic : CreditsOperationType.PostReply; //获取版块积分规则 float[] creditsValue = Forums.GetValues( creditsOperationType == CreditsOperationType.PostTopic ? Forums.GetForumInfo(TypeConverter.ObjectToInt(dr["fid"])).Postcredits : Forums.GetForumInfo(TypeConverter.ObjectToInt(dr["fid"])).Replycredits ); //如果未定义版块积分规则 if (creditsValue == null) { creditsValue = Scoresets.GetUserExtCredits(creditsOperationType); } UserCredits.UpdateUserExtCredits(TypeConverter.ObjectToInt(dr["posterid"]), creditsValue, 1, creditsOperationType, -1, true); int attCount = Attachments.GetAttachmentCountByPid(TypeConverter.ObjectToInt(dr["pid"])); if (attCount > 0) { int posterid = TypeConverter.ObjectToInt(dr["posterid"]); if (attUidCount.ContainsKey(posterid)) { attUidCount[posterid] = (int)attUidCount[posterid] + attCount; } else { attUidCount.Add(TypeConverter.ObjectToInt(dr["posterid"]), attCount); } } } UserCredits.UpdateUserCredits(TypeConverter.ObjectToInt(dr["posterid"])); } int i = 0; int[] tuidlist = new int[attUidCount.Count]; int[] attcountlist = new int[attUidCount.Count]; foreach (DictionaryEntry de in attUidCount) { tuidlist[i] = (int)de.Key; attcountlist[i] = (int)de.Value; i++; } UserCredits.UpdateUserCredits(tuidlist, attcountlist, CreditsOperationType.UploadAttachment, -1); } int reval = 0; foreach (string posttableid in Posts.GetPostTableIdArray(topicList)) { reval = Discuz.Data.TopicAdmins.DeleteTopicByTidList(topicList, posttableid); } if (reval > 0 && !reserveAttach) { Attachments.DeleteAttachmentByTid(topicList); } return(reval); }