DZ内置了验证码了体系了,如果我们再自己写验证码,就太重复造轮子了。下面就讲下dz内置验证码在插件里面的调用方法(整理和参考自dz官方帮助文档)
首先说下我在写插件的时候遇到的一个问题,那就是,至少在dzx1.5,如果后台没有启用注册/登录/发帖...这五项里面的任意一项的话,系统的验证码输入框和输入提示能显示,但是显示不了验证码图片。因为验证码图片是通过js远程调用misc生成的。而misc的seccode模块做了检查,如果没有后台没有启用任何验证码的话,就不返回验证码图片(节约资源考虑),还有就是环境中的$seccodecheck必须为TRUE,否则连输入框都不会出来。
目前有两种解决办法,一个是直接写dz的setting表开始注册验证码(svalue=1),然后updatecache使得setting生效.
[php]if(! $_G['setting']['seccodestatus']) {
@DB::update('common_setting', array('svalue' => '1'), array('skey' => 'seccodestatus'));
require_once libfile('function/cache');
updatecache('setting');
}[/php]
要么直接向系统settings缓存里面投毒,然后使用save_syscache保存结果,以便在misc调用seccode模块的时候能正确读取到虚假的设置。代码不贴了。
下面说说怎么在插件模板里面调用验证码显示
一般的dz验证码都是如下的格局。
验证码的模板是seccheck,使用的时候要{subtemplate common/seccheck}调用就可以了。不过在用之前,你可以预先格式化一下验证码的html格式,以获取和页面协调的现实效果。预格式化的变量是$sectpl
你可以直接在程序里面赋值好,也可以在模板里面使用eval赋值,但是我更加推崇在模板里面是一block来赋值。
12345678910 <!--{block sectpl}--><tr><th><sec></th><td><sec><p><sec></p></td></tr><!--{/block}-->
看到中间那三个<sec>了吧,分别就是代表了上图里面的1,2,3三个位置。你可以在这里面合理布局好html代码,使得他们和页面相协调。
好了,既然验证码显示了,怎么在服务器端进行校验呢?
其实就是常见的那个submitcheck函数,不过这次我们用它第三,第四个参数。
submitcheck('form_submit_name', 0, $seccodecheck, $secqaacheck)
如果$seccodecheck为true,submit就会对提交的数据中的验证码进行检查.他与另一个变量$secqaacheck都是现实验证码的条件之一。
当然,除了服务器端的验证,我们输入的时候产生的那个肖狗勾,也是一种验证,不过是js验证。。具体的过程可以看这里
http://x.discuz.net/thread-2132925-1-1.html