Discuz下积分策略的添加及策略限制的实现

转:http://www.zlnxn.com/discuz%E4%B8%8B%E7%A7%AF%E5%88%86%E7%AD%96%E7%95%A5%E7%9A%84%E6%B7%BB%E5%8A%A0%E5%8F%8A%E7%AD%96%E7%95%A5%E9%99%90%E5%88%B6%E7%9A%84%E5%AE%9E%E7%8E%B0/

最近新的项目主要是做一个积分&金币&勋章体系,是基于Discuz的二次开发,所以难免要去研究一下Discuz的积分体系。首先去看了一下后台的积分设置,有些积分策略通过简单的设置后就可以用,但是有若干项积分策略则需要自己添加,并实现策略的限制。添加并不难,直接在数据库里插入相应的数据即可,最关键的是策略限制的实现。这里简单介绍一下何为策略限制,比如DZ(Discuz)原有的积分策略里有这么一条:每天登录一次,积分+2,金钱+1,奖励的次数为10次,这就是一个完整的积分策略,策略限制就是:每天登录-如何判定每次登录是在同一天;奖励次数10次-如何控制这个次数。
     接下来就要深入到代码层面去跟踪分析,经过分析发现,策略限制的实现大概是这么一个思路:(1)从缓存文件中读取后台设置的积分策略(方法:loadcache(‘creditrule‘));(2)根据(1)得到的数组再从数据库中读出积分变化日志(方法:getrulelog());(3)根据(2)得到的结果开始实现积分策略的限制,该限制的实现主要通过switch($rule[‘cycletype‘])来控制分支走向,$rule[‘cycletype‘]也就是每个积分策略的周期类型,不同的周期的类型对应于不同的处理方式,每个积分策略动作的逻辑部分就是在这下面来实现。所以要新增一个积分策略,在数据库中添加完记录后,限制的实现就要在这个switch($rule[‘cycletype‘])控制语句下面来做,根据你所新增加的积分策略的周期类型,相应的增加case,然后在case下面实现所谓的限制(即:动作的逻辑部分)。
     下面主要讲一下积分策略里最重要的一个方法:execrule($action, $uid = 0, $needle = ‘‘, $coef = 1, $update = 1, $fid = 0),该方法位于/source/class/class_credit。参数:$action-积分的动作,比如每天登录对应$action=daylogin,如果需要新增加一个积分策略,名称为:连续5天登录,那么$action可以取为login_continuous;$uid-用户id,这个不用多说;$needle-基本上用不着;$coef-积分系数;$update-控制是否进行积分变化日志的写入以及积分变化的最终执行,一般情况下使用默认的就可以;$fid-论坛id,主要用来读取个别论坛的积分的相关限制,一般使用默认。该方法主要分三部分:(1)getrule(),读取后台设置的积分策略,结果返回的是一个数组$rule,数组中包含rulename,cycletype,cycletime,rewardnum以及extcredits1-extcredits8中的某几项等,目的有二:a.作为updatemembercount()最终执行积分变化的重要参数;b.为积分策略限制提供相关数据。(2)getrulelog(),读取积分变化日志,作为限制实现的前期准备工作,也包括最初的一些判定;(3)switch($rule[‘cycletype‘]),限制真正开始实现的位置,关于这个控制语句上面已做介过绍,这里就不详说,这个控制语句最终决定参数$updatecredit的值是true还是false,即能否执行积分变化的操作:updatecreditbyrule()。实质上最终实现积分变化的方法是:updatemembercount()。这里说一个小窍门,就是如果你的积分策略限制很简单,而且也不需要缓存,写入日志等等这些的话,完全可以直接绕开DZ复杂的处理流程,只需要准备好一个数组$rule和$uid,比如array(‘extcredits2‘=>1,‘extcredits8‘=>5),$uid=1,然后直接调用updatemembercount($rule,$uid)就可以完成积分变化的操作了。但是如果为了程序的执行效率,也为了方便查看和分析积分的变化,个人建议还是沿用DZ的处理流程比较好。另外有一点值得注意的是:在后台添加完积分策略后,一定要记得清一下缓存,否则调用getrule()就会出现问题,得不到正确的$rule。今天就是因为没注意到清缓存,才导致浪费了很多时间,当时相当的困惑,最后是一步一步的跟踪代码才找到了原因。
     在跟踪代码的时候利用die,exit,showmessage设置断点是不错的一种方式,另外建议大家使用ZEND 这个IDE作为开发工具,不仅因为它是IDE,还有一点比较重要:在跟踪代码的时候利用快捷键Ctrl和鼠标能够快速定位到下一个方法或者变量,具体操作方法是:先按下Ctrl然后用鼠标点击相关的方法或者变量就能够快速定位到了。这种方法对于像DZ这样一点儿注释也没有而且完全按照自己的产品思路封装起来的代码来说还是比较管用的。虽说DZ的代码读起来很恶心,没有注释,完全封装,不过还是有很多值得学习的地方,比如诸如缓存之类的东西,代码上的处理等等。最近因为项目和论坛业务的关系会比较多的接触DZ,希望能从中多学点有价值的东西,融为己用。
     综上所述就是如何在DZ下面新增一个积分策略的大概过程,阅读此文的童鞋,若有觉得不妥的地方还请不吝指正,互相学习,互相借鉴,共同进步。

