其实就是如果你现在积分不够,dz还是会扣积分,只不过你的积分就成负的了,并且可以继续扣,其实本身就没啥意思了这样。当然系统操作,一般不会有这样的bug,但是很多插件没有自己判断的话,那就不好说了。其实我们可以自己修改dz源码来实现积分不能为负,直接上代码吧。
找到source\class\table\table_common_member_count.php文件,里面有个increase函数,这个是最底层的修改积分的方法,其实都是一些数据信息的修改,我们常用的updatemembercount函数最后也是调用increase函数。
修改前的函数代码:
public function increase($uids, $creditarr) {
$uids = dintval((array)$uids, true);
$sql = array();
$allowkey = array('extcredits1', 'extcredits2', 'extcredits3', 'extcredits4', 'extcredits5', 'extcredits6', 'extcredits7', 'extcredits8',
'friends', 'posts', 'threads', 'oltime', 'digestposts', 'doings', 'blogs', 'albums', 'sharings', 'attachsize', 'views',
'todayattachs', 'todayattachsize', 'follower', 'following', 'newfollower', 'feeds', 'blacklist');
foreach($creditarr as $key => $value) {
if(($value = intval($value)) && $value && in_array($key, $allowkey)) {
$sql[] = "`$key`=`$key`+'$value'";
}
}
if(!empty($sql)){
DB::query("UPDATE ".DB::table($this->_table)." SET ".implode(',', $sql)." WHERE uid IN (".dimplode($uids).")", 'UNBUFFERED');
$this->increase_cache($uids, $creditarr);
}
}
修改后的函数代码:
public function increase($uids, $creditarr) {
$uids = dintval((array)$uids, true);
$sql = array();
$allowkey = array('extcredits1', 'extcredits2', 'extcredits3', 'extcredits4', 'extcredits5', 'extcredits6', 'extcredits7', 'extcredits8',
'friends', 'posts', 'threads', 'oltime', 'digestposts', 'doings', 'blogs', 'albums', 'sharings', 'attachsize', 'views',
'todayattachs', 'todayattachsize', 'follower', 'following', 'newfollower', 'feeds', 'blacklist');
foreach($creditarr as $key => $value) {
if(($value = intval($value)) && $value && in_array($key, $allowkey)) {
// 判断是否是积分操作,并且是减积分操作
if($value < 0 && in_array($key, array('extcredits1', 'extcredits2', 'extcredits3', 'extcredits4', 'extcredits5', 'extcredits6', 'extcredits7', 'extcredits8'))) {
foreach($uids as $tmpuid) {
$rs = DB::result_first("select {$key} from %t where uid = %d", array('common_member_count', $tmpuid));
if(intval($rs) - abs($value) >= 0) { // 如果用户目前的积分减去将要扣的积分>0,则执行,否则不执行
$sql[] = "`$key`=`$key`+'$value'";
}
}
} else {
$sql[] = "`$key`=`$key`+'$value'";
}
$sql[] = "`$key`=`$key`+'$value'";
}
}
if(!empty($sql)){
DB::query("UPDATE ".DB::table($this->_table)." SET ".implode(',', $sql)." WHERE uid IN (".dimplode($uids).")", 'UNBUFFERED');
$this->increase_cache($uids, $creditarr);
}
}
其实就是在用户减积分的时候判断下,如果减积分后值小于0,就不减。
这是客户的一个需求,不是每个站长都会有这样的需求的,记录下来,希望能帮到站长!
硬汉工作室的Discuz应用商店,海量实用小插件:http://addon.discuz.com/?@56030.developer