关于Yii验证码使用时刷新页面不变的情况,网上也有很多的解决方案,但是相对的都比较麻烦而且貌似实现中也有这样或者那样的问题,现在提供一个取巧的方法,就是在页面刷新时给验证码绑定click事件。代码如下:

1
2
3
4
5
6
7
8
9
10
<script type="text/javascript>
//临时应急方案
$(document).ready(function(){
var img = new Image;
img.onload=function(){
$('#captcha_img').trigger('click');
}
img.src = $('#captcha_img').attr('src');
});
</script>

因为Yii自带的验证码组件只提供了字母类的验证,现根据网络提供可以实现数字验证码的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class MyCaptchaAction extends CCaptchaAction {
const SESSION_VAR_PREFIX='Ext.MyCaptchaAction.';
public $minLength=4; //默认四位
public $maxLength=4; //默认四位

protected function generateVerifyCode()
{
if($this->minLength<3)
$this->minLength=3;
if($this->maxLength>20)
$this->maxLength=20;
if($this->minLength>$this->maxLength)
$this->maxLength=$this->minLength;
$length=rand($this->minLength,$this->maxLength);

$letters='1234567890';//此处可以去掉数字1和0避免和字母L和O混淆
$code='';
for($i=0;$i<$length;++$i)
{
$code.=$letters[rand(0,10)];
}

return $code;
}
}

放到 protected/extensions 目录

在配置文件 protected/config/main.php 中自动加载 extensions 目录的类

1
2
3
4
5
6
7
8
9
10
'import'=>array(
'application.models.*',
'application.components.*',
'application.extensions.*',
),

//使用:
'captcha'=>array(
'class'=>'application.extensions.MyCaptchaAction',
),