思维建筑经历了六年的波折,而今终于可以安安静静的生活、写博、谈情、说爱。

discuz用户组失效期过期后未自动失效

生活随笔 xipwh 295℃ 0评论

用户组自定义有效期到期后应该自动更改为失效所定义用户组,经数据库检查仍未改变。

网上搜索解决方式: 大家最后测试一下目前测试为过期用户自动登录后自动触发检测,失效后自动更改。

1、<em>没想到这个问题到了Discuz! X3了还没解决,不知道官方团队是没注意到这个问题,还是遇到了瓶颈,下面是我搜到的网上的教程,但大部分教程不是隐藏就是需要注册回复,转发到这儿,方便大家直接查阅。
修改文件:source/include/spacecp/spacecp_usergroup.php
找到代码:

 

  • $groupexpirynew = $groupterms[‘ext’][$groupid];

复制代码

替换为:

 

  • $groupexpirynew = $groupterms[‘ext’][$extgroupidsnew];

复制代码

找到代码:

 

  • $expirylist[$group[‘groupid’]][‘grouptitle’] = in_array($group[‘groupid’], $expgrouparray) ? ” : $group[‘grouptitle’];
  • }
  • }

复制代码

因为不同版本代码有变,所以如果搜不到全部,就只搜一下:

 

  • $expirylist[$group[‘groupid’]][‘grouptitle’]

复制代码

在这段代码下面(注意:一定是在两个大括号之后)添加:
<div class=”blockcode”><div id=”code_RSu”><ol>if($expgrouparray) {
$extgroupidarray = array();
foreach(explode(“t”, $_G[‘forum_extgroupids’]) as $extgroupid) {
if(($extgroupid = intval($extgroupid)) && !in_array($extgroupid, $expgrouparray)) {
$extgroupidarray[] = $extgroupid;
}
}
$groupidnew = $_G[‘groupid’];
$adminidnew = $_G[‘adminid’];
foreach($expgrouparray as $expgroupid) {
if($expgroupid == $_G[‘groupid’]) {
if(!empty($groupterms[‘main’][‘groupid’])) {
$groupidnew = $groupterms[‘main’][‘groupid’];
$adminidnew = $groupterms[‘main’][‘adminid’];
} else {
$groupidnew = DB::result_first(“SELECT groupid FROM”.DB::table(‘common_usergroup’).” WHERE type=’member’ AND'”.$_G[‘member’][‘credits’].”‘>=creditshigher AND’$credits’

2、

Discuz自从出现以来就是一个Bug坑,各种bug,虽然也有解决了的,但是还是有很多BUG官方都没有解决。就像这个用户组过期问题一样,过期后就不会自己切换回去。官方的态度就是,我们没有发现这个BUG啊。。废话,你们都不启用这些东西的,怎么会知道BUG的存在!!!

言归正传,现在我们就来解决这用户组过期不能自动切换的问题。

就拿DiscuzX2.5作为例子,在N多人去官方论坛投诉后,官方最终加上了一段代码。但是随后都反映说这用户组过期问题还是存在,然后这个问题就这样存在着。。

在仔细看完了discuz论坛的整个代码后发现,官方给出的代码大部分是没有错误的,但是有一个致命的问题写错了,导致不能正常过期。

下面我们就来修改这个bug。首先我们要找到打开source\include\spacecp\spacecp_usergroup.php这个文件,找到299行左右,

foreach(explode("\t", $_G['forum_extgroupids']) as $extgroupid) {

修改为

foreach(explode("\t", $_G['member']['extgroupids']) as $extgroupid) {

修改完后,以后的用户组过期就会得到解决。

如果你以前就有很多的过期用户想清理掉怎么办呢?这个的要修改source\class\discuz\discuz_application.php这个文件了。
原理就是在用户今日论坛的时候自动检测一下是否过期,如果过期就自动切换到原来的用户组上去。

打开discuz_application.php文件,大概在433行左右,找到

if($user && $user['groupexpiry'] > 0 && $user['groupexpiry'] < TIMESTAMP && (getgpc('mod') != 'spacecp' || CURSCRIPT != 'home')) {

在他上面添加内容并重写成一下的代码

			$groupterms = unserialize(DB::result_first("SELECT groupterms FROM ".DB::table('common_member_field_forum')." WHERE uid='".getglobal('uid', 'member')."'"));
			$termsarray = array();
			if(!empty($groupterms['ext']) && is_array($groupterms['ext'])) {
				$termsarray = $groupterms['ext'];
		}
			if(!empty($groupterms['main']['time']) && (empty($termsarray[$_G['groupid']]) || $termsarray[$_G['groupid']] > $groupterm['main']['time'])) {
				$termsarray[$_G['groupid']] = $groupterms['main']['time'];
			}

			foreach($termsarray as $expgroupid => $expiry) {
				if($expiry <= TIMESTAMP) {
					$user_expiry = 1;
				}
			}

			if($user && (( $user['groupexpiry'] > 0 && $user['groupexpiry'] < TIMESTAMP) || $user_expiry == 1) && (getgpc('mod') != 'spacecp' || CURSCRIPT != 'home')) {
 				dheader('location: home.php?mod=spacecp&ac=usergroup&do=expiry');
 			}

转载请注明:思维建筑 » discuz用户组失效期过期后未自动失效

喜欢 (1)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址