RSS订阅天使二次元官方粉丝团
你现在的位置:首页 / 建站 / 正文

discuz3.3付费用户组永久有效期bug的解决方法

0 建站 | 2017年10月11日


论坛开了有段时间了,小号测试付费用户组的时候,发现到期后竟然还能继续使用,百度了一下才发现原来是陈年老bug,貌似从discuz2.X版本就有这个问题了。我已经写了3.2的教程,照着做了个遍也没效果,本来打算放弃了,结果晚上忽然有了重大发现。

小号切换用户组的时候,意外发现数据库里的用户组有效期竟然是错的。用户组有效期字段为pre_common_member表里的groupexpiry字段,在基本会员用户组的时候,默认是0,也就是永久的。第一次购买付费用户组时,groupexpiry字段会更新为用户组到期时间,也就是购买用户组的截止日期。但是,这个时候前台是没有自动切换为付费用户组的,还需要手动切换。关键问题就在这里,当你手动切换用户组的时候,groupexpiry字段会再次更新,变为0。为什么呢?因为你点的是切换用户组,那么后台就把用户组id修改一下,顺便把用户组到期时间也修改了一下,以保持一致。这逻辑本身是对的,但是问题在于并没有判断用户是否是第一次切换,也就是说,这次切换其实只是激活付费用户组而已,并不需要把用户组时间也更新掉。
其实说了这么多,导致这种情况的原因在于,购买用户组的时候并没有自动切换为新的用户组,但是却把用户组有效期先给更新了,这就造成后面的切换用户组刚好错过一拍,每次切换都是错的,付费用户组总是对应永久有效期。
问题清楚了,那么解决方案就有两种,一种是购买用户组的时候自动把用户切换为付费用户组,让用户组有效期跟用户组同步更新,并且还省去了用户的手动切换操作。另一种是购买用户组的时候,先不更新用户组有效期,反正手动切换用户组的时候会更新的,为什么还要先更新一波呢?
第一种看起来很合理,并且用户体验也好,但是用户组到期的时候,discuz是不会自动切换回以前的用户组的,也需要手动,如果要改就得一起改了才好,很有可能要涉及到更多的php代码,但是我又不会php,涉及的越多就越可能出错,还是算了。
第二种,无非就是找到购买时的逻辑代码,去掉一个用户组有效期的参数,不让它更新掉就可以了,明显简单的多。
找到source\include\spacecp\spacecp_usergroup.php文件,
将第97行左右的
C::t('common_member')->update($_G['uid'], array('groupexpiry' => $groupexpirynew, 'extgroupids' => $extgroupidsnew));
修改为:
C::t('common_member')->update($_G['uid'], array('extgroupids' => $extgroupidsnew));
可以看到,只是去掉了groupexpiry对应的参数。
再次声明,本方法适用于discuz3.3,其他版本请自行测试。

推荐您阅读更多有关于“ discuz   ”的文章

请填写你的在线分享代码
上一篇:discuz如何固定{$_G['siteurl']}(适用于X3.2 X3.3)

猜你喜欢

评论列表: