1、在controller中加入代码
(1)启用
<?php public function actions() { return array( // 启用验证码组件 'captcha'=>array( 'class'=>'CCaptchaAction', 'backColor'=>0xFFFFFF, 'maxLength'=>4, // 最多生成几个字符 'minLength'=>4, // 最少生成几个字符 'fixedVerifyCode' => substr(md5(time()),11,4), //每次都刷新验证码 ), ); } ?>
(2)添加进入规则
<?php array('allow', 'actions'=>array('captcha'), 'users'=>array('*'), ), ?>
2、在model中加入代码
(1)声明
<?php public $verifyCode; ?>
(2)加入属性
<?php public function attributeLabels() { return array( 'verifyCode'=>'Verification Code', ); } ?>
(3)加入过滤规则
<?php array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')), ?>
3、在view中写代码
<?php if(CCaptcha::checkRequirements()): ?> <div class="row"> <?php echo $form->labelEx($model,'verifyCode'); ?> <div> <?php $this->widget('CCaptcha',array('showRefreshButton'=>false,'clickableImage'=>true,'imageOptions'=>array('alt'=>'点击换图','title'=>'点击换图','style'=>'cursor:pointer'))); ?> <?php echo $form->textField($model,'verifyCode'); ?> </div> <div class="hint">Please enter the letters as they are shown in the image above. <br/>Letters are not case-sensitive.</div> <?php echo $form->error($model,'verifyCode'); ?> </div> <?php endif; ?>
经过测试,老是报验证码错误,经过多方 查询
如果在 form中开启了,这两个
'enableAjaxValidation'=>true, 'enableClientValidation'=>true,
然后使用 'fixedVerifyCode' => substr(md5(time()),11,4),会导致这个问题发生
使用fixedverifycode是为了解决验证码在Yii页面刷新的时候不变的问题,但是加入这个后 开启了ajax验证,就会老是出现验证码错误的情况。经过搜索,找到了一个简单解决yii页面刷新,验证码不变的方案:
$(document).ready(function(){ var img = new Image; img.onload=function(){ $('#yw0').trigger('click'); } img.src = $('#yw0').attr('src'); });
后又发现,如果form开启ajax验证,这时,如果输入错了一次验证码,再继续输入,不刷新验证码的话,就会一直出现验证码错误的情况。 一般情况是因为在设置CCaptchaAction参数时,设置了testLimit(相同验证码出现的次数。默认为3。小于等于0的值意味着不限制)为1,或则小于3,这种情况下,相同的验证码只能出现一次,而用户如果开启了ajax验证的话,填写的时候ajax验证一次已达到上限1次,提交的时候再验证一次,他会判断是否大于了testLimit的值,第二次验证testLimit会加1,显然大于了1,这时会重新生成验证码,从而出现验证码老是不
解决办法:
'testLimit'=>999, //这里可以设置大一些,以免验证超过三次会出错.
经过总结可以在form中开启 'enableAjaxValidation'=>true,
'enableClientValidation'=>true, 并正常使用yii 验证码,需要以下设置:
controller:
return array( // captcha action renders the CAPTCHA image displayed on the contact page 'captcha'=>array( 'class'=>'CCaptchaAction', 'backColor'=>0xFFFFFF, 'maxLength'=>4, // 最多生成几个字符 'minLength'=>4, // 最少生成几个字符 'testLimit'=>999, ),);
model:
public $verifyCode; //声明verifycode存储验证码 public function rules() { return array( // username and password are required array('username, password', 'required'), // rememberMe needs to be a boolean array('rememberMe', 'boolean'), // password needs to be authenticated array('password', 'authenticate'), // verifyCode needs to be entered correctly array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()), //添加此验证规则,这是是验证验证码是否一致的,不需要额外的代码就通过这条规则验 证即可 );
views:
<?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array( 'id'=>'login-form', 'enableAjaxValidation'=>true, 'enableClientValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, ), )); ?> <?php if(CCaptcha::checkRequirements()): ?> <div class="row"> <div class="col-md-4"><?php echo $form->textField($model,'verifyCode',array('placeholder'=>'输入验证码')); ?></div> <div class="col-md-6"><?php $this->widget('CCaptcha',array('showRefreshButton'=>false,'clickableImage'=>true,'imageOptions'=>array('alt'=>'点击换图','title'=>'点击换图','style'=>'cursor:pointer;height:42px'))); ?></div> <?php echo $form->error($model,'verifyCode'); ?> </div> <?php endif; ?> <?php $this->endWidget(); ?> <script language="javascript"> $(document).ready(function(){ var img = new Image; img.onload=function(){ $('#yw0').trigger('click'); } img.src = $('#yw0').attr('src'); //这段js解决yii验证码不刷新 }); </script>