2009-02-27

Discuz!7 主题与回复分离显示,重建用户积分

0

论坛从 Dvbbs 转为 Discuz!后,老大要求把论坛积分规则修改为:

主题:经验 +5
回复:经验 +1
精华:经验 +10
总积分 = 经验

在 后台管理 - 用户 - 积分设置 中修改好扩展积分规则,但 Discuz!7 并不会以新规则重新计算用户的扩展积分,只有扩展积分清零操作,总积分也需要在用户登录时才会根据总积分公式重新计算。

除非是新论坛,可以先规划好积分规则,论坛进入运作后会自动更新各项积分数据,像我这种有老数据的论坛必须要按新规则重新计算出各项积分并显示出来才行。

自己动手做了些设置和处理,总结如下:

1、后台设置

在 后台管理 - 用户 - 积分设置 中把 经验 设置在 extcredits1,把 回复 设置在 extcredits7 并启用,把 主题 设置在 extcredits8,总积分计算公式填写 extcredits1,提交。

在下面的扩展积分设置中,设置如下:

发主题 经验 5 、主题 1
回复 经验 1 、回复 1
加精华 经验 10

2、添加统计程序

打开 /bbs/admincp.php ,查找:

'upgrade'

在后面添加:

, 'memberthreads', 'memberextcredits1', 'membercredits'

完整代码:

