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

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

计算机网络 xipwh 41℃ 0评论

论坛开了有段时间了,小号测试付费用户组的时候,发现到期后竟然还能继续使用,百度了一下才发现原来是陈年老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,其他版本请自行测试。

 

文章转载自:天使粉丝团

仅仅为了保留参考使用避免后续丢失找不到

转载请注明:思维建筑 » 转载—discuz3.3付费用户组永久有效期bug的解决方法

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

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

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