- 一种是通过cron 去每日定期访问某页,然后循环读取每个用户的过期日期,如果现在的日期比过期日期大的话,删除用户(或者是去掉此用户某个角色如角色Premium User);
- 第二种方法是通过在用户登录时候,做一个判断,是否现在的日期比过期日期大,如果是的话去掉此用户某个角色如角色Premium User。
此文是基于第二种方法的,因为第二种方法相对比较简单,那么该怎么做呢,我们的用rules模块做辅助,
首先我们通过hook_rules_condition_info() 这个hook 去增加一个能用于rules里面的条件:
1 2 3 4 5 6 7 8 9 10 11 | /** * Implementation of hook_rules_condition_info(). */ function thinkinpremium_rules_condition_info() { return array( 'thinkinpremium_condition_sp_validity' => array( 'label' => t( 'Subscription validity' ), 'base' => 'thinkinpremium_condition_sp_validity' , ), ); } |
然后再写一个与它对应的函数,此函数是在数据库中读取当前用户的过期日期,并且与当前日期做比较,如果当前日期大于过期日期,返回true,否则返回false:
1 2 3 4 5 6 7 8 9 10 | function thinkinpremium_condition_sp_validity(){ global $user ; $query =db_select( 'field_data_field_commerce_sp_validity' , 'v' )->fields( 'v' , array ( 'field_commerce_sp_validity_value' ))->execute()->fetchAssoc(); //判断当前日期是否大于有效期日期,如果大于,表示过期了。 if (time() > $query [ 'field_commerce_sp_validity_value' ]){ return true; } else { return false; } } |
好了,我们清空缓存,然后打开rules页面(admin/config/workflow/rules),我们新建一个rule叫Subscription validity,事件选择User has logged in,意思是当用户登录时候,然后在Conditions条件中,把我们刚刚代码实现的那个条件找出来并且选择它,确定,上面代码,我们定义了这个条件的名字也是叫Subscription validity,你可以很方便的找到它的。
最后是增加一个action(动作),这个动作,是移除当前一个角色,我们选Remove user role,然后值是Premium User。保存,最终的rule如图:
好了我们新建一个用户测试一下,我们新建用户 “猪跑啦”,并且在用户资料中设置过期时间为 2014-12-24(当前日期为2012-12-24),并且赋予它角色:Premium User。
第一次我们尝试直接登录,登录成功后,看看用户“猪跑啦”角色依然是有:Premium User。
第二次我们不直接登录,我们先用管理员,把它的用户过期时间改为 2012-12-11(当前日期为2012-12-24),角色依然有:Premium User,我们推出管理员账号后,再次用“猪跑啦”登录,如果没错的话,因为条件满足了当前日期大于过期日期,所以会触发事件:把这个用户所拥有的角色Premium User删除,所以登录成功后,猪跑啦将不再是Premium User,是不是这样呢?我们很简单的做一个验证就知道了,管理员查看一下猪跑啦用户,确实是不见了Premium User角色。
怎么样呢,rules是不是很简单?在两次登录中,系统做出了两次不同的动作。
当然,还可以有更多的尝试,这些就留给读者慢慢摸索了。