1)使用控制器来控制
views:
<tr> <td width="100"><?php echo $form->textField($model, 'captcha', array('class' => 'input_s', 'style' => '80px')); ?></td> <td width="110"><img id="captcha_img" src="<?php echo $this->createUrl('captcha/getPic') . '?' . rand(0, 99); ?>" style="cursor: pointer" title="看不清楚,点击换一张验证码" alt="验证码" onclick="change_captcha();" /></td> <td><a href="javascript:void(0);" style=" font-family:'宋体'; font-size:12px; color:#0065A9" onclick="change_captcha();">换一张</a></td> </tr>
点击换一张的js:
function change_captcha(){ $('#captcha_img').attr('src', "<?php echo $this->createUrl('captcha/getPic'); ?>?"+Math.floor(Math.random()*200+1)); $('#LoginForm_captcha').val(''); }
CaptchaController:
<?php /** * 验证码 */ class CaptchaController extends CController { public function actionGetPic(){ Yii::import("application.helpers.captcha.Captcha"); header("Content-type:image/png"); $captcha5 = new Captcha(); //@设置验证码宽度 $captcha5->setWidth(99); //@设置验证码高度 $captcha5->setHeight(30); //@设置字符个数 $captcha5->setTextNumber(4); //@设置字符颜色 //$captcha5->setFontColor('#ff9900'); //@设置字号大小 //$captcha5->setFontSize(25); //@设置字体 //$captcha5->setFontFamily('t1.ttf'); //@设置语言 //$captcha5->setTextLang('cn'); //@设置背景颜色 //$captcha5->setBgColor('#000000'); //@设置干扰点数量 $captcha5->setNoisePoint(100); //@设置干扰线数量 //$captcha5->setNoiseLine(10); //@设置是否扭曲 $captcha5->setDistortion(true); //@设置是否显示边框 $captcha5->setShowBorder(false); //输出验证码 $code = $captcha5->createImage(); Yii::app()->session['captchaCode'] = array( 'content' => $code, //验证码的内容 'time' => time() //验证码的使用时间 ); exit; } }
//注意这里要引入包
将验证码作为一个登陆模型的属性:
<?php class LoginForm extends CFormModel { public $email; public $password; public $captcha; public $rememberMe = false; public $userInfo; public function rules() { return array( array('email, password, captcha', 'required', 'message' => '{attribute}不能为空'), array('captcha', 'checkCaptcha'), array('password', 'authenticate'), ); } public function checkCaptcha($attribute, $params) { if (!$this->hasErrors()) { $captcha = Yii::app()->session['captchaCode']; if (!isset($captcha['time']) || $captcha['time'] + 300 < time()) { $this->addError('captcha', '验证码过期。'); } else if (strtolower($captcha['content']) != strtolower($this->captcha)) { $this->addError('captcha', '验证码错误。'); } } } /** * 登陆验证 * @param type $attribute * @param type $params */ public function authenticate($attribute, $params) { if (!$this->hasErrors()) { $user = ComUser::model()->findByAttributes(array('email' => $this->email)); if ($user && $user->password == $user->hashPassword($this->password, $user->salt)) { if ($user->status == 1) { $this->userInfo = $user; unset(Yii::app()->session['captchaCode']); } else if ($user->status == 0) { $this->addError('email', '用户暂未审核通过。'); } else { $this->addError('email', '用户已被禁用。'); } } else { $this->addError('password', '账号或密码错误。'); } } } public function attributeLabels() { return array( 'email' => '用户名', 'password' => '密码', 'captcha' => '验证码', 'rememberMe' => '记住登陆' ); } }
2).使用yii的验证码物件(参数可自己调试):
1.把public $captcha加入管理员Model的一个属性
验证rule时:
array('username, password, captcha', 'required', 'on'=>'login'),
array('captcha', 'captcha', 'allowEmpty'=>!extension_loaded('gd'), 'on'=>'login'),
然后控制器实例化时要使用场景。
2.视图页面:
<dt>验证码</dt>
<dd> <?php echo $form->textField($model,'captcha', array('class'=>'input-password verify-code')); ?>
<?php $this->widget ( 'CCaptcha', array ('showRefreshButton' => true, 'clickableImage' => true, 'buttonType' => 'link', 'buttonLabel' => '换一张', 'imageOptions' => array ('alt' => '点击换图', 'align'=>'absmiddle' ) ) );?>
<?php echo $form->error($model,'captcha'); ?> </dd>
3.在控制器Controller.php
public function actions ()
{
return array ('captcha' => array ('class' => 'CCaptchaAction' , 'minLength' => 1 , 'maxLength' => 5 , 'backColor' => 0xFFFFFF , 'width' => 100 , 'height' => 40 ) );
}