首先解决刷新页面不刷新验证码问题
通过分析源码,我们只需修改\yii\captcha\CaptchaAction
的 run()
方法中调用为 getVerifyCode(true) 便可解决问题,但是又不能修改源码,这时可以采取继承并重载的方法来实现了。
- 新建
backend/components/CaptchaAction.php
<?php
namespace backend\components;
use yii\web\Response;
class CaptchaAction extends \yii\captcha\CaptchaAction
{
/**
* 默认验证码刷新页面不会自动刷新
*/
public function run()
{
$this->setHttpHeaders();
\Yii::$app->response->format = Response::FORMAT_RAW;
return $this->renderImage($this->getVerifyCode(true));
}
}
- 在 SiteController 控制器中注册 CaptchaAction 方法:
public function actions()
{
return [
//默认验证码刷新页面不会自动刷新
'captcha' => [
'class' => 'backend\components\CaptchaAction',
'testLimit' => 1,
'maxLength' => 6,
'minLength' => 6,
'padding' => 1,
'height' => 50,
'width' => 140,
'offset' => 1,
],
];
}
然后解决点击验证码刷问题
只需要给验证码图片标签 添加 'onclick' => 'this.src=this.src+"&c="+Math.random();'
即可,其实其他框架中也一样。
<?= yii\captcha\Captcha::widget([
'name'=>'captchaimg',
'captchaAction'=>'site/captcha',
'imageOptions'=>[
'id'=>'captchaimg',
'title'=>'换一个',
'alt'=>'换一个',
'style'=>'cursor:pointer;',
// 添加点击事件
'onclick' => 'this.src=this.src+"&c="+Math.random();'
],
'template'=>'{image}'
]);?>