discuz论坛限制重复主题,重复回复,连续回复,回复自动整合与要求中文回复的解决代码

由于论坛的自由与共享,社区论坛火了这么些年,也有很多大的社区成功转型,获得了大把的金钱和流量,当然这是一个健康的循环模式,这些成功的社区模式无疑属凤毛麟角,另外还有更多的千万社区,还在垃圾与矛盾中徘徊,发展方向、技术、人力、资源等等,这都是问题。Linker结识的一些玩论坛的朋友,大多以玩为主,因此,谈不上战略发展,因此,对于discuz论坛的一些功能代码修改,都非常无助,辛苦在discuz论坛上和网络上搜索了半天,很多也是不得要解,今天,Linker特意寻找了一些有关discuz论坛限制重复主题,重复回复,连续回复,回复自动整合与要求中文回复的解决代码。

一、比如限制重复主题、重复回复的代码修改:

打开 include/newreply.inc.php, 查找:

$attachment = empty($attachments) ? 0 : 1;(discuz6.1的代码)

$attachment = empty($attachments) ? 0 : ($imageexists ? 2 : 1);(discuz7的代码)

在下面增加

// ********************* 重复回帖检测 *****************************

$repeatlevel = 2; // 重复回帖的验证级别,后面有详细说明。

$chk_sql = "SELECT COUNT(*) FROM {$tablepre}posts WHERE ";
$chk_term = "";
switch($repeatlevel) {
case 1:
$chk_term = "subject='{$subject}’";
break;
case 2:
$chk_term = "message='{$message}’";
break;
case 3:
$chk_term = "subject='{$subject}’ AND message='{$message}’";
break;
case 4:
$chk_term = "subject='{$subject}’ AND message='{$message}’ AND authorid='{$discuz_uid}’";
break;
}
if($chk_term) {
$chk_num = $db->result($db->query($chk_sql . $chk_term), 0);
if($chk_num > 0) {
showmessage(‘请不要重复回帖,这很浪费资源的。请返回。’);
}
}
// ********************* 重复回帖检测 *****************************

 

关于回帖的重复检测级别,直接修改 $repeatlevel 参数就行了。下面是当这个变量的值为1~4的时候所代表的级别:

1 – 标题与数据库里的记录一致即算重复
2 – 内容与数据库里的记录一致即算重复
3 – 内容、标题与数据库里的记录都一致算重复
4 – 内容、标题、用户名与数据库里的记录都一致算重复

备注:上述代码据Linker测试验证,有着很大的弊端,在回复时会有大量的等待现象,可以得知是在遍历数据库查询,因此对于发贴和回复量比较大的论坛,Linker不建议采用这些办法来限制主题与回复的重复。

二、限制回复中文:

修改include/newreply.inc.php

找到  $author = empty($isanonymous) ? $discuz_user : ”;

在其下一行加入:

if(preg_match_all("/[\xB0-\xF7][\xA1-\xFE]/",$message,$regs)<=3) showmessage("请输入4个中文以上!");

这个方法,Linker在采用,速度显示很快,并且限制了诸如连续字母、连续数字、连续符号等输入,从而促进会员的主动回复。

三、还有一个限制主题与回复重复的方法,Linker没有具体测试,看代码,似乎也是遍历数据库查询的办法,也有可能造成回复的迟钝延时,但据discuz论坛网友说明,是付费获得的方法,有需要的朋友可以具体测试一下:

1,修改include/newreply.inc.php

找到

$author = empty($isanonymous) ? $discuz_user : ”;

在其下一行加入

        if($subject&&$db->result_first("SELECT * FROM `{$tablepre}posts` WHERE `subject` LIKE ‘$subject’ limit 0,1")) showmessage("<script>alert(‘标题与已有标题重复!’);history.go(-1)</script>");
        if($db->result_first("SELECT * FROM `{$tablepre}posts` WHERE `message` LIKE ‘$message’ limit 0,1")) showmessage("<script>alert(‘内容与已有内容重复!’);history.go(-1)</script>");

2,修改include/newthread.inc.php

找到

$db->query("INSERT INTO {$tablepre}threads (fid, readperm, price, iconid, typeid, author, authorid, subject, dateline, lastpost, lastposter, displayorder, digest, special, attachment, subscribed, moderated)
                VALUES (‘$fid’, ‘$readperm’, ‘$price’, ‘$iconid’, ‘$typeid’, ‘$author’, ‘$discuz_uid’, ‘$subject’, ‘$timestamp’, ‘$timestamp’, ‘$author’, ‘$displayorder’, ‘$digest’, ‘$special’, ‘$attachment’, ‘$subscribed’, ‘$moderated’)");

在其上一行加入

if($db->result_first("SELECT * FROM `{$tablepre}threads` WHERE `subject` LIKE ‘$subject’ limit 0,1")) showmessage("<script>alert(‘标题与已有标题重复!’);history.go(-1)</script>");

四、连续回帖自动改为在上面一楼追加【实用·长帖自动不追加·版块黑白名单】,测试discuz7有效。

//连续回复自动合并

$_insertword = "\n\n$discuz_userss 于 ".date("$dateformat $timeformat",
$timestamp)." 补充以下内容\n\n";//追加内容前缀

$_maxlength = 80;//字符数大于此值则一律不合并,注意1中文=2字符(GBK)或3字符(UTF)

$_reducesmile = 1;//设为1=去除表情之后计算字数,0=否

$_reducequote = 1;//设为1=去除引用之后计算字数,0=否

$_reducespace = 1;//设为1=去除空白换行之后计算字数,0=否

$_blackfids = array(18);//版块FID黑名单,此名单内不进行合并

$_whitefids = array();//版块FID白名单,此名单内进行合并,黑白名单同时存在时白名单
无效

//设置部分结束

if($_blackfids && $_whitefids) unset($_whitefids);

$temp = $message;

if(is_array($smilies))if($_reducesmile) foreach($smilies as $sm) {

$temp = str_replace($sm[‘code’], ”, $temp);

}

if($_reducequote) $temp = preg_replace("/\s*\[quote\][\n\r]*(.+?)[\n\r]
*\[\/quote\]\s*/is", ”, $temp);

if($_reducespace) $temp = preg_replace("/\s/is", ”, $temp);

$temp = trim($temp);

$length = strlen($temp);

unset($temp);

if($length <= $_maxlength && (!$_blackfids || !in_array($fid, $_blackfids))
&& (!$_whitefids || in_array($fid, $_whitefids))) {

$q = $db->query("SELECT authorid, pid FROM {$tablepre}posts WHERE
tid=’$tid’ ORDER BY pid DESC LIMIT 1");

$q = $db->fetch_array($q);

if($q[‘authorid’] == $discuz_uid && !$attachment && !$isanonymous) {

$message = $_insertword . $message;

$db->query("UPDATE {$tablepre}posts SET smileyoff = 0,
bbcodeoff = 0, message = CONCAT(message, ‘$message’) WHERE pid='{$q[‘pid’]}’");

showmessage(‘post_reply_succeed’, "viewthread.php?
tid=$tid&pid={$q[pid]}&page=".(@ceil(($thread[‘special’] ? $thread[‘replies’] :
$thread[‘replies’] + 1) / $ppp))."&extra=$extra#pid{$q[pid]}");
}
}

//连续回复自动合并

上述代码本来还有管理组不受限的功能,Linker觉得无此必要,管理组也不能特殊嘛,有需要的朋友,去discuz论坛搜索。

OK,有了这些,Linker觉得,已经方便很多了,但另一方面,Linker同时也告诫大家,论坛是要发挥会

2 thoughts on “discuz论坛限制重复主题,重复回复,连续回复,回复自动整合与要求中文回复的解决代码

  1. 您好,希望您在百忙之中抽点时间来帮助下菜鸟的我,感激不尽,方正文祥的E520台式机,主板是华硕代工的IPM31,怎么都不能从光驱启动,一开机就出现保护卡A版,我想从新做个系统,请问怎么能从光驱进去啊?

    linker 于 2009-9-19 15:48:22 回复

    你不用留言到最近贴,留言到方正文章那个贴就可。
    不管是哪类主板和品牌机,从光驱启动的修改方法都是一样的,就是修改cmos设置。你先想办法进入cmos设置里面,然后根据网上的一些设置方法就可以找到以光驱为首要启动设备。

Comments are closed.