今天要使用yii验证码, 不过, 这个验证码是整站通用的, 也就是说, 有个表单的提交是使用ajax方式来提交, 整站, 不管在哪个地方, 都能点出来此窗口, 来提交信息
关于yii验证码, framework/web/widgets/captcha/CCaptcha.php里, 它源码里有这么一部分
>---protected function renderImage() >---{ >--->---if(!isset($this->imageOptions['id'])) >--->--->---$this->imageOptions['id']=$this->getId(); >--->---$url=$this->getController()->createUrl($this->captchaAction,array('v'=>uniqid())); >--->---$alt=isset($this->imageOptions['alt'])?$this->imageOptions['alt']:''; >--->---echo CHtml::image($url,$alt,$this->imageOptions); >---}
可以看得到, 它每个验证码的生成, 验证都是附着于当前控制器的, 所以, 对于整站通用的, 默认是行不通的.
换个思路, 既然知道ajax访问的路径, 那就修改默认的方法, 让其载入时, 都访问同一控制器, 可以把 framework/web/widgets/captcha/CCaptcha.php 这个文件复制一份, 放至项目下的 protected/widgets 目录下, 名字自己定, 我在这里定CommonCaptcha.php, 在配置文件 main.php 里设置自动导入(import)
<?php return array( 'import' => array( 'application.widgets.*', ), ); ?>
然后, 可以在复制过来的文件里搜索 'getController' , 不出意外的话, 是可以搜索到两个的.
第一个 $url=$this->getController()->createUrl($this->captchaAction,array('v'=>uniqid()));
可修改为 $url=Yii::app()->createUrl('/onlineService/captcha',array('v'=>uniqid()));
第二个 $url=$this->getController()->createUrl($this->captchaAction,array(CCaptchaAction::REFRESH_GET_VAR=>true));
可修改为 $url=Yii::app()->createUrl('/onlineService/captcha',array(CCaptchaAction::REFRESH_GET_VAR=>true));
也就是不使用获取的控制器, 而是指定控制器, 指定验证码的路径.
然后在控制器里, 就可以使用
$this->createAction('captcha')->getVerifyCode();
这句代码, 在onlineService控制器里获取验证码, 然后对比post过来的验证码, 就可以了, 这样, 也无需在model里再多加一个验证的参数了.
至此, 验证Ok