if(in_array($action, array('home', 'settings', 'members', 'profilefields', 'admingroups', 'usergroups', 'ranks', 'forums', 'threadtypes', 'threads', 'moderate', 'attach', 'smilies', 'recyclebin', 'prune', 'styles', 'plugins', 'tasks', 'magics', 'medals', 'google', 'qihoo', 'video', 'announce', 'faq', 'ec', 'tradelog', 'creditwizard', 'jswizard', 'project', 'counter', 'misc', 'adv', 'insenz', 'logs', 'tools', 'checktools', 'search', 'upgrade', 'memberthreads', 'memberextcredits1', 'membercredits')) || ($isfounder && in_array($action, array('runwizard', 'templates', 'db')))) {

打开 /bbs/admin/counter.inc.php ,查找:

} elseif(submitcheck('threadsubmit', 1)) {

在这行上面添加:

} elseif(submitcheck('memberthreadssubmit', 1)) {
 
	$nextlink = "$BASESCRIPT?action=counter&current=$next&pertask=$pertask&memberthreadssubmit=yes";
	$processed = 0;
 
	$queryt = $db->query("SELECT uid FROM {$tablepre}members LIMIT $current, $pertask");
	while($mem = $db->fetch_array($queryt)) {
		$processed = 1;
		$query = $db->query("SELECT COUNT(*) FROM {$tablepre}threads WHERE authorid='$mem[uid]' AND displayorder>='0'");
		$memberthreadscount = $db->result($query, 0);
		$db->query("UPDATE {$tablepre}members SET extcredits8='$memberthreadscount', extcredits7=posts-'$memberthreadscount' WHERE uid='$mem[uid]'");
	}
 
	if($processed) {
		cpmsg("$lang[counter_memberthreads]: $lang[counter_processing]", $nextlink, 'loading');
	} else {
		cpmsg('counter_memberthreads_succeed', $BASESCRIPT.'?action=counter', 'succeed');
	}
 
} elseif(submitcheck('memberextcredits1submit', 1)) {
 
	$nextlink = "$BASESCRIPT?action=counter&current=$next&pertask=$pertask&memberextcredits1submit=yes";
	$processed = 0;
 
	$queryt = $db->query("SELECT uid FROM {$tablepre}members LIMIT $current, $pertask");
	while($mem = $db->fetch_array($queryt)) {
		$processed = 1;
		$db->query("UPDATE {$tablepre}members SET extcredits1=extcredits8*5+extcredits7+digestposts*10 WHERE uid='$mem[uid]'");
	}
 
	if($processed) {
		cpmsg("$lang[counter_memberextcredits1]: $lang[counter_processing]", $nextlink, 'loading');
	} else {
		cpmsg('counter_memberextcredits1_succeed', $BASESCRIPT.'?action=counter', 'succeed');
	}
 
} elseif(submitcheck('membercreditssubmit', 1)) {
 
	$nextlink = "$BASESCRIPT?action=counter&current=$next&pertask=$pertask&membercreditssubmit=yes";
	$processed = 0;
 
	$queryt = $db->query("SELECT uid FROM {$tablepre}members LIMIT $current, $pertask");
	while($mem = $db->fetch_array($queryt)) {
		$processed = 1;
		$db->query("UPDATE {$tablepre}members SET credits=extcredits1 WHERE uid='$mem[uid]'");
	}
 
	if($processed) {
		cpmsg("$lang[counter_membercredits]: $lang[counter_processing]", $nextlink, 'loading');
	} else {
		cpmsg('counter_membercredits_succeed', $BASESCRIPT.'?action=counter', 'succeed');
	}

再查找:

showtablefooter();

在这行上面添加:

showtablerow('', array('class="td21"'), array(
    "$lang[counter_memberthreads]:",
    '<input name="pertask7" type="text" class="txt" value="1000" /><input type="submit" class="btn" name="memberthreadssubmit" onclick="this.form.pertask.value=this.form.pertask7.value" value="'.$lang['submit'].'" />'
));
showtablerow('', array('class="td21"'), array(
    "$lang[counter_memberextcredits1]:",
    '<input name="pertask8" type="text" class="txt" value="1000" /><input type="submit" class="btn" name="memberextcredits1submit" onclick="this.form.pertask.value=this.form.pertask7.value" value="'.$lang['submit'].'" />'
));
showtablerow('', array('class="td21"'), array(
    "$lang[counter_membercredits]:",
    '<input name="pertask9" type="text" class="txt" value="1000" /><input type="submit" class="btn" name="membercreditssubmit" onclick="this.form.pertask.value=this.form.pertask7.value" value="'.$lang['submit'].'" />'
));

打开 /bbs/templaters/default/admincp.lang.php ,查找:

'counter_moved_favorites_logs' => '清理收藏夹和日志数据',

在这行下面添加:

'counter_memberthreads' => '重建用户主题数',
'counter_memberextcredits1' => '重建用户经验',
'counter_membercredits' => '重建用户积分',

打开 /bbs/templates/default/admincp.msg.lang.php ,查找:

'counter_moved_favorites_logs_succeed' => '清理收藏夹和日志数据完成。',

在这行下面添加:

'counter_memberthreads_succeed' => '用户主题数重建完成。',
'counter_memberextcredits1_succeed' => '用户经验重建完成。',
'counter_membercredits_succeed' => '用户积分重建完成。',

4、重建用户积分

进入 后台管理 - 工具 - 更新论坛统计,依次执行:重建用户主题数、重建用户经验、重建用户积分。

5、显示:

在 后台管理 - 界面 - 用户主题版面 中勾选‘经验’‘主题’‘回复’显示在用户名下面。

6、验证:

在 后台管理 - 工具 - 数据库 - 升级 中打开‘开启所有版块主题回收站’功能,然后到论坛里发一个主题帖,再回复两次,接着看自己的各项积分数据是否正确,经验、主题、回复等。接下来删除一个回复,观察自己的‘回复’项和发帖总数是否少了一个,再删除整个主题,查看主题数和回复数的变化是否正确。最后从主题回收站中恢复该主题,查看各项积分数据是否正确,验证总帖数=主题+回复。可以再进行论坛搜索 - 高级 - 搜索作者:‘Fufu’ - 结果: 找到 “ Fufu” 相关主题 26 个,与积分数据吻合。

验证完毕,收工。

附,上面修改的代码都是按照我的需求来处理的,至于修改的 counter.inc.php 文件中用到的计算公式,由于刚接触 Discuz! 和 PHP,暂未深入研究在这里动态获取后台设置的积分公式,这里是手工写的。

extcredits1=extcredits8*5+extcredits7+digestposts*10