时间: 2024-10-15 18:32:52

Discuz下积分策略的添加及策略限制的实现的相关文章

为Discuz! X3.2批量添加用户的python脚本

为Discuz! X3.2批量添加用户的python脚本 搭建了一个Discuz! X3.2环境用于工作,需要添加用户时没有找到合适的工具,虽然同事最终用按键精灵解决了问题,不过还是决定写一段代码留下来,也许用得上. 之所以是Python而不是PHP,只是最近在接触Python,发现在这种场合更加方便. 添加用户代码: # encoding: utf-8 ''' Created on 2015年7月1日 @author: ZhongPing ''' import urllib import ur

Redis的过期策略和内存淘汰策略

自己将Redis的过期策略和内存淘汰策略搞混淆了. Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间.Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理. 过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据,对内存很友好:但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量. 惰性过期:只有当访

使用 IAM 策略模拟器测试 IAM 策略

使用 IAM 策略模拟器,您可以通过以下方式对 IAM 和基于资源的策略进行测试和问题排查: 测试附加到您 AWS 账户中的 IAM 用户.组或角色的策略.如果多个策略附加到用户.组或角色,您可以测试所有策略,也可以选择单个策略进行测试.您可以测试为特定资源所选的策略允许或拒绝哪些操作. 测试附加到 AWS 资源(如 Amazon S3 存储桶.Amazon SQS 队列.Amazon SNS 主题或 Amazon S3 Glacier 文件库)的策略. 如果您的 AWS 账户是 AWS Org

五大常见算法策略——递归与分治策略

摘要:递归与分治策略是五大常见算法策略之一,分治策略的思想就是分而治之,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的解.而分治与递归很多情况下都是一起结合使用的,能发挥出奇效(1+1>2),这篇文章我们将先从递归说起,再逐渐向分治过渡,主要讲解方式是通过9个例题来说明问题的,问题都是根据难度由简到难,由浅入深,对递归与分治能有个大概的了解雏形,当然最重要还是要做大量练习才能掌握. 1.递归 我们第一次接触递归一般都是在初学C语

组策略限制添加用户作为服务登录导致ITAtomcat服务无法启动(log on as a service)

[故障类型]:ITA tomcat服务器无法启动. [关 键 词]:Logon as a service  作为服务登录  tomcat  loggeter [适用版本]:FusionCloud Solution V100R005C10/ FusionCloud Solution V100R005C20/ FusionCloud Solution V100R005C30 [问题现象]: ITA tomcat服务无法启动(loggeter服务也无法启动),在windows日志中发现有如下错误提示:

CentOS 7 firewalld详解,添加删除策略

CentOS7中firewall防火墙详解和配置,.xml服务配置详解 修改防火墙配置文件之前,需要对之前防火墙做好备份 重启防火墙后,需要确认防火墙状态和防火墙规则是否加载,若重启失败或规则加载失败,则所有请求都会被防火墙. 1.firewall-cmd --state #查看firewall的状态 firewall-cmd --list-all #查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略) firewall-cmd --list-all

【组策略】2.组策略安装

配置和管理组策略的工具 group policy management 不同的系统,细节过程可能会不同. windows vista和windows server 2008以及更高版本中包含此工具.否则需要安装RSAT. 对于域控制器将在升级服务器时添加. 需要添加Windows成员服务器. windows xp需要独立添加. 例如,在windows 8.1上,需要安装包含组策略管理工具的RSAT. 谷歌搜索:rsat windows 8.1 进入微软官网下载 注意所有默认配置,这在以后可能会成

组策略 之   调整 组策略的刷新间隔

位置: 编辑 "default domain policy"策略,找到   计算机配置------策略------管理模板:从本地计算机中检索的策略定义(ADMX文件)--------系统----------组策略---------找到 1.配置计算机的组策略的刷新间隔 2.设置域控制器的组策略刷新间隔

discuz后台管理模块添加

discuz后台添加管理菜单步骤: 涉及到的文件: admincp.php 后台入口文件 main.inc.php 定义后台界面模板显示文件 admincp.menu.lang.php 后台管理语言文件 menu.inc.php 后台界面菜单定义文件 1.在变量$action中声明 admincp.php 86行加入'menu_class_list'.'menu_teacher_list': in_array($action, array('home', 'settings', 